blob: 5c70b8c12bbbb897e03f3ce1d23a369d206dab1c [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"));
279}
280
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000281TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000282 verifyFormat("x = (a) and (b);");
283 verifyFormat("x = (a) or (b);");
284 verifyFormat("x = (a) bitand (b);");
285 verifyFormat("x = (a) bitor (b);");
286 verifyFormat("x = (a) not_eq (b);");
287 verifyFormat("x = (a) and_eq (b);");
288 verifyFormat("x = (a) or_eq (b);");
289 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000290}
291
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000292//===----------------------------------------------------------------------===//
293// Tests for control statements.
294//===----------------------------------------------------------------------===//
295
Daniel Jaspercdd06622013-05-14 10:31:09 +0000296TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000297 verifyFormat("if (true)\n f();\ng();");
298 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000299 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000300
Daniel Jasper3a685df2013-05-16 12:12:21 +0000301 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000302 AllowsMergedIf.AlignEscapedNewlinesLeft = true;
Daniel Jasperced17f82013-01-16 15:44:34 +0000303 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
304 verifyFormat("if (a)\n"
305 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000306 " f();",
307 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000308 verifyFormat("{\n"
309 " if (a)\n"
310 " label:\n"
311 " f();\n"
312 "}",
313 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000314 verifyFormat("#define A \\\n"
315 " if (a) \\\n"
316 " label: \\\n"
317 " f()",
318 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000319 verifyFormat("if (a)\n"
320 " ;",
321 AllowsMergedIf);
322 verifyFormat("if (a)\n"
323 " if (b) return;",
324 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000325
Daniel Jasper3a685df2013-05-16 12:12:21 +0000326 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000327 " f();\n",
328 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000329 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000330 " f();",
331 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000332 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000333 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000334 "}",
335 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000336 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000337 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000338 "}",
339 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000340
341 AllowsMergedIf.ColumnLimit = 14;
342 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000343 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000344 " return;",
345 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000346
347 AllowsMergedIf.ColumnLimit = 13;
348 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000349}
350
Daniel Jasper3a685df2013-05-16 12:12:21 +0000351TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
352 FormatStyle AllowsMergedLoops = getLLVMStyle();
353 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
354 verifyFormat("while (true) continue;", AllowsMergedLoops);
355 verifyFormat("for (;;) continue;", AllowsMergedLoops);
356 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
357 verifyFormat("while (true)\n"
358 " ;",
359 AllowsMergedLoops);
360 verifyFormat("for (;;)\n"
361 " ;",
362 AllowsMergedLoops);
363 verifyFormat("for (;;)\n"
364 " for (;;) continue;",
365 AllowsMergedLoops);
366 verifyFormat("for (;;) // Can't merge this\n"
367 " continue;",
368 AllowsMergedLoops);
369 verifyFormat("for (;;) /* still don't merge */\n"
370 " continue;",
371 AllowsMergedLoops);
372}
373
Daniel Jasper17605d32014-05-14 09:33:35 +0000374TEST_F(FormatTest, FormatShortBracedStatements) {
375 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
376 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
377
378 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
379 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
380
381 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
382 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
383 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
384 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
385 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
386 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
387 verifyFormat("if (true) { //\n"
388 " f();\n"
389 "}",
390 AllowSimpleBracedStatements);
391 verifyFormat("if (true) {\n"
392 " f();\n"
393 " f();\n"
394 "}",
395 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000396 verifyFormat("if (true) {\n"
397 " f();\n"
398 "} else {\n"
399 " f();\n"
400 "}",
401 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000402
Daniel Jasperbd630732014-05-22 13:25:26 +0000403 verifyFormat("template <int> struct A2 {\n"
404 " struct B {};\n"
405 "};",
406 AllowSimpleBracedStatements);
407
Daniel Jasper17605d32014-05-14 09:33:35 +0000408 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
409 verifyFormat("if (true) {\n"
410 " f();\n"
411 "}",
412 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000413 verifyFormat("if (true) {\n"
414 " f();\n"
415 "} else {\n"
416 " f();\n"
417 "}",
418 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000419
420 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
421 verifyFormat("while (true) {\n"
422 " f();\n"
423 "}",
424 AllowSimpleBracedStatements);
425 verifyFormat("for (;;) {\n"
426 " f();\n"
427 "}",
428 AllowSimpleBracedStatements);
429}
430
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000431TEST_F(FormatTest, ParseIfElse) {
432 verifyFormat("if (true)\n"
433 " if (true)\n"
434 " if (true)\n"
435 " f();\n"
436 " else\n"
437 " g();\n"
438 " else\n"
439 " h();\n"
440 "else\n"
441 " i();");
442 verifyFormat("if (true)\n"
443 " if (true)\n"
444 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000445 " if (true)\n"
446 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000447 " } else {\n"
448 " g();\n"
449 " }\n"
450 " else\n"
451 " h();\n"
452 "else {\n"
453 " i();\n"
454 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000455 verifyFormat("void f() {\n"
456 " if (a) {\n"
457 " } else {\n"
458 " }\n"
459 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000460}
461
462TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000463 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000464 verifyFormat("if (a)\n"
465 " f();\n"
466 "else if (b)\n"
467 " g();\n"
468 "else\n"
469 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000470 verifyFormat("if (a) {\n"
471 " f();\n"
472 "}\n"
473 "// or else ..\n"
474 "else {\n"
475 " g()\n"
476 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000477
478 verifyFormat("if (a) {\n"
479 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
480 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
481 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000482 verifyFormat("if (a) {\n"
483 "} else if (\n"
484 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
485 "}",
486 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000487}
488
Daniel Jasperf7935112012-12-03 18:12:45 +0000489TEST_F(FormatTest, FormatsForLoop) {
490 verifyFormat(
491 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000492 " ++VeryVeryLongLoopVariable)\n"
493 " ;");
494 verifyFormat("for (;;)\n"
495 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000496 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000497 verifyFormat("for (;;) {\n"
498 " f();\n"
499 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000500 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000501
502 verifyFormat(
503 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
504 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000505 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000506
507 verifyFormat(
508 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000509 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000510 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
511 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000512 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000513 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
514 " I = FD->getDeclsInPrototypeScope().begin(),\n"
515 " E = FD->getDeclsInPrototypeScope().end();\n"
516 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000517 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
518 " I = Container.begin(),\n"
519 " E = Container.end();\n"
520 " I != E; ++I) {\n}",
521 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000522
Daniel Jasper48c62f92013-01-28 17:30:17 +0000523 verifyFormat(
524 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
525 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000526 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
527 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000528 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000529 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
530 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
531 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000532 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
533 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
534 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000535 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
536 " aaaaaaaaaa);\n"
537 " iter; ++iter) {\n"
538 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000539 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
540 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
541 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
542 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000543
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000544 FormatStyle NoBinPacking = getLLVMStyle();
545 NoBinPacking.BinPackParameters = false;
546 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
547 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
548 " aaaaaaaaaaaaaaaa,\n"
549 " aaaaaaaaaaaaaaaa,\n"
550 " aaaaaaaaaaaaaaaa);\n"
551 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
552 "}",
553 NoBinPacking);
554 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000555 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
556 " E = UnwrappedLines.end();\n"
557 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000558 " ++I) {\n}",
559 NoBinPacking);
Daniel Jasperf7935112012-12-03 18:12:45 +0000560}
561
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000562TEST_F(FormatTest, RangeBasedForLoops) {
563 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
564 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
565 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
566 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000567 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
568 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000569 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
570 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000571}
572
Daniel Jaspere1e43192014-04-01 12:55:11 +0000573TEST_F(FormatTest, ForEachLoops) {
574 verifyFormat("void f() {\n"
575 " foreach (Item *item, itemlist) {}\n"
576 " Q_FOREACH (Item *item, itemlist) {}\n"
577 " BOOST_FOREACH (Item *item, itemlist) {}\n"
578 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
579 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000580
581 // As function-like macros.
582 verifyFormat("#define foreach(x, y)\n"
583 "#define Q_FOREACH(x, y)\n"
584 "#define BOOST_FOREACH(x, y)\n"
585 "#define UNKNOWN_FOREACH(x, y)\n");
586
587 // Not as function-like macros.
588 verifyFormat("#define foreach (x, y)\n"
589 "#define Q_FOREACH (x, y)\n"
590 "#define BOOST_FOREACH (x, y)\n"
591 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000592}
593
Daniel Jasperf7935112012-12-03 18:12:45 +0000594TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000595 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000596 verifyFormat("while (true)\n"
597 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000598 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000599 verifyFormat("while () {\n"
600 " f();\n"
601 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000602}
603
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000604TEST_F(FormatTest, FormatsDoWhile) {
605 verifyFormat("do {\n"
606 " do_something();\n"
607 "} while (something());");
608 verifyFormat("do\n"
609 " do_something();\n"
610 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000611}
612
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000613TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000614 verifyFormat("switch (x) {\n"
615 "case 1:\n"
616 " f();\n"
617 " break;\n"
618 "case kFoo:\n"
619 "case ns::kBar:\n"
620 "case kBaz:\n"
621 " break;\n"
622 "default:\n"
623 " g();\n"
624 " break;\n"
625 "}");
626 verifyFormat("switch (x) {\n"
627 "case 1: {\n"
628 " f();\n"
629 " break;\n"
630 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000631 "case 2: {\n"
632 " break;\n"
633 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000634 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000635 verifyFormat("switch (x) {\n"
636 "case 1: {\n"
637 " f();\n"
638 " {\n"
639 " g();\n"
640 " h();\n"
641 " }\n"
642 " break;\n"
643 "}\n"
644 "}");
645 verifyFormat("switch (x) {\n"
646 "case 1: {\n"
647 " f();\n"
648 " if (foo) {\n"
649 " g();\n"
650 " h();\n"
651 " }\n"
652 " break;\n"
653 "}\n"
654 "}");
655 verifyFormat("switch (x) {\n"
656 "case 1: {\n"
657 " f();\n"
658 " g();\n"
659 "} break;\n"
660 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000661 verifyFormat("switch (test)\n"
662 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000663 verifyFormat("switch (x) {\n"
664 "default: {\n"
665 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000666 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000667 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000668 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000669 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000670 "// if 1, do f()\n"
671 "case 1:\n"
672 " f();\n"
673 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000674 verifyFormat("switch (x) {\n"
675 "case 1:\n"
676 " // Do amazing stuff\n"
677 " {\n"
678 " f();\n"
679 " g();\n"
680 " }\n"
681 " break;\n"
682 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000683 verifyFormat("#define A \\\n"
684 " switch (x) { \\\n"
685 " case a: \\\n"
686 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000687 " }",
688 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000689 verifyFormat("#define OPERATION_CASE(name) \\\n"
690 " case OP_name: \\\n"
691 " return operations::Operation##name\n",
692 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000693 verifyFormat("switch (x) {\n"
694 "case 1:;\n"
695 "default:;\n"
696 " int i;\n"
697 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000698
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000699 verifyGoogleFormat("switch (x) {\n"
700 " case 1:\n"
701 " f();\n"
702 " break;\n"
703 " case kFoo:\n"
704 " case ns::kBar:\n"
705 " case kBaz:\n"
706 " break;\n"
707 " default:\n"
708 " g();\n"
709 " break;\n"
710 "}");
711 verifyGoogleFormat("switch (x) {\n"
712 " case 1: {\n"
713 " f();\n"
714 " break;\n"
715 " }\n"
716 "}");
717 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000718 " ;");
719
720 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
721 " case OP_name: \\\n"
722 " return operations::Operation##name\n");
723 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
724 " // Get the correction operation class.\n"
725 " switch (OpCode) {\n"
726 " CASE(Add);\n"
727 " CASE(Subtract);\n"
728 " default:\n"
729 " return operations::Unknown;\n"
730 " }\n"
731 "#undef OPERATION_CASE\n"
732 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000733 verifyFormat("DEBUG({\n"
734 " switch (x) {\n"
735 " case A:\n"
736 " f();\n"
737 " break;\n"
738 " // On B:\n"
739 " case B:\n"
740 " g();\n"
741 " break;\n"
742 " }\n"
743 "});");
Daniel Jasper031e2402014-04-28 07:48:36 +0000744 verifyFormat("switch (a) {\n"
745 "case (b):\n"
746 " return;\n"
747 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000748
749 verifyFormat("switch (a) {\n"
750 "case some_namespace::\n"
751 " some_constant:\n"
752 " return;\n"
753 "}",
754 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000755}
756
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000757TEST_F(FormatTest, CaseRanges) {
758 verifyFormat("switch (x) {\n"
759 "case 'A' ... 'Z':\n"
760 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000761 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000762 " break;\n"
763 "}");
764}
765
Daniel Jasperb87899b2014-09-10 13:11:45 +0000766TEST_F(FormatTest, ShortCaseLabels) {
767 FormatStyle Style = getLLVMStyle();
768 Style.AllowShortCaseLabelsOnASingleLine = true;
769 verifyFormat("switch (a) {\n"
770 "case 1: x = 1; break;\n"
771 "case 2: return;\n"
772 "case 3:\n"
773 "case 4:\n"
774 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000775 "case 6: // comment\n"
776 " return;\n"
777 "case 7:\n"
778 " // comment\n"
779 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000780 "case 8:\n"
781 " x = 8; // comment\n"
782 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000783 "default: y = 1; break;\n"
784 "}",
785 Style);
786 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +0000787 "#if FOO\n"
788 "case 0: return 0;\n"
789 "#endif\n"
790 "}",
791 Style);
792 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000793 "case 1: {\n"
794 "}\n"
795 "case 2: {\n"
796 " return;\n"
797 "}\n"
798 "case 3: {\n"
799 " x = 1;\n"
800 " return;\n"
801 "}\n"
802 "case 4:\n"
803 " if (x)\n"
804 " return;\n"
805 "}",
806 Style);
807 Style.ColumnLimit = 21;
808 verifyFormat("switch (a) {\n"
809 "case 1: x = 1; break;\n"
810 "case 2: return;\n"
811 "case 3:\n"
812 "case 4:\n"
813 "case 5: return;\n"
814 "default:\n"
815 " y = 1;\n"
816 " break;\n"
817 "}",
818 Style);
819}
820
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000821TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000822 verifyFormat("void f() {\n"
823 " some_code();\n"
824 "test_label:\n"
825 " some_other_code();\n"
826 " {\n"
827 " some_more_code();\n"
828 " another_label:\n"
829 " some_more_code();\n"
830 " }\n"
831 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +0000832 verifyFormat("{\n"
833 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000834 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +0000835 " some_other_code();\n"
836 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000837 verifyFormat("{\n"
838 " some_code();\n"
839 "test_label:;\n"
840 " int i = 0;\n"
841 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000842}
843
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000844//===----------------------------------------------------------------------===//
845// Tests for comments.
846//===----------------------------------------------------------------------===//
847
848TEST_F(FormatTest, UnderstandsSingleLineComments) {
Daniel Jasper55213652013-03-22 10:01:29 +0000849 verifyFormat("//* */");
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000850 verifyFormat("// line 1\n"
851 "// line 2\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000852 "void f() {}\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000853
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000854 verifyFormat("void f() {\n"
855 " // Doesn't do anything\n"
856 "}");
Daniel Jasper185de242013-07-11 13:48:16 +0000857 verifyFormat("SomeObject\n"
858 " // Calling someFunction on SomeObject\n"
859 " .someFunction();");
Daniel Jaspera0407742014-02-11 10:08:11 +0000860 verifyFormat("auto result = SomeObject\n"
861 " // Calling someFunction on SomeObject\n"
862 " .someFunction();");
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000863 verifyFormat("void f(int i, // some comment (probably for i)\n"
864 " int j, // some comment (probably for j)\n"
Daniel Jasper942ee722013-01-13 16:10:20 +0000865 " int k); // some comment (probably for k)");
866 verifyFormat("void f(int i,\n"
867 " // some comment (probably for j)\n"
868 " int j,\n"
869 " // some comment (probably for k)\n"
870 " int k);");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000871
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000872 verifyFormat("int i // This is a fancy variable\n"
873 " = 5; // with nicely aligned comment.");
874
875 verifyFormat("// Leading comment.\n"
876 "int a; // Trailing comment.");
877 verifyFormat("int a; // Trailing comment\n"
878 " // on 2\n"
879 " // or 3 lines.\n"
880 "int b;");
881 verifyFormat("int a; // Trailing comment\n"
882 "\n"
883 "// Leading comment.\n"
884 "int b;");
885 verifyFormat("int a; // Comment.\n"
886 " // More details.\n"
887 "int bbbb; // Another comment.");
888 verifyFormat(
889 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
890 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // comment\n"
891 "int cccccccccccccccccccccccccccccc; // comment\n"
892 "int ddd; // looooooooooooooooooooooooong comment\n"
893 "int aaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
894 "int bbbbbbbbbbbbbbbbbbbbb; // comment\n"
895 "int ccccccccccccccccccc; // comment");
896
Daniel Jasper997b08c2013-01-18 09:19:33 +0000897 verifyFormat("#include \"a\" // comment\n"
898 "#include \"a/b/c\" // comment");
899 verifyFormat("#include <a> // comment\n"
900 "#include <a/b/c> // comment");
Daniel Jasper98857842013-10-30 13:54:53 +0000901 EXPECT_EQ("#include \"a\" // comment\n"
Manuel Klimek5c24cca2013-05-23 10:56:37 +0000902 "#include \"a/b/c\" // comment",
903 format("#include \\\n"
904 " \"a\" // comment\n"
905 "#include \"a/b/c\" // comment"));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000906
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000907 verifyFormat("enum E {\n"
908 " // comment\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000909 " VAL_A, // comment\n"
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000910 " VAL_B\n"
911 "};");
Daniel Jaspere25509f2012-12-17 11:29:41 +0000912
913 verifyFormat(
914 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000915 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment");
Daniel Jasperd8bb2db2013-01-09 09:33:39 +0000916 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
917 " // Comment inside a statement.\n"
918 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper4281c5a2014-10-07 14:45:34 +0000919 verifyFormat("SomeFunction(a,\n"
920 " // comment\n"
921 " b + x);");
922 verifyFormat("SomeFunction(a, a,\n"
923 " // comment\n"
924 " b + x);");
Daniel Jasper38396592013-02-06 15:23:09 +0000925 verifyFormat(
926 "bool aaaaaaaaaaaaa = // comment\n"
927 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
928 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Manuel Klimekc74d2922013-01-07 08:54:53 +0000929
Daniel Jasper525264c2013-02-13 19:25:54 +0000930 verifyFormat("int aaaa; // aaaaa\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000931 "int aa; // aaaaaaa",
932 getLLVMStyleWithColumns(20));
Daniel Jasper525264c2013-02-13 19:25:54 +0000933
Daniel Jasper304a9862013-01-21 22:49:20 +0000934 EXPECT_EQ("void f() { // This does something ..\n"
935 "}\n"
936 "int a; // This is unrelated",
937 format("void f() { // This does something ..\n"
938 " }\n"
939 "int a; // This is unrelated"));
Daniel Jasper251b3c92013-07-01 11:22:57 +0000940 EXPECT_EQ("class C {\n"
941 " void f() { // This does something ..\n"
942 " } // awesome..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000943 "\n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000944 " int a; // This is unrelated\n"
945 "};",
946 format("class C{void f() { // This does something ..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000947 " } // awesome..\n"
948 " \n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000949 "int a; // This is unrelated\n"
950 "};"));
Daniel Jasper304a9862013-01-21 22:49:20 +0000951
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000952 EXPECT_EQ("int i; // single line trailing comment",
Manuel Klimekc74d2922013-01-07 08:54:53 +0000953 format("int i;\\\n// single line trailing comment"));
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000954
955 verifyGoogleFormat("int a; // Trailing comment.");
Daniel Jasperddaa9be2013-01-29 19:41:55 +0000956
957 verifyFormat("someFunction(anotherFunction( // Force break.\n"
958 " parameter));");
Daniel Jaspera885dbe2013-02-05 09:34:14 +0000959
960 verifyGoogleFormat("#endif // HEADER_GUARD");
Daniel Jasperf79f9352013-02-06 22:04:05 +0000961
962 verifyFormat("const char *test[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +0000963 " // A\n"
964 " \"aaaa\",\n"
965 " // B\n"
966 " \"aaaaa\"};");
Daniel Jaspereef30492013-02-11 12:36:37 +0000967 verifyGoogleFormat(
968 "aaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +0000969 " aaaaaaaaaaaaaaaaaaaaaa); // 81_cols_with_this_comment");
Alexander Kornienkob1be9d62013-04-03 12:38:53 +0000970 EXPECT_EQ("D(a, {\n"
971 " // test\n"
972 " int a;\n"
973 "});",
974 format("D(a, {\n"
975 "// test\n"
976 "int a;\n"
977 "});"));
Manuel Klimekc5730802013-05-23 11:42:52 +0000978
979 EXPECT_EQ("lineWith(); // comment\n"
980 "// at start\n"
981 "otherLine();",
982 format("lineWith(); // comment\n"
983 "// at start\n"
984 "otherLine();"));
985 EXPECT_EQ("lineWith(); // comment\n"
Daniel Jasperbb37a2f2016-02-01 11:20:55 +0000986 "/*\n"
987 " * at start */\n"
988 "otherLine();",
989 format("lineWith(); // comment\n"
990 "/*\n"
991 " * at start */\n"
992 "otherLine();"));
993 EXPECT_EQ("lineWith(); // comment\n"
Manuel Klimekc5730802013-05-23 11:42:52 +0000994 " // at start\n"
995 "otherLine();",
996 format("lineWith(); // comment\n"
997 " // at start\n"
998 "otherLine();"));
Manuel Klimekb27375f2013-05-23 19:54:43 +0000999
1000 EXPECT_EQ("lineWith(); // comment\n"
1001 "// at start\n"
1002 "otherLine(); // comment",
1003 format("lineWith(); // comment\n"
1004 "// at start\n"
1005 "otherLine(); // comment"));
Manuel Klimek75ef31f2013-05-23 20:46:07 +00001006 EXPECT_EQ("lineWith();\n"
1007 "// at start\n"
1008 "otherLine(); // comment",
1009 format("lineWith();\n"
1010 " // at start\n"
1011 "otherLine(); // comment"));
1012 EXPECT_EQ("// first\n"
1013 "// at start\n"
1014 "otherLine(); // comment",
1015 format("// first\n"
1016 " // at start\n"
1017 "otherLine(); // comment"));
1018 EXPECT_EQ("f();\n"
1019 "// first\n"
1020 "// at start\n"
1021 "otherLine(); // comment",
1022 format("f();\n"
1023 "// first\n"
1024 " // at start\n"
1025 "otherLine(); // comment"));
Daniel Jasper0e93cdb2013-11-08 23:31:14 +00001026 verifyFormat("f(); // comment\n"
1027 "// first\n"
1028 "// at start\n"
1029 "otherLine();");
1030 EXPECT_EQ("f(); // comment\n"
1031 "// first\n"
1032 "// at start\n"
1033 "otherLine();",
1034 format("f(); // comment\n"
1035 "// first\n"
1036 " // at start\n"
1037 "otherLine();"));
1038 EXPECT_EQ("f(); // comment\n"
1039 " // first\n"
1040 "// at start\n"
1041 "otherLine();",
1042 format("f(); // comment\n"
1043 " // first\n"
1044 "// at start\n"
1045 "otherLine();"));
Daniel Jasper49532102015-01-07 14:00:11 +00001046 EXPECT_EQ("void f() {\n"
1047 " lineWith(); // comment\n"
1048 " // at start\n"
1049 "}",
1050 format("void f() {\n"
1051 " lineWith(); // comment\n"
1052 " // at start\n"
1053 "}"));
Benjamin Kramerdab50462016-01-11 16:27:16 +00001054 EXPECT_EQ("int xy; // a\n"
1055 "int z; // b",
1056 format("int xy; // a\n"
1057 "int z; //b"));
1058 EXPECT_EQ("int xy; // a\n"
1059 "int z; // bb",
1060 format("int xy; // a\n"
1061 "int z; //bb",
1062 getLLVMStyleWithColumns(12)));
Daniel Jasper66935022014-04-27 10:03:19 +00001063
Daniel Jaspera44991332015-04-29 13:06:49 +00001064 verifyFormat("#define A \\\n"
1065 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1066 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1067 getLLVMStyleWithColumns(60));
Daniel Jasper66935022014-04-27 10:03:19 +00001068 verifyFormat(
1069 "#define A \\\n"
1070 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1071 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1072 getLLVMStyleWithColumns(61));
Daniel Jasper8acf8222014-05-07 09:23:05 +00001073
1074 verifyFormat("if ( // This is some comment\n"
1075 " x + 3) {\n"
1076 "}");
1077 EXPECT_EQ("if ( // This is some comment\n"
1078 " // spanning two lines\n"
1079 " x + 3) {\n"
1080 "}",
1081 format("if( // This is some comment\n"
1082 " // spanning two lines\n"
1083 " x + 3) {\n"
1084 "}"));
Daniel Jasper9b79efb2015-01-19 11:49:32 +00001085
1086 verifyNoCrash("/\\\n/");
1087 verifyNoCrash("/\\\n* */");
Daniel Jasper62c78f52015-05-06 08:58:57 +00001088 // The 0-character somehow makes the lexer return a proper comment.
1089 verifyNoCrash(StringRef("/*\\\0\n/", 6));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001090}
1091
Daniel Jasper14e58e52014-03-21 11:58:45 +00001092TEST_F(FormatTest, KeepsParameterWithTrailingCommentsOnTheirOwnLine) {
1093 EXPECT_EQ("SomeFunction(a,\n"
1094 " b, // comment\n"
1095 " c);",
1096 format("SomeFunction(a,\n"
1097 " b, // comment\n"
1098 " c);"));
Daniel Jasper28df0a32014-03-21 12:15:40 +00001099 EXPECT_EQ("SomeFunction(a, b,\n"
1100 " // comment\n"
1101 " c);",
1102 format("SomeFunction(a,\n"
1103 " b,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001104 " // comment\n"
Daniel Jasper28df0a32014-03-21 12:15:40 +00001105 " c);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001106 EXPECT_EQ("SomeFunction(a, b, // comment (unclear relation)\n"
1107 " c);",
1108 format("SomeFunction(a, b, // comment (unclear relation)\n"
1109 " c);"));
1110 EXPECT_EQ("SomeFunction(a, // comment\n"
1111 " b,\n"
1112 " c); // comment",
1113 format("SomeFunction(a, // comment\n"
1114 " b,\n"
1115 " c); // comment"));
1116}
1117
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001118TEST_F(FormatTest, RemovesTrailingWhitespaceOfComments) {
1119 EXPECT_EQ("// comment", format("// comment "));
1120 EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment",
1121 format("int aaaaaaa, bbbbbbb; // comment ",
1122 getLLVMStyleWithColumns(33)));
Alexander Kornienko9ab4a772013-09-06 17:24:54 +00001123 EXPECT_EQ("// comment\\\n", format("// comment\\\n \t \v \f "));
1124 EXPECT_EQ("// comment \\\n", format("// comment \\\n \t \v \f "));
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001125}
1126
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001127TEST_F(FormatTest, UnderstandsBlockComments) {
Nico Weber8084cff2013-06-26 00:15:19 +00001128 verifyFormat("f(/*noSpaceAfterParameterNamingComment=*/true);");
Daniel Jasper2b2c9672016-05-08 18:14:01 +00001129 verifyFormat("void f() { g(/*aaa=*/x, /*bbb=*/!y, /*c=*/::c); }");
Daniel Jasper38c82402013-11-29 09:27:43 +00001130 EXPECT_EQ("f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n"
1131 " bbbbbbbbbbbbbbbbbbbbbbbbb);",
1132 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \\\n"
1133 "/* Trailing comment for aa... */\n"
1134 " bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001135 EXPECT_EQ(
1136 "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1137 " /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);",
1138 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \n"
1139 "/* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper61a40782013-06-06 16:08:57 +00001140 EXPECT_EQ(
1141 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1142 " aaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001143 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001144 "}",
1145 format("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1146 " aaaaaaaaaaaaaaaaaa ,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001147 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001148 "}"));
Daniel Jasper99302ed2016-05-27 08:59:34 +00001149 verifyFormat("f(/* aaaaaaaaaaaaaaaaaa = */\n"
1150 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperddaa9be2013-01-29 19:41:55 +00001151
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00001152 FormatStyle NoBinPacking = getLLVMStyle();
1153 NoBinPacking.BinPackParameters = false;
1154 verifyFormat("aaaaaaaa(/* parameter 1 */ aaaaaa,\n"
1155 " /* parameter 2 */ aaaaaa,\n"
1156 " /* parameter 3 */ aaaaaa,\n"
1157 " /* parameter 4 */ aaaaaa);",
1158 NoBinPacking);
Daniel Jasper03b1bc72014-03-28 15:06:01 +00001159
1160 // Aligning block comments in macros.
1161 verifyGoogleFormat("#define A \\\n"
1162 " int i; /*a*/ \\\n"
1163 " int jjj; /*b*/");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001164}
1165
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001166TEST_F(FormatTest, AlignsBlockComments) {
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001167 EXPECT_EQ("/*\n"
1168 " * Really multi-line\n"
1169 " * comment.\n"
1170 " */\n"
1171 "void f() {}",
1172 format(" /*\n"
1173 " * Really multi-line\n"
1174 " * comment.\n"
1175 " */\n"
1176 " void f() {}"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001177 EXPECT_EQ("class C {\n"
1178 " /*\n"
1179 " * Another multi-line\n"
1180 " * comment.\n"
1181 " */\n"
1182 " void f() {}\n"
1183 "};",
1184 format("class C {\n"
1185 "/*\n"
1186 " * Another multi-line\n"
1187 " * comment.\n"
1188 " */\n"
1189 "void f() {}\n"
1190 "};"));
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001191 EXPECT_EQ("/*\n"
1192 " 1. This is a comment with non-trivial formatting.\n"
1193 " 1.1. We have to indent/outdent all lines equally\n"
1194 " 1.1.1. to keep the formatting.\n"
1195 " */",
1196 format(" /*\n"
1197 " 1. This is a comment with non-trivial formatting.\n"
1198 " 1.1. We have to indent/outdent all lines equally\n"
1199 " 1.1.1. to keep the formatting.\n"
1200 " */"));
1201 EXPECT_EQ("/*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001202 "Don't try to outdent if there's not enough indentation.\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001203 "*/",
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001204 format(" /*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001205 " Don't try to outdent if there's not enough indentation.\n"
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001206 " */"));
Manuel Klimek281dcbe2013-05-28 08:55:01 +00001207
1208 EXPECT_EQ("int i; /* Comment with empty...\n"
1209 " *\n"
1210 " * line. */",
1211 format("int i; /* Comment with empty...\n"
1212 " *\n"
1213 " * line. */"));
Alexander Kornienko67d9c8c2014-04-17 16:12:46 +00001214 EXPECT_EQ("int foobar = 0; /* comment */\n"
1215 "int bar = 0; /* multiline\n"
1216 " comment 1 */\n"
1217 "int baz = 0; /* multiline\n"
1218 " comment 2 */\n"
1219 "int bzz = 0; /* multiline\n"
1220 " comment 3 */",
1221 format("int foobar = 0; /* comment */\n"
1222 "int bar = 0; /* multiline\n"
1223 " comment 1 */\n"
1224 "int baz = 0; /* multiline\n"
1225 " comment 2 */\n"
1226 "int bzz = 0; /* multiline\n"
1227 " comment 3 */"));
1228 EXPECT_EQ("int foobar = 0; /* comment */\n"
1229 "int bar = 0; /* multiline\n"
1230 " comment */\n"
1231 "int baz = 0; /* multiline\n"
1232 "comment */",
1233 format("int foobar = 0; /* comment */\n"
1234 "int bar = 0; /* multiline\n"
1235 "comment */\n"
1236 "int baz = 0; /* multiline\n"
1237 "comment */"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001238}
1239
Daniel Jaspera0a50392015-12-01 13:28:53 +00001240TEST_F(FormatTest, CommentReflowingCanBeTurnedOff) {
1241 FormatStyle Style = getLLVMStyleWithColumns(20);
1242 Style.ReflowComments = false;
1243 verifyFormat("// aaaaaaaaa aaaaaaaaaa aaaaaaaaaa", Style);
1244 verifyFormat("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa */", Style);
1245}
1246
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001247TEST_F(FormatTest, CorrectlyHandlesLengthOfBlockComments) {
1248 EXPECT_EQ("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1249 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */",
1250 format("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1251 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */"));
Alexander Kornienkoaa620e12013-07-01 13:42:42 +00001252 EXPECT_EQ(
1253 "void ffffffffffff(\n"
1254 " int aaaaaaaa, int bbbbbbbb,\n"
1255 " int cccccccccccc) { /*\n"
1256 " aaaaaaaaaa\n"
1257 " aaaaaaaaaaaaa\n"
1258 " bbbbbbbbbbbbbb\n"
1259 " bbbbbbbbbb\n"
1260 " */\n"
1261 "}",
1262 format("void ffffffffffff(int aaaaaaaa, int bbbbbbbb, int cccccccccccc)\n"
1263 "{ /*\n"
1264 " aaaaaaaaaa aaaaaaaaaaaaa\n"
1265 " bbbbbbbbbbbbbb bbbbbbbbbb\n"
1266 " */\n"
1267 "}",
1268 getLLVMStyleWithColumns(40)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001269}
1270
Alexander Kornienko94042342013-07-16 23:47:22 +00001271TEST_F(FormatTest, DontBreakNonTrailingBlockComments) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00001272 EXPECT_EQ("void ffffffffff(\n"
1273 " int aaaaa /* test */);",
Alexander Kornienko94042342013-07-16 23:47:22 +00001274 format("void ffffffffff(int aaaaa /* test */);",
1275 getLLVMStyleWithColumns(35)));
1276}
1277
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001278TEST_F(FormatTest, SplitsLongCxxComments) {
1279 EXPECT_EQ("// A comment that\n"
1280 "// doesn't fit on\n"
1281 "// one line",
1282 format("// A comment that doesn't fit on one line",
1283 getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001284 EXPECT_EQ("/// A comment that\n"
1285 "/// doesn't fit on\n"
1286 "/// one line",
1287 format("/// A comment that doesn't fit on one line",
1288 getLLVMStyleWithColumns(20)));
1289 EXPECT_EQ("//! A comment that\n"
1290 "//! doesn't fit on\n"
1291 "//! one line",
1292 format("//! A comment that doesn't fit on one line",
1293 getLLVMStyleWithColumns(20)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00001294 EXPECT_EQ("// a b c d\n"
1295 "// e f g\n"
1296 "// h i j k",
Daniel Jaspera44991332015-04-29 13:06:49 +00001297 format("// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
1298 EXPECT_EQ(
1299 "// a b c d\n"
1300 "// e f g\n"
1301 "// h i j k",
1302 format("\\\n// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001303 EXPECT_EQ("if (true) // A comment that\n"
1304 " // doesn't fit on\n"
1305 " // one line",
1306 format("if (true) // A comment that doesn't fit on one line ",
1307 getLLVMStyleWithColumns(30)));
1308 EXPECT_EQ("// Don't_touch_leading_whitespace",
1309 format("// Don't_touch_leading_whitespace",
1310 getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001311 EXPECT_EQ("// Add leading\n"
1312 "// whitespace",
1313 format("//Add leading whitespace", getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001314 EXPECT_EQ("/// Add leading\n"
1315 "/// whitespace",
1316 format("///Add leading whitespace", getLLVMStyleWithColumns(20)));
1317 EXPECT_EQ("//! Add leading\n"
1318 "//! whitespace",
1319 format("//!Add leading whitespace", getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001320 EXPECT_EQ("// whitespace", format("//whitespace", getLLVMStyle()));
1321 EXPECT_EQ("// Even if it makes the line exceed the column\n"
1322 "// limit",
1323 format("//Even if it makes the line exceed the column limit",
1324 getLLVMStyleWithColumns(51)));
1325 EXPECT_EQ("//--But not here", format("//--But not here", getLLVMStyle()));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001326
1327 EXPECT_EQ("// aa bb cc dd",
1328 format("// aa bb cc dd ",
1329 getLLVMStyleWithColumns(15)));
1330
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001331 EXPECT_EQ("// A comment before\n"
1332 "// a macro\n"
1333 "// definition\n"
1334 "#define a b",
1335 format("// A comment before a macro definition\n"
1336 "#define a b",
1337 getLLVMStyleWithColumns(20)));
Daniel Jaspere068ac72014-10-27 17:13:59 +00001338 EXPECT_EQ("void ffffff(\n"
1339 " int aaaaaaaaa, // wwww\n"
1340 " int bbbbbbbbbb, // xxxxxxx\n"
1341 " // yyyyyyyyyy\n"
1342 " int c, int d, int e) {}",
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001343 format("void ffffff(\n"
1344 " int aaaaaaaaa, // wwww\n"
Daniel Jasper19a541e2013-12-19 16:45:34 +00001345 " int bbbbbbbbbb, // xxxxxxx yyyyyyyyyy\n"
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001346 " int c, int d, int e) {}",
1347 getLLVMStyleWithColumns(40)));
Alexander Kornienkob93062e2013-06-20 13:58:37 +00001348 EXPECT_EQ("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1349 format("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1350 getLLVMStyleWithColumns(20)));
Alexander Kornienko3abbb8a2013-11-12 17:30:49 +00001351 EXPECT_EQ(
1352 "#define XXX // a b c d\n"
1353 " // e f g h",
1354 format("#define XXX // a b c d e f g h", getLLVMStyleWithColumns(22)));
1355 EXPECT_EQ(
1356 "#define XXX // q w e r\n"
1357 " // t y u i",
1358 format("#define XXX //q w e r t y u i", getLLVMStyleWithColumns(22)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001359}
Manuel Klimek9043c742013-05-27 15:23:34 +00001360
Alexander Kornienko4504f932014-03-10 13:14:56 +00001361TEST_F(FormatTest, PreservesHangingIndentInCxxComments) {
1362 EXPECT_EQ("// A comment\n"
1363 "// that doesn't\n"
1364 "// fit on one\n"
1365 "// line",
1366 format("// A comment that doesn't fit on one line",
1367 getLLVMStyleWithColumns(20)));
1368 EXPECT_EQ("/// A comment\n"
1369 "/// that doesn't\n"
1370 "/// fit on one\n"
1371 "/// line",
1372 format("/// A comment that doesn't fit on one line",
1373 getLLVMStyleWithColumns(20)));
1374}
1375
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001376TEST_F(FormatTest, DontSplitLineCommentsWithEscapedNewlines) {
1377 EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1378 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1379 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1380 format("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1381 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1382 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
1383 EXPECT_EQ("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1384 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1385 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1386 format("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1387 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1388 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1389 getLLVMStyleWithColumns(50)));
1390 // FIXME: One day we might want to implement adjustment of leading whitespace
1391 // of the consecutive lines in this kind of comment:
Daniel Jasper4355e7f2014-07-09 07:50:33 +00001392 EXPECT_EQ("double\n"
1393 " a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1394 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1395 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1396 format("double a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1397 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1398 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001399 getLLVMStyleWithColumns(49)));
1400}
1401
Alexander Kornienkoce9161a2014-01-02 15:13:14 +00001402TEST_F(FormatTest, DontSplitLineCommentsWithPragmas) {
1403 FormatStyle Pragmas = getLLVMStyleWithColumns(30);
1404 Pragmas.CommentPragmas = "^ IWYU pragma:";
1405 EXPECT_EQ(
1406 "// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb",
1407 format("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas));
1408 EXPECT_EQ(
1409 "/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */",
1410 format("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas));
1411}
1412
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001413TEST_F(FormatTest, PriorityOfCommentBreaking) {
Daniel Jasper2739af32013-08-28 10:03:58 +00001414 EXPECT_EQ("if (xxx ==\n"
1415 " yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001416 " zzz)\n"
1417 " q();",
1418 format("if (xxx == yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
1419 " zzz) q();",
1420 getLLVMStyleWithColumns(40)));
1421 EXPECT_EQ("if (xxxxxxxxxx ==\n"
1422 " yyy && // aaaaaa bbbbbbbb cccc\n"
1423 " zzz)\n"
1424 " q();",
1425 format("if (xxxxxxxxxx == yyy && // aaaaaa bbbbbbbb cccc\n"
1426 " zzz) q();",
1427 getLLVMStyleWithColumns(40)));
1428 EXPECT_EQ("if (xxxxxxxxxx &&\n"
1429 " yyy || // aaaaaa bbbbbbbb cccc\n"
1430 " zzz)\n"
1431 " q();",
1432 format("if (xxxxxxxxxx && yyy || // aaaaaa bbbbbbbb cccc\n"
1433 " zzz) q();",
1434 getLLVMStyleWithColumns(40)));
Daniel Jasper19a541e2013-12-19 16:45:34 +00001435 EXPECT_EQ("fffffffff(\n"
1436 " &xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1437 " zzz);",
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001438 format("fffffffff(&xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1439 " zzz);",
1440 getLLVMStyleWithColumns(40)));
Manuel Klimek9043c742013-05-27 15:23:34 +00001441}
1442
1443TEST_F(FormatTest, MultiLineCommentsInDefines) {
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001444 EXPECT_EQ("#define A(x) /* \\\n"
1445 " a comment \\\n"
1446 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001447 " f();",
1448 format("#define A(x) /* \\\n"
1449 " a comment \\\n"
1450 " inside */ \\\n"
1451 " f();",
1452 getLLVMStyleWithColumns(17)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001453 EXPECT_EQ("#define A( \\\n"
1454 " x) /* \\\n"
1455 " a comment \\\n"
1456 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001457 " f();",
1458 format("#define A( \\\n"
1459 " x) /* \\\n"
1460 " a comment \\\n"
1461 " inside */ \\\n"
1462 " f();",
1463 getLLVMStyleWithColumns(17)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001464}
1465
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001466TEST_F(FormatTest, ParsesCommentsAdjacentToPPDirectives) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001467 EXPECT_EQ("namespace {}\n// Test\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001468 format("namespace {}\n // Test\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001469 EXPECT_EQ("namespace {}\n/* Test */\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001470 format("namespace {}\n /* Test */\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001471 EXPECT_EQ("namespace {}\n/* Test */ #define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001472 format("namespace {}\n /* Test */ #define A"));
1473}
1474
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001475TEST_F(FormatTest, SplitsLongLinesInComments) {
1476 EXPECT_EQ("/* This is a long\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001477 " * comment that\n"
1478 " * doesn't\n"
1479 " * fit on one line.\n"
1480 " */",
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001481 format("/* "
1482 "This is a long "
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001483 "comment that "
1484 "doesn't "
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001485 "fit on one line. */",
1486 getLLVMStyleWithColumns(20)));
Daniel Jaspera44991332015-04-29 13:06:49 +00001487 EXPECT_EQ(
1488 "/* a b c d\n"
1489 " * e f g\n"
1490 " * h i j k\n"
1491 " */",
1492 format("/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
1493 EXPECT_EQ(
1494 "/* a b c d\n"
1495 " * e f g\n"
1496 " * h i j k\n"
1497 " */",
1498 format("\\\n/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001499 EXPECT_EQ("/*\n"
1500 "This is a long\n"
1501 "comment that doesn't\n"
1502 "fit on one line.\n"
1503 "*/",
1504 format("/*\n"
1505 "This is a long "
1506 "comment that doesn't "
1507 "fit on one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001508 "*/",
1509 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001510 EXPECT_EQ("/*\n"
1511 " * This is a long\n"
1512 " * comment that\n"
1513 " * doesn't fit on\n"
1514 " * one line.\n"
1515 " */",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001516 format("/* \n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001517 " * This is a long "
1518 " comment that "
1519 " doesn't fit on "
1520 " one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001521 " */",
1522 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001523 EXPECT_EQ("/*\n"
1524 " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n"
1525 " * so_it_should_be_broken\n"
1526 " * wherever_a_space_occurs\n"
1527 " */",
1528 format("/*\n"
1529 " * This_is_a_comment_with_words_that_dont_fit_on_one_line "
1530 " so_it_should_be_broken "
1531 " wherever_a_space_occurs \n"
1532 " */",
1533 getLLVMStyleWithColumns(20)));
1534 EXPECT_EQ("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001535 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001536 " */",
1537 format("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001538 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001539 " */",
1540 getLLVMStyleWithColumns(20)));
1541 EXPECT_EQ("{\n"
1542 " /*\n"
1543 " This is another\n"
1544 " long comment that\n"
1545 " doesn't fit on one\n"
1546 " line 1234567890\n"
1547 " */\n"
1548 "}",
1549 format("{\n"
1550 "/*\n"
1551 "This is another "
1552 " long comment that "
1553 " doesn't fit on one"
1554 " line 1234567890\n"
1555 "*/\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001556 "}",
1557 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001558 EXPECT_EQ("{\n"
1559 " /*\n"
1560 " * This i s\n"
1561 " * another comment\n"
1562 " * t hat doesn' t\n"
1563 " * fit on one l i\n"
1564 " * n e\n"
1565 " */\n"
1566 "}",
1567 format("{\n"
1568 "/*\n"
1569 " * This i s"
1570 " another comment"
1571 " t hat doesn' t"
1572 " fit on one l i"
1573 " n e\n"
1574 " */\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001575 "}",
1576 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001577 EXPECT_EQ("/*\n"
1578 " * This is a long\n"
1579 " * comment that\n"
1580 " * doesn't fit on\n"
1581 " * one line\n"
1582 " */",
1583 format(" /*\n"
1584 " * This is a long comment that doesn't fit on one line\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001585 " */",
1586 getLLVMStyleWithColumns(20)));
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001587 EXPECT_EQ("{\n"
1588 " if (something) /* This is a\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001589 " long\n"
1590 " comment */\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001591 " ;\n"
1592 "}",
1593 format("{\n"
1594 " if (something) /* This is a long comment */\n"
1595 " ;\n"
1596 "}",
1597 getLLVMStyleWithColumns(30)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001598
1599 EXPECT_EQ("/* A comment before\n"
1600 " * a macro\n"
1601 " * definition */\n"
1602 "#define a b",
1603 format("/* A comment before a macro definition */\n"
1604 "#define a b",
1605 getLLVMStyleWithColumns(20)));
1606
1607 EXPECT_EQ("/* some comment\n"
1608 " * a comment\n"
1609 "* that we break\n"
1610 " * another comment\n"
1611 "* we have to break\n"
1612 "* a left comment\n"
1613 " */",
1614 format(" /* some comment\n"
1615 " * a comment that we break\n"
1616 " * another comment we have to break\n"
1617 "* a left comment\n"
1618 " */",
1619 getLLVMStyleWithColumns(20)));
1620
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00001621 EXPECT_EQ("/**\n"
1622 " * multiline block\n"
1623 " * comment\n"
1624 " *\n"
1625 " */",
1626 format("/**\n"
1627 " * multiline block comment\n"
1628 " *\n"
1629 " */",
1630 getLLVMStyleWithColumns(20)));
1631
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001632 EXPECT_EQ("/*\n"
1633 "\n"
1634 "\n"
1635 " */\n",
1636 format(" /* \n"
1637 " \n"
1638 " \n"
1639 " */\n"));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001640
1641 EXPECT_EQ("/* a a */",
1642 format("/* a a */", getLLVMStyleWithColumns(15)));
1643 EXPECT_EQ("/* a a bc */",
1644 format("/* a a bc */", getLLVMStyleWithColumns(15)));
1645 EXPECT_EQ("/* aaa aaa\n"
1646 " * aaaaa */",
1647 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
1648 EXPECT_EQ("/* aaa aaa\n"
1649 " * aaaaa */",
1650 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001651}
1652
1653TEST_F(FormatTest, SplitsLongLinesInCommentsInPreprocessor) {
1654 EXPECT_EQ("#define X \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001655 " /* \\\n"
1656 " Test \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001657 " Macro comment \\\n"
1658 " with a long \\\n"
1659 " line \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001660 " */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001661 " A + B",
1662 format("#define X \\\n"
1663 " /*\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001664 " Test\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001665 " Macro comment with a long line\n"
1666 " */ \\\n"
1667 " A + B",
1668 getLLVMStyleWithColumns(20)));
1669 EXPECT_EQ("#define X \\\n"
1670 " /* Macro comment \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001671 " with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001672 " line */ \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001673 " A + B",
1674 format("#define X \\\n"
1675 " /* Macro comment with a long\n"
1676 " line */ \\\n"
1677 " A + B",
1678 getLLVMStyleWithColumns(20)));
1679 EXPECT_EQ("#define X \\\n"
1680 " /* Macro comment \\\n"
1681 " * with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001682 " * line */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001683 " A + B",
1684 format("#define X \\\n"
1685 " /* Macro comment with a long line */ \\\n"
1686 " A + B",
1687 getLLVMStyleWithColumns(20)));
1688}
1689
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001690TEST_F(FormatTest, CommentsInStaticInitializers) {
1691 EXPECT_EQ(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001692 "static SomeType type = {aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
1693 " aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
1694 " /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
1695 " aaaaaaaaaaaaaaaaaaaa, // comment\n"
1696 " aaaaaaaaaaaaaaaaaaaa};",
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001697 format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa , /* comment */\n"
1698 " aaaaaaaaaaaaaaaaaaaa /* comment */ ,\n"
1699 " /* comment */ aaaaaaaaaaaaaaaaaaaa ,\n"
1700 " aaaaaaaaaaaaaaaaaaaa , // comment\n"
1701 " aaaaaaaaaaaaaaaaaaaa };"));
Chandler Carruthf8b72662014-03-02 12:37:31 +00001702 verifyFormat("static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1703 " bbbbbbbbbbb, ccccccccccc};");
1704 verifyFormat("static SomeType type = {aaaaaaaaaaa,\n"
1705 " // comment for bb....\n"
1706 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001707 verifyGoogleFormat(
Daniel Jaspere5777d22013-05-23 10:15:45 +00001708 "static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1709 " bbbbbbbbbbb, ccccccccccc};");
1710 verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n"
1711 " // comment for bb....\n"
1712 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001713
Chandler Carruthf8b72662014-03-02 12:37:31 +00001714 verifyFormat("S s = {{a, b, c}, // Group #1\n"
1715 " {d, e, f}, // Group #2\n"
1716 " {g, h, i}}; // Group #3");
1717 verifyFormat("S s = {{// Group #1\n"
1718 " a, b, c},\n"
1719 " {// Group #2\n"
1720 " d, e, f},\n"
1721 " {// Group #3\n"
1722 " g, h, i}};");
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001723
1724 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001725 " // Some comment\n"
1726 " a,\n"
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001727 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001728 " // Comment after empty line\n"
1729 " b}",
Daniel Jasperfb5e2412013-02-26 13:10:34 +00001730 format("S s = {\n"
1731 " // Some comment\n"
1732 " a,\n"
1733 " \n"
1734 " // Comment after empty line\n"
1735 " b\n"
1736 "}"));
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001737 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001738 " /* Some comment */\n"
1739 " a,\n"
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001740 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001741 " /* Comment after empty line */\n"
1742 " b}",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001743 format("S s = {\n"
1744 " /* Some comment */\n"
1745 " a,\n"
1746 " \n"
1747 " /* Comment after empty line */\n"
1748 " b\n"
1749 "}"));
Daniel Jaspera400cab2013-02-28 15:04:12 +00001750 verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001751 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1752 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1753 " 0x00, 0x00, 0x00, 0x00}; // comment\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001754}
1755
Alexander Kornienkof2e02122013-05-24 18:24:24 +00001756TEST_F(FormatTest, IgnoresIf0Contents) {
1757 EXPECT_EQ("#if 0\n"
1758 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
1759 "#endif\n"
1760 "void f() {}",
1761 format("#if 0\n"
1762 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
1763 "#endif\n"
1764 "void f( ) { }"));
1765 EXPECT_EQ("#if false\n"
1766 "void f( ) { }\n"
1767 "#endif\n"
1768 "void g() {}\n",
1769 format("#if false\n"
1770 "void f( ) { }\n"
1771 "#endif\n"
1772 "void g( ) { }\n"));
1773 EXPECT_EQ("enum E {\n"
1774 " One,\n"
1775 " Two,\n"
1776 "#if 0\n"
1777 "Three,\n"
1778 " Four,\n"
1779 "#endif\n"
1780 " Five\n"
1781 "};",
1782 format("enum E {\n"
1783 " One,Two,\n"
1784 "#if 0\n"
1785 "Three,\n"
1786 " Four,\n"
1787 "#endif\n"
1788 " Five};"));
1789 EXPECT_EQ("enum F {\n"
1790 " One,\n"
1791 "#if 1\n"
1792 " Two,\n"
1793 "#if 0\n"
1794 "Three,\n"
1795 " Four,\n"
1796 "#endif\n"
1797 " Five\n"
1798 "#endif\n"
1799 "};",
1800 format("enum F {\n"
1801 "One,\n"
1802 "#if 1\n"
1803 "Two,\n"
1804 "#if 0\n"
1805 "Three,\n"
1806 " Four,\n"
1807 "#endif\n"
1808 "Five\n"
1809 "#endif\n"
1810 "};"));
1811 EXPECT_EQ("enum G {\n"
1812 " One,\n"
1813 "#if 0\n"
1814 "Two,\n"
1815 "#else\n"
1816 " Three,\n"
1817 "#endif\n"
1818 " Four\n"
1819 "};",
1820 format("enum G {\n"
1821 "One,\n"
1822 "#if 0\n"
1823 "Two,\n"
1824 "#else\n"
1825 "Three,\n"
1826 "#endif\n"
1827 "Four\n"
1828 "};"));
1829 EXPECT_EQ("enum H {\n"
1830 " One,\n"
1831 "#if 0\n"
1832 "#ifdef Q\n"
1833 "Two,\n"
1834 "#else\n"
1835 "Three,\n"
1836 "#endif\n"
1837 "#endif\n"
1838 " Four\n"
1839 "};",
1840 format("enum H {\n"
1841 "One,\n"
1842 "#if 0\n"
1843 "#ifdef Q\n"
1844 "Two,\n"
1845 "#else\n"
1846 "Three,\n"
1847 "#endif\n"
1848 "#endif\n"
1849 "Four\n"
1850 "};"));
1851 EXPECT_EQ("enum I {\n"
1852 " One,\n"
1853 "#if /* test */ 0 || 1\n"
1854 "Two,\n"
1855 "Three,\n"
1856 "#endif\n"
1857 " Four\n"
1858 "};",
1859 format("enum I {\n"
1860 "One,\n"
1861 "#if /* test */ 0 || 1\n"
1862 "Two,\n"
1863 "Three,\n"
1864 "#endif\n"
1865 "Four\n"
1866 "};"));
1867 EXPECT_EQ("enum J {\n"
1868 " One,\n"
1869 "#if 0\n"
1870 "#if 0\n"
1871 "Two,\n"
1872 "#else\n"
1873 "Three,\n"
1874 "#endif\n"
1875 "Four,\n"
1876 "#endif\n"
1877 " Five\n"
1878 "};",
1879 format("enum J {\n"
1880 "One,\n"
1881 "#if 0\n"
1882 "#if 0\n"
1883 "Two,\n"
1884 "#else\n"
1885 "Three,\n"
1886 "#endif\n"
1887 "Four,\n"
1888 "#endif\n"
1889 "Five\n"
1890 "};"));
Alexander Kornienkof2e02122013-05-24 18:24:24 +00001891}
1892
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001893//===----------------------------------------------------------------------===//
1894// Tests for classes, namespaces, etc.
1895//===----------------------------------------------------------------------===//
1896
1897TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001898 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001899}
1900
1901TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1902 verifyFormat("class A {\n"
1903 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001904 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001905 "protected:\n"
1906 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001907 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001908 "};");
1909 verifyGoogleFormat("class A {\n"
1910 " public:\n"
1911 " protected:\n"
1912 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001913 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001914 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001915 verifyFormat("class A {\n"
1916 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001917 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001918 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001919 " void f2() {}\n"
1920 "protected slots:\n"
1921 " void f3() {}\n"
1922 "protected Q_SLOTS:\n"
1923 " void f4() {}\n"
1924 "private slots:\n"
1925 " void f5() {}\n"
1926 "private Q_SLOTS:\n"
1927 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001928 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001929 " void g1();\n"
1930 "Q_SIGNALS:\n"
1931 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001932 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001933
1934 // Don't interpret 'signals' the wrong way.
1935 verifyFormat("signals.set();");
1936 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001937 verifyFormat("{\n"
1938 " signals.set(); // This needs indentation.\n"
1939 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001940 verifyFormat("void f() {\n"
1941 "label:\n"
1942 " signals.baz();\n"
1943 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001944}
1945
Alexander Kornienkofd433362013-03-27 17:08:02 +00001946TEST_F(FormatTest, SeparatesLogicalBlocks) {
1947 EXPECT_EQ("class A {\n"
1948 "public:\n"
1949 " void f();\n"
1950 "\n"
1951 "private:\n"
1952 " void g() {}\n"
1953 " // test\n"
1954 "protected:\n"
1955 " int h;\n"
1956 "};",
1957 format("class A {\n"
1958 "public:\n"
1959 "void f();\n"
1960 "private:\n"
1961 "void g() {}\n"
1962 "// test\n"
1963 "protected:\n"
1964 "int h;\n"
1965 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001966 EXPECT_EQ("class A {\n"
1967 "protected:\n"
1968 "public:\n"
1969 " void f();\n"
1970 "};",
1971 format("class A {\n"
1972 "protected:\n"
1973 "\n"
1974 "public:\n"
1975 "\n"
1976 " void f();\n"
1977 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00001978
1979 // Even ensure proper spacing inside macros.
1980 EXPECT_EQ("#define B \\\n"
1981 " class A { \\\n"
1982 " protected: \\\n"
1983 " public: \\\n"
1984 " void f(); \\\n"
1985 " };",
1986 format("#define B \\\n"
1987 " class A { \\\n"
1988 " protected: \\\n"
1989 " \\\n"
1990 " public: \\\n"
1991 " \\\n"
1992 " void f(); \\\n"
1993 " };",
1994 getGoogleStyle()));
1995 // But don't remove empty lines after macros ending in access specifiers.
1996 EXPECT_EQ("#define A private:\n"
1997 "\n"
1998 "int i;",
1999 format("#define A private:\n"
2000 "\n"
2001 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00002002}
2003
Daniel Jasper83193602013-04-05 17:22:09 +00002004TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002005 verifyFormat("class A : public B {};");
2006 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002007
2008 verifyFormat(
2009 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002010 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00002011 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
2012 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002013 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002014 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002015 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002016 verifyFormat("class AAAAAAAAAAAA : public B,\n"
2017 " public C,\n"
2018 " public D,\n"
2019 " public E,\n"
2020 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002021 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00002022
2023 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002024 " ReallyReallyLongClassName {\n"
2025 " int i;\n"
2026 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00002027 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00002028 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
2029 " aaaaaaaaaaaaaaaa> {};");
2030 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
2031 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
2032 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00002033 verifyFormat("template <class R, class C>\n"
2034 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
2035 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00002036 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00002037}
2038
Manuel Klimek28cacc72013-01-07 18:10:23 +00002039TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002040 verifyFormat("class A {\n} a, b;");
2041 verifyFormat("struct A {\n} a, b;");
2042 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00002043}
2044
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002045TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002046 verifyFormat("enum {\n"
2047 " Zero,\n"
2048 " One = 1,\n"
2049 " Two = One + 1,\n"
2050 " Three = (One + Two),\n"
2051 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2052 " Five = (One, Two, Three, Four, 5)\n"
2053 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002054 verifyGoogleFormat("enum {\n"
2055 " Zero,\n"
2056 " One = 1,\n"
2057 " Two = One + 1,\n"
2058 " Three = (One + Two),\n"
2059 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2060 " Five = (One, Two, Three, Four, 5)\n"
2061 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002062 verifyFormat("enum Enum {};");
2063 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002064 verifyFormat("enum X E {} d;");
2065 verifyFormat("enum __attribute__((...)) E {} d;");
2066 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00002067 verifyFormat("enum {\n"
2068 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002069 "};",
2070 getLLVMStyleWithColumns(30));
2071
2072 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00002073 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002074
2075 EXPECT_EQ("enum KeepEmptyLines {\n"
2076 " ONE,\n"
2077 "\n"
2078 " TWO,\n"
2079 "\n"
2080 " THREE\n"
2081 "}",
2082 format("enum KeepEmptyLines {\n"
2083 " ONE,\n"
2084 "\n"
2085 " TWO,\n"
2086 "\n"
2087 "\n"
2088 " THREE\n"
2089 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00002090 verifyFormat("enum E { // comment\n"
2091 " ONE,\n"
2092 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00002093 "};\n"
2094 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002095 // Not enums.
2096 verifyFormat("enum X f() {\n"
2097 " a();\n"
2098 " return 42;\n"
2099 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00002100 verifyFormat("enum X Type::f() {\n"
2101 " a();\n"
2102 " return 42;\n"
2103 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002104 verifyFormat("enum ::X f() {\n"
2105 " a();\n"
2106 " return 42;\n"
2107 "}");
2108 verifyFormat("enum ns::X f() {\n"
2109 " a();\n"
2110 " return 42;\n"
2111 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002112}
2113
Daniel Jasperb7150872013-08-30 10:10:19 +00002114TEST_F(FormatTest, FormatsEnumsWithErrors) {
2115 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002116 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002117 " Two = 1;\n"
2118 "};");
2119 verifyFormat("namespace n {\n"
2120 "enum Type {\n"
2121 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002122 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002123 " int i;\n"
2124 "}\n"
2125 "void g() {}");
2126}
2127
Daniel Jasper2b41a822013-08-20 12:42:50 +00002128TEST_F(FormatTest, FormatsEnumStruct) {
2129 verifyFormat("enum struct {\n"
2130 " Zero,\n"
2131 " One = 1,\n"
2132 " Two = One + 1,\n"
2133 " Three = (One + Two),\n"
2134 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2135 " Five = (One, Two, Three, Four, 5)\n"
2136 "};");
2137 verifyFormat("enum struct Enum {};");
2138 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002139 verifyFormat("enum struct X E {} d;");
2140 verifyFormat("enum struct __attribute__((...)) E {} d;");
2141 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002142 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
2143}
2144
2145TEST_F(FormatTest, FormatsEnumClass) {
2146 verifyFormat("enum class {\n"
2147 " Zero,\n"
2148 " One = 1,\n"
2149 " Two = One + 1,\n"
2150 " Three = (One + Two),\n"
2151 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2152 " Five = (One, Two, Three, Four, 5)\n"
2153 "};");
2154 verifyFormat("enum class Enum {};");
2155 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002156 verifyFormat("enum class X E {} d;");
2157 verifyFormat("enum class __attribute__((...)) E {} d;");
2158 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002159 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
2160}
2161
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002162TEST_F(FormatTest, FormatsEnumTypes) {
2163 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002164 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002165 " B\n"
2166 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00002167 verifyFormat("enum X : int { A, B };");
2168 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002169}
2170
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002171TEST_F(FormatTest, FormatsNSEnums) {
2172 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2173 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2174 " // Information about someDecentlyLongValue.\n"
2175 " someDecentlyLongValue,\n"
2176 " // Information about anotherDecentlyLongValue.\n"
2177 " anotherDecentlyLongValue,\n"
2178 " // Information about aThirdDecentlyLongValue.\n"
2179 " aThirdDecentlyLongValue\n"
2180 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00002181 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2182 " a = 1,\n"
2183 " b = 2,\n"
2184 " c = 3,\n"
2185 "};");
2186 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2187 " a = 1,\n"
2188 " b = 2,\n"
2189 " c = 3,\n"
2190 "};");
2191 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2192 " a = 1,\n"
2193 " b = 2,\n"
2194 " c = 3,\n"
2195 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002196}
2197
Nico Weber7769a902013-01-14 05:49:49 +00002198TEST_F(FormatTest, FormatsBitfields) {
2199 verifyFormat("struct Bitfields {\n"
2200 " unsigned sClass : 8;\n"
2201 " unsigned ValueKind : 2;\n"
2202 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00002203 verifyFormat("struct A {\n"
2204 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2205 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2206 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00002207 verifyFormat("struct MyStruct {\n"
2208 " uchar data;\n"
2209 " uchar : 8;\n"
2210 " uchar : 8;\n"
2211 " uchar other;\n"
2212 "};");
Nico Weber7769a902013-01-14 05:49:49 +00002213}
2214
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002215TEST_F(FormatTest, FormatsNamespaces) {
2216 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002217 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002218 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002219 "}");
2220 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002221 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002222 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002223 "}");
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002224 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002225 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002226 "void f() { f(); }\n"
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002227 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002228 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002229 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002230 "void f() { f(); }");
Manuel Klimek046b9302013-02-06 16:08:09 +00002231
2232 // This code is more common than we thought; if we
2233 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002234 // its own line, which is undesirable.
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002235 verifyFormat("namespace {};");
Manuel Klimek046b9302013-02-06 16:08:09 +00002236 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002237 "class A {};\n"
Manuel Klimek046b9302013-02-06 16:08:09 +00002238 "};");
Daniel Jasper251b3c92013-07-01 11:22:57 +00002239
2240 verifyFormat("namespace {\n"
2241 "int SomeVariable = 0; // comment\n"
2242 "} // namespace");
2243 EXPECT_EQ("#ifndef HEADER_GUARD\n"
2244 "#define HEADER_GUARD\n"
2245 "namespace my_namespace {\n"
2246 "int i;\n"
2247 "} // my_namespace\n"
2248 "#endif // HEADER_GUARD",
2249 format("#ifndef HEADER_GUARD\n"
2250 " #define HEADER_GUARD\n"
2251 " namespace my_namespace {\n"
2252 "int i;\n"
2253 "} // my_namespace\n"
2254 "#endif // HEADER_GUARD"));
Daniel Jasper65ee3472013-07-31 23:16:02 +00002255
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00002256 EXPECT_EQ("namespace A::B {\n"
2257 "class C {};\n"
2258 "}",
2259 format("namespace A::B {\n"
2260 "class C {};\n"
2261 "}"));
2262
Daniel Jasper65ee3472013-07-31 23:16:02 +00002263 FormatStyle Style = getLLVMStyle();
2264 Style.NamespaceIndentation = FormatStyle::NI_All;
2265 EXPECT_EQ("namespace out {\n"
2266 " int i;\n"
2267 " namespace in {\n"
2268 " int i;\n"
2269 " } // namespace\n"
2270 "} // namespace",
2271 format("namespace out {\n"
2272 "int i;\n"
2273 "namespace in {\n"
2274 "int i;\n"
2275 "} // namespace\n"
2276 "} // namespace",
2277 Style));
2278
2279 Style.NamespaceIndentation = FormatStyle::NI_Inner;
2280 EXPECT_EQ("namespace out {\n"
2281 "int i;\n"
2282 "namespace in {\n"
2283 " int i;\n"
2284 "} // namespace\n"
2285 "} // namespace",
2286 format("namespace out {\n"
2287 "int i;\n"
2288 "namespace in {\n"
2289 "int i;\n"
2290 "} // namespace\n"
2291 "} // namespace",
2292 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002293}
2294
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002295TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00002296
Daniel Jasper40aacf42013-03-14 13:45:21 +00002297TEST_F(FormatTest, FormatsInlineASM) {
2298 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00002299 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00002300 verifyFormat(
2301 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2302 " \"cpuid\\n\\t\"\n"
2303 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00002304 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00002305 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00002306 EXPECT_EQ(
2307 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002308 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002309 " mov edx,[that] // vtable in edx\n"
2310 " mov eax,methodIndex\n"
2311 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002312 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002313 "}",
2314 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2315 " __asm {\n"
2316 " mov edx,[that] // vtable in edx\n"
2317 " mov eax,methodIndex\n"
2318 " call [edx][eax*4] // stdcall\n"
2319 " }\n"
2320 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00002321 EXPECT_EQ("_asm {\n"
2322 " xor eax, eax;\n"
2323 " cpuid;\n"
2324 "}",
2325 format("_asm {\n"
2326 " xor eax, eax;\n"
2327 " cpuid;\n"
2328 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00002329 verifyFormat("void function() {\n"
2330 " // comment\n"
2331 " asm(\"\");\n"
2332 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00002333 EXPECT_EQ("__asm {\n"
2334 "}\n"
2335 "int i;",
2336 format("__asm {\n"
2337 "}\n"
2338 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00002339}
2340
Nico Weberd5650bd2013-01-07 16:36:17 +00002341TEST_F(FormatTest, FormatTryCatch) {
2342 verifyFormat("try {\n"
2343 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002344 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002345 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002346 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002347 " exit(42);\n"
2348 "}");
2349
2350 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00002351 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002352 " return 5;\n"
2353 "}");
2354 verifyFormat("class A {\n"
2355 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002356 " A() try : a(0) {\n"
2357 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002358 " throw;\n"
2359 " }\n"
2360 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00002361
2362 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002363 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00002364}
2365
Nico Weberfac23712015-02-04 15:26:27 +00002366TEST_F(FormatTest, FormatSEHTryCatch) {
2367 verifyFormat("__try {\n"
2368 " int a = b * c;\n"
2369 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2370 " // Do nothing.\n"
2371 "}");
2372
2373 verifyFormat("__try {\n"
2374 " int a = b * c;\n"
2375 "} __finally {\n"
2376 " // Do nothing.\n"
2377 "}");
2378
2379 verifyFormat("DEBUG({\n"
2380 " __try {\n"
2381 " } __finally {\n"
2382 " }\n"
2383 "});\n");
2384}
2385
Daniel Jasper04a71a42014-05-08 11:58:24 +00002386TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2387 verifyFormat("try {\n"
2388 " f();\n"
2389 "} catch {\n"
2390 " g();\n"
2391 "}");
2392 verifyFormat("try {\n"
2393 " f();\n"
2394 "} catch (A a) MACRO(x) {\n"
2395 " g();\n"
2396 "} catch (B b) MACRO(x) {\n"
2397 " g();\n"
2398 "}");
2399}
2400
2401TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2402 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00002403 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2404 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00002405 Style.BreakBeforeBraces = BraceStyle;
2406 verifyFormat("try {\n"
2407 " // something\n"
2408 "} catch (...) {\n"
2409 " // something\n"
2410 "}",
2411 Style);
2412 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00002413 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2414 verifyFormat("try {\n"
2415 " // something\n"
2416 "}\n"
2417 "catch (...) {\n"
2418 " // something\n"
2419 "}",
2420 Style);
Nico Weberfac23712015-02-04 15:26:27 +00002421 verifyFormat("__try {\n"
2422 " // something\n"
2423 "}\n"
2424 "__finally {\n"
2425 " // something\n"
2426 "}",
2427 Style);
Nico Weber33381f52015-02-07 01:57:32 +00002428 verifyFormat("@try {\n"
2429 " // something\n"
2430 "}\n"
2431 "@finally {\n"
2432 " // something\n"
2433 "}",
2434 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002435 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2436 verifyFormat("try\n"
2437 "{\n"
2438 " // something\n"
2439 "}\n"
2440 "catch (...)\n"
2441 "{\n"
2442 " // something\n"
2443 "}",
2444 Style);
2445 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2446 verifyFormat("try\n"
2447 " {\n"
2448 " // something\n"
2449 " }\n"
2450 "catch (...)\n"
2451 " {\n"
2452 " // something\n"
2453 " }",
2454 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00002455 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2456 Style.BraceWrapping.BeforeCatch = true;
2457 verifyFormat("try {\n"
2458 " // something\n"
2459 "}\n"
2460 "catch (...) {\n"
2461 " // something\n"
2462 "}",
2463 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002464}
2465
Nico Weberd5650bd2013-01-07 16:36:17 +00002466TEST_F(FormatTest, FormatObjCTryCatch) {
Manuel Klimek2acb7b72013-01-11 19:17:44 +00002467 verifyFormat("@try {\n"
2468 " f();\n"
Nico Weber33381f52015-02-07 01:57:32 +00002469 "} @catch (NSException e) {\n"
Manuel Klimek2acb7b72013-01-11 19:17:44 +00002470 " @throw;\n"
Nico Weber33381f52015-02-07 01:57:32 +00002471 "} @finally {\n"
Manuel Klimek2acb7b72013-01-11 19:17:44 +00002472 " exit(42);\n"
2473 "}");
Nico Weber33381f52015-02-07 01:57:32 +00002474 verifyFormat("DEBUG({\n"
2475 " @try {\n"
2476 " } @finally {\n"
2477 " }\n"
2478 "});\n");
Nico Weberd5650bd2013-01-07 16:36:17 +00002479}
2480
Nico Weber45c48122015-06-28 01:06:16 +00002481TEST_F(FormatTest, FormatObjCAutoreleasepool) {
2482 FormatStyle Style = getLLVMStyle();
2483 verifyFormat("@autoreleasepool {\n"
2484 " f();\n"
2485 "}\n"
2486 "@autoreleasepool {\n"
2487 " f();\n"
2488 "}\n",
2489 Style);
2490 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2491 verifyFormat("@autoreleasepool\n"
2492 "{\n"
2493 " f();\n"
2494 "}\n"
2495 "@autoreleasepool\n"
2496 "{\n"
2497 " f();\n"
2498 "}\n",
2499 Style);
2500}
2501
Daniel Jaspere25509f2012-12-17 11:29:41 +00002502TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002503 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00002504
Daniel Jaspera44991332015-04-29 13:06:49 +00002505 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2506 " 100000000, "
2507 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00002508
Daniel Jasper473c62c2013-05-17 09:35:01 +00002509 // Here, everything other than the "}" would fit on a line.
2510 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002511 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002512 EXPECT_EQ("S s = {a,\n"
2513 "\n"
2514 " b};",
2515 format("S s = {\n"
2516 " a,\n"
2517 "\n"
2518 " b\n"
2519 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00002520
2521 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2522 // line. However, the formatting looks a bit off and this probably doesn't
2523 // happen often in practice.
2524 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002525 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00002526 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00002527}
2528
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002529TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002530 verifyFormat("const struct A a = {.a = 1, .b = 2};");
2531 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2532 " .bbbbbbbbbb = 2,\n"
2533 " .cccccccccc = 3,\n"
2534 " .dddddddddd = 4,\n"
2535 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002536 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002537 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2538 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2539 " .ccccccccccccccccccccccccccc = 3,\n"
2540 " .ddddddddddddddddddddddddddd = 4,\n"
2541 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002542
2543 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
2544}
2545
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002546TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002547 verifyFormat("static A x = {{{}}};\n");
2548 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2549 " {init1, init2, init3, init4}}};",
2550 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00002551
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002552 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002553 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2554 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2555 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2556 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00002557 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002558 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2559 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2560 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00002561 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2562 " {rect.fRight - rect.fLeft, rect.fBottom - "
2563 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002564
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002565 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00002566 "SomeArrayOfSomeType a = {\n"
2567 " {{1, 2, 3},\n"
2568 " {1, 2, 3},\n"
2569 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
2570 " 333333333333333333333333333333},\n"
2571 " {1, 2, 3},\n"
2572 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00002573 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00002574 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002575 " {{1, 2, 3}},\n"
2576 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002577 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2578 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002579 " {{1, 2, 3}},\n"
2580 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002581
Daniel Jaspera44991332015-04-29 13:06:49 +00002582 verifyFormat("struct {\n"
2583 " unsigned bit;\n"
2584 " const char *const name;\n"
2585 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2586 " {kOsWin, \"Windows\"},\n"
2587 " {kOsLinux, \"Linux\"},\n"
2588 " {kOsCrOS, \"Chrome OS\"}};");
2589 verifyFormat("struct {\n"
2590 " unsigned bit;\n"
2591 " const char *const name;\n"
2592 "} kBitsToOs[] = {\n"
2593 " {kOsMac, \"Mac\"},\n"
2594 " {kOsWin, \"Windows\"},\n"
2595 " {kOsLinux, \"Linux\"},\n"
2596 " {kOsCrOS, \"Chrome OS\"},\n"
2597 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002598}
2599
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002600TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2601 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2602 " \\\n"
2603 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2604}
2605
Daniel Jasperda16db32013-01-07 10:48:50 +00002606TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002607 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2608 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00002609
2610 // Do break defaulted and deleted functions.
2611 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2612 " default;",
2613 getLLVMStyleWithColumns(40));
2614 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2615 " delete;",
2616 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002617}
2618
2619TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2620 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2621 getLLVMStyleWithColumns(40));
2622 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2623 getLLVMStyleWithColumns(40));
2624 EXPECT_EQ("#define Q \\\n"
2625 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
2626 " \"aaaaaaaa.cpp\"",
2627 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2628 getLLVMStyleWithColumns(40)));
2629}
2630
2631TEST_F(FormatTest, UnderstandsLinePPDirective) {
2632 EXPECT_EQ("# 123 \"A string literal\"",
2633 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00002634}
2635
Manuel Klimek591b5802013-01-31 15:58:48 +00002636TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00002637 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00002638 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002639}
2640
2641TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2642 EXPECT_EQ("#line 42 \"test\"\n",
2643 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002644 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
2645 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002646}
2647
2648TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2649 EXPECT_EQ("#line 42 \"test\"",
2650 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002651 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002652}
2653
Daniel Jasper877615c2013-10-11 19:45:02 +00002654TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2655 verifyFormat("#define A \\x20");
2656 verifyFormat("#define A \\ x20");
2657 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
2658 verifyFormat("#define A ''");
2659 verifyFormat("#define A ''qqq");
2660 verifyFormat("#define A `qqq");
2661 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00002662 EXPECT_EQ("const char *c = STRINGIFY(\n"
2663 "\\na : b);",
2664 format("const char * c = STRINGIFY(\n"
2665 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00002666
2667 verifyFormat("a\r\\");
2668 verifyFormat("a\v\\");
2669 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00002670}
2671
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002672TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002673 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2674 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002675 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002676 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00002677 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00002678
2679 verifyFormat("#define A A\n#define A A");
2680 verifyFormat("#define A(X) A\n#define A A");
2681
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002682 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2683 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002684}
2685
2686TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002687 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002688 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002689 "#define A( \\\n"
2690 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002691 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002692 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002693 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002694 " #include \"a.h\"\n"
2695 "#define A(A,\\\n"
2696 " B)\n"
2697 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002698 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002699 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002700}
2701
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002702TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002703
2704TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2705 EXPECT_EQ("#define A \\\n"
2706 " c; \\\n"
2707 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002708 "f;",
2709 format("#define A c; e;\n"
2710 "f;",
2711 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002712}
2713
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002714TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002715
Manuel Klimek1abf7892013-01-04 23:34:14 +00002716TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002717 EXPECT_EQ("int x,\n"
2718 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002719 " y;",
2720 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002721}
2722
Manuel Klimek09e07972013-01-05 21:34:55 +00002723TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002724 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002725 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002726 verifyFormat("#define A \\\n"
2727 " { \\\n"
2728 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002729 " }",
2730 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002731
2732 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002733 " void function##X()",
2734 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002735
2736 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002737 " void a##b##c()",
2738 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002739
Daniel Jasper39825ea2013-01-14 15:40:57 +00002740 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002741}
2742
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002743TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002744 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2745 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002746}
2747
Manuel Klimek0c137952013-02-11 12:33:24 +00002748TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2749 EXPECT_EQ("#define A b;", format("#define A \\\n"
2750 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002751 " b;",
2752 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002753 EXPECT_EQ("#define A \\\n"
2754 " \\\n"
2755 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002756 " b;",
2757 format("#define A \\\n"
2758 " \\\n"
2759 " a; \\\n"
2760 " b;",
2761 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002762 EXPECT_EQ("#define A \\\n"
2763 " a; \\\n"
2764 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002765 " b;",
2766 format("#define A \\\n"
2767 " a; \\\n"
2768 " \\\n"
2769 " b;",
2770 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002771}
2772
Daniel Jasper00475962013-02-19 17:14:38 +00002773TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002774 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002775 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002776 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002777 " case 2\n",
2778 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002779 verifyFormat("#define MACRO(a) \\\n"
2780 " if (a) \\\n"
2781 " f(); \\\n"
2782 " else \\\n"
2783 " g()",
2784 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002785 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002786 verifyIncompleteFormat("#define STR(x) #x\n"
2787 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002788 verifyFormat("#pragma omp threadprivate( \\\n"
2789 " y)), // expected-warning",
2790 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002791 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002792 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002793 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002794 "#define b \\\n"
2795 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002796 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002797 "a",
2798 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002799 verifyFormat("#define A \\\n"
2800 " { \\\n"
2801 " {\n"
2802 "#define B \\\n"
2803 " } \\\n"
2804 " }",
2805 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002806 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002807 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002808 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002809 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002810}
2811
Daniel Jasper40e19212013-05-29 13:16:10 +00002812TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2813 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2814 EXPECT_EQ("class A : public QObject {\n"
2815 " Q_OBJECT\n"
2816 "\n"
2817 " A() {}\n"
2818 "};",
2819 format("class A : public QObject {\n"
2820 " Q_OBJECT\n"
2821 "\n"
2822 " A() {\n}\n"
2823 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002824 EXPECT_EQ("MACRO\n"
2825 "/*static*/ int i;",
2826 format("MACRO\n"
2827 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002828 EXPECT_EQ("SOME_MACRO\n"
2829 "namespace {\n"
2830 "void f();\n"
2831 "}",
2832 format("SOME_MACRO\n"
2833 " namespace {\n"
2834 "void f( );\n"
2835 "}"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002836 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002837 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2838 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002839 // Only if everything is upper case.
2840 EXPECT_EQ("class A : public QObject {\n"
2841 " Q_Object A() {}\n"
2842 "};",
2843 format("class A : public QObject {\n"
2844 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002845 " A() {\n}\n"
2846 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002847
2848 // Only if the next line can actually start an unwrapped line.
2849 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2850 format("SOME_WEIRD_LOG_MACRO\n"
2851 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002852
2853 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002854 "(n, buffers))\n",
2855 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002856}
2857
Alexander Kornienkode644272013-04-08 22:16:06 +00002858TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2859 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2860 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2861 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002862 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002863 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2864 "int *createScopDetectionPass() { return 0; }",
2865 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2866 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2867 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2868 " class X {};\n"
2869 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2870 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002871 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2872 // braces, so that inner block is indented one level more.
2873 EXPECT_EQ("int q() {\n"
2874 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2875 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2876 " IPC_END_MESSAGE_MAP()\n"
2877 "}",
2878 format("int q() {\n"
2879 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2880 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2881 " IPC_END_MESSAGE_MAP()\n"
2882 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002883
Daniel Jasper352dae12014-01-03 11:50:46 +00002884 // Same inside macros.
2885 EXPECT_EQ("#define LIST(L) \\\n"
2886 " L(A) \\\n"
2887 " L(B) \\\n"
2888 " L(C)",
2889 format("#define LIST(L) \\\n"
2890 " L(A) \\\n"
2891 " L(B) \\\n"
2892 " L(C)",
2893 getGoogleStyle()));
2894
Daniel Jasper545c6522013-09-17 09:26:07 +00002895 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002896 EXPECT_EQ("int q() {\n"
2897 " f(x);\n"
2898 " f(x) {}\n"
2899 " f(x)->g();\n"
2900 " f(x)->*g();\n"
2901 " f(x).g();\n"
2902 " f(x) = x;\n"
2903 " f(x) += x;\n"
2904 " f(x) -= x;\n"
2905 " f(x) *= x;\n"
2906 " f(x) /= x;\n"
2907 " f(x) %= x;\n"
2908 " f(x) &= x;\n"
2909 " f(x) |= x;\n"
2910 " f(x) ^= x;\n"
2911 " f(x) >>= x;\n"
2912 " f(x) <<= x;\n"
2913 " f(x)[y].z();\n"
2914 " LOG(INFO) << x;\n"
2915 " ifstream(x) >> x;\n"
2916 "}\n",
2917 format("int q() {\n"
2918 " f(x)\n;\n"
2919 " f(x)\n {}\n"
2920 " f(x)\n->g();\n"
2921 " f(x)\n->*g();\n"
2922 " f(x)\n.g();\n"
2923 " f(x)\n = x;\n"
2924 " f(x)\n += x;\n"
2925 " f(x)\n -= x;\n"
2926 " f(x)\n *= x;\n"
2927 " f(x)\n /= x;\n"
2928 " f(x)\n %= x;\n"
2929 " f(x)\n &= x;\n"
2930 " f(x)\n |= x;\n"
2931 " f(x)\n ^= x;\n"
2932 " f(x)\n >>= x;\n"
2933 " f(x)\n <<= x;\n"
2934 " f(x)\n[y].z();\n"
2935 " LOG(INFO)\n << x;\n"
2936 " ifstream(x)\n >> x;\n"
2937 "}\n"));
2938 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002939 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002940 " if (1) {\n"
2941 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002942 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002943 " while (1) {\n"
2944 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002945 " F(x)\n"
2946 " G(x);\n"
2947 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002948 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002949 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002950 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002951 " }\n"
2952 "}\n",
2953 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002954 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002955 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002956 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002957 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002958 "F(x)\n"
2959 "G(x);\n"
2960 "F(x)\n"
2961 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002962 "}\n"));
2963 EXPECT_EQ("class A {\n"
2964 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002965 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002966 " A(X x)\n" // FIXME: function-level try blocks are broken.
2967 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002968 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002969 " }\n"
2970 "};",
2971 format("class A {\n"
2972 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002973 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002974 " A(X x)\n"
2975 " try : t(0) {} catch (...) {}\n"
2976 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002977 EXPECT_EQ("class SomeClass {\n"
2978 "public:\n"
2979 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2980 "};",
2981 format("class SomeClass {\n"
2982 "public:\n"
2983 " SomeClass()\n"
2984 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2985 "};"));
2986 EXPECT_EQ("class SomeClass {\n"
2987 "public:\n"
2988 " SomeClass()\n"
2989 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2990 "};",
2991 format("class SomeClass {\n"
2992 "public:\n"
2993 " SomeClass()\n"
2994 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2995 "};",
2996 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002997
2998 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002999}
3000
Manuel Klimek4fe43002013-05-22 12:51:29 +00003001TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3002 verifyFormat("#define A \\\n"
3003 " f({ \\\n"
3004 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003005 " });",
3006 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00003007}
3008
Manuel Klimekef2cfb12013-01-05 22:14:16 +00003009TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
3010 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
3011}
3012
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003013TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003014 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003015}
3016
Manuel Klimek1058d982013-01-06 20:07:31 +00003017TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3018 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
3019 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3020 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
3021 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3022}
Manuel Klimek1abf7892013-01-04 23:34:14 +00003023
Daniel Jaspere2408e32015-05-06 11:16:43 +00003024TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003025 EXPECT_EQ(
3026 "#define A \\\n int i; \\\n int j;",
3027 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003028 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00003029 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003030 EXPECT_EQ("/* \\ \\ \\\n*/", format("\\\n/* \\ \\ \\\n*/"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00003031 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003032}
3033
Alexander Kornienko00691cf2015-01-12 13:11:12 +00003034TEST_F(FormatTest, DontCrashOnBlockComments) {
3035 EXPECT_EQ(
3036 "int xxxxxxxxx; /* "
3037 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n"
3038 "zzzzzz\n"
3039 "0*/",
3040 format("int xxxxxxxxx; /* "
3041 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n"
3042 "0*/"));
3043}
3044
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003045TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3046 verifyFormat("#define A \\\n"
3047 " int v( \\\n"
3048 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003049 " int i;",
3050 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003051}
3052
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003053TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00003054 EXPECT_EQ(
3055 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3056 " \\\n"
3057 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3058 "\n"
3059 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3060 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3061 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
3062 "\\\n"
3063 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3064 " \n"
3065 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3066 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003067}
3068
Manuel Klimek52b15152013-01-09 15:25:02 +00003069TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3070 EXPECT_EQ("int\n"
3071 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003072 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003073 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003074 verifyFormat("functionCallTo(\n"
3075 " someOtherFunction(\n"
3076 " withSomeParameters, whichInSequence,\n"
3077 " areLongerThanALine(andAnotherCall,\n"
3078 "#define A B\n"
3079 " withMoreParamters,\n"
3080 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003081 " andMoreParameters),\n"
3082 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003083 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003084 verifyFormat("Foo::Foo()\n"
3085 "#ifdef BAR\n"
3086 " : baz(0)\n"
3087 "#endif\n"
3088 "{\n"
3089 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003090 verifyFormat("void f() {\n"
3091 " if (true)\n"
3092 "#ifdef A\n"
3093 " f(42);\n"
3094 " x();\n"
3095 "#else\n"
3096 " g();\n"
3097 " x();\n"
3098 "#endif\n"
3099 "}");
3100 verifyFormat("void f(param1, param2,\n"
3101 " param3,\n"
3102 "#ifdef A\n"
3103 " param4(param5,\n"
3104 "#ifdef A1\n"
3105 " param6,\n"
3106 "#ifdef A2\n"
3107 " param7),\n"
3108 "#else\n"
3109 " param8),\n"
3110 " param9,\n"
3111 "#endif\n"
3112 " param10,\n"
3113 "#endif\n"
3114 " param11)\n"
3115 "#else\n"
3116 " param12)\n"
3117 "#endif\n"
3118 "{\n"
3119 " x();\n"
3120 "}",
3121 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003122 verifyFormat("#if 1\n"
3123 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003124 verifyFormat("#if 1\n"
3125 "#endif\n"
3126 "#if 1\n"
3127 "#else\n"
3128 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003129 verifyFormat("DEBUG({\n"
3130 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3131 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3132 "});\n"
3133 "#if a\n"
3134 "#else\n"
3135 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003136
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003137 verifyIncompleteFormat("void f(\n"
3138 "#if A\n"
3139 " );\n"
3140 "#else\n"
3141 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003142}
3143
Manuel Klimek14bd9172014-01-29 08:49:02 +00003144TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3145 verifyFormat("#endif\n"
3146 "#if B");
3147}
3148
Manuel Klimek88033d72013-10-21 08:11:15 +00003149TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3150 FormatStyle SingleLine = getLLVMStyle();
3151 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003152 verifyFormat("#if 0\n"
3153 "#elif 1\n"
3154 "#endif\n"
3155 "void foo() {\n"
3156 " if (test) foo2();\n"
3157 "}",
3158 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003159}
3160
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003161TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003162 verifyFormat("functionCall({ int i; });");
3163 verifyFormat("functionCall({\n"
3164 " int i;\n"
3165 " int j;\n"
3166 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003167 verifyFormat("functionCall(\n"
3168 " {\n"
3169 " int i;\n"
3170 " int j;\n"
3171 " },\n"
3172 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003173 verifyFormat("functionA(functionB({\n"
3174 " int i;\n"
3175 " int j;\n"
3176 " }),\n"
3177 " aaaa, bbbb, cccc);");
3178 verifyFormat("functionCall(\n"
3179 " {\n"
3180 " int i;\n"
3181 " int j;\n"
3182 " },\n"
3183 " aaaa, bbbb, // comment\n"
3184 " cccc);");
3185 verifyFormat("functionA(functionB({\n"
3186 " int i;\n"
3187 " int j;\n"
3188 " }),\n"
3189 " aaaa, bbbb, // comment\n"
3190 " cccc);");
3191 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3192 verifyFormat("functionCall(aaaa, bbbb, {\n"
3193 " int i;\n"
3194 " int j;\n"
3195 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003196 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003197 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003198 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003199 " int i; // break\n"
3200 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003201 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3202 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003203 verifyFormat("DEBUG({\n"
3204 " if (a)\n"
3205 " f();\n"
3206 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003207}
3208
3209TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003210 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003211 "int i;",
3212 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003213}
3214
3215TEST_F(FormatTest, LayoutNestedBlocks) {
3216 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3217 " struct s {\n"
3218 " int i;\n"
3219 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003220 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003221 " for (int i = 0; i < 10; ++i)\n"
3222 " return;\n"
3223 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003224 verifyFormat("call(parameter, {\n"
3225 " something();\n"
3226 " // Comment using all columns.\n"
3227 " somethingelse();\n"
3228 "});",
3229 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003230 verifyFormat("DEBUG( //\n"
3231 " { f(); }, a);");
3232 verifyFormat("DEBUG( //\n"
3233 " {\n"
3234 " f(); //\n"
3235 " },\n"
3236 " a);");
3237
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003238 EXPECT_EQ("call(parameter, {\n"
3239 " something();\n"
3240 " // Comment too\n"
3241 " // looooooooooong.\n"
3242 " somethingElse();\n"
3243 "});",
3244 format("call(parameter, {\n"
3245 " something();\n"
3246 " // Comment too looooooooooong.\n"
3247 " somethingElse();\n"
3248 "});",
3249 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003250 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003251 EXPECT_EQ("DEBUG({ // comment\n"
3252 " int i;\n"
3253 "});",
3254 format("DEBUG({ // comment\n"
3255 "int i;\n"
3256 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003257 EXPECT_EQ("DEBUG({\n"
3258 " int i;\n"
3259 "\n"
3260 " // comment\n"
3261 " int j;\n"
3262 "});",
3263 format("DEBUG({\n"
3264 " int i;\n"
3265 "\n"
3266 " // comment\n"
3267 " int j;\n"
3268 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003269
3270 verifyFormat("DEBUG({\n"
3271 " if (a)\n"
3272 " return;\n"
3273 "});");
3274 verifyGoogleFormat("DEBUG({\n"
3275 " if (a) return;\n"
3276 "});");
3277 FormatStyle Style = getGoogleStyle();
3278 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003279 verifyFormat("Debug(aaaaa,\n"
3280 " {\n"
3281 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3282 " },\n"
3283 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003284 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003285
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003286 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3287
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003288 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003289}
3290
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003291TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3292 EXPECT_EQ("#define MACRO() \\\n"
3293 " Debug(aaa, /* force line break */ \\\n"
3294 " { \\\n"
3295 " int i; \\\n"
3296 " int j; \\\n"
3297 " })",
3298 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3299 " { int i; int j; })",
3300 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003301
3302 EXPECT_EQ("#define A \\\n"
3303 " [] { \\\n"
3304 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3305 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3306 " }",
3307 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3308 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3309 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003310}
3311
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003312TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3313 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003314 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003315 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003316}
3317
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003318TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3319 FormatStyle Style = getLLVMStyle();
3320 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3321 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3322 verifyFormat("FOO_BEGIN\n"
3323 " FOO_ENTRY\n"
3324 "FOO_END", Style);
3325 verifyFormat("FOO_BEGIN\n"
3326 " NESTED_FOO_BEGIN\n"
3327 " NESTED_FOO_ENTRY\n"
3328 " NESTED_FOO_END\n"
3329 "FOO_END", Style);
3330 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3331 " int x;\n"
3332 " x = 1;\n"
3333 "FOO_END(Baz)", Style);
3334}
3335
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003336//===----------------------------------------------------------------------===//
3337// Line break tests.
3338//===----------------------------------------------------------------------===//
3339
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003340TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003341 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003342 "void f() {\n"
3343 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3344 " parameter, parameter, parameter)),\n"
3345 " SecondLongCall(parameter));\n"
3346 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003347 verifyFormat(
3348 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3349 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3350 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3351 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3352 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003353 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3354 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3355 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3356 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003357 verifyFormat(
3358 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3359 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3360 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3361 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003362 verifyFormat("int a = bbbb && ccc && fffff(\n"
3363 "#define A Just forcing a new line\n"
3364 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003365}
3366
Daniel Jasperd69fc772013-05-08 14:12:04 +00003367TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3368 verifyFormat(
3369 "bool aaaaaaa =\n"
3370 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3371 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003372 verifyFormat(
3373 "bool aaaaaaa =\n"
3374 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3375 " bbbbbbbb();");
3376
Daniel Jasperd69fc772013-05-08 14:12:04 +00003377 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3378 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3379 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003380 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3381 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3382 " ccccccccc == ddddddddddd;");
3383 verifyFormat(
3384 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3385 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3386 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003387
3388 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3389 " aaaaaa) &&\n"
3390 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003391 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3392 " aaaaaa) >>\n"
3393 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003394 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003395 " SourceMgr.getSpellingColumnNumber(\n"
3396 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3397 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003398
Daniel Jasper68d888c2013-06-03 08:42:05 +00003399 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3400 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3401 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003402 verifyFormat("b = a &&\n"
3403 " // Comment\n"
3404 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003405
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003406 // If the LHS of a comparison is not a binary expression itself, the
3407 // additional linebreak confuses many people.
3408 verifyFormat(
3409 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3410 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3411 "}");
3412 verifyFormat(
3413 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3414 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3415 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003416 verifyFormat(
3417 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3418 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3419 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003420 // Even explicit parentheses stress the precedence enough to make the
3421 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003422 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3423 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3424 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003425 // This cases is borderline, but with the indentation it is still readable.
3426 verifyFormat(
3427 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3428 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3429 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3430 "}",
3431 getLLVMStyleWithColumns(75));
3432
3433 // If the LHS is a binary expression, we should still use the additional break
3434 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003435 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3436 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3437 " 5) {\n"
3438 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003439
Daniel Jasper571f1af2013-05-14 20:39:56 +00003440 FormatStyle OnePerLine = getLLVMStyle();
3441 OnePerLine.BinPackParameters = false;
3442 verifyFormat(
3443 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3444 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3445 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3446 OnePerLine);
Daniel Jasperd69fc772013-05-08 14:12:04 +00003447}
3448
Daniel Jasper6bee6822013-04-08 20:33:42 +00003449TEST_F(FormatTest, ExpressionIndentation) {
3450 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3451 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3452 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3453 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3454 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3455 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3456 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3457 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3458 " ccccccccccccccccccccccccccccccccccccccccc;");
3459 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3460 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3461 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3462 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3463 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3464 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3465 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3466 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3467 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3468 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3469 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3470 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003471 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003472 "} else if (aaaaa &&\n"
3473 " bbbbb > // break\n"
3474 " ccccc) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003475 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003476
3477 // Presence of a trailing comment used to change indentation of b.
3478 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3479 " b;\n"
3480 "return aaaaaaaaaaaaaaaaaaa +\n"
3481 " b; //",
3482 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003483}
3484
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003485TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3486 // Not sure what the best system is here. Like this, the LHS can be found
3487 // immediately above an operator (everything with the same or a higher
3488 // indent). The RHS is aligned right of the operator and so compasses
3489 // everything until something with the same indent as the operator is found.
3490 // FIXME: Is this a good system?
3491 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003492 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003493 verifyFormat(
3494 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003495 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3496 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3497 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3498 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3499 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003500 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003501 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3502 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003503 Style);
3504 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003505 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3506 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003507 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3508 Style);
3509 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003510 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3511 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003512 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3513 Style);
3514 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3515 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003516 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3517 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003518 Style);
3519 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003520 "} else if (aaaaa\n"
3521 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003522 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003523 "}",
3524 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003525 verifyFormat("return (a)\n"
3526 " // comment\n"
3527 " + b;",
3528 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003529 verifyFormat(
3530 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3531 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3532 " + cc;",
3533 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003534
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003535 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3536 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3537 Style);
3538
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003539 // Forced by comments.
3540 verifyFormat(
3541 "unsigned ContentSize =\n"
3542 " sizeof(int16_t) // DWARF ARange version number\n"
3543 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3544 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3545 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003546
3547 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3548 " == boost::fusion::at_c<1>(iiii).second;",
3549 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003550
3551 Style.ColumnLimit = 60;
3552 verifyFormat("zzzzzzzzzz\n"
3553 " = bbbbbbbbbbbbbbbbb\n"
3554 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3555 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003556}
3557
Daniel Jasper3219e432014-12-02 13:24:51 +00003558TEST_F(FormatTest, NoOperandAlignment) {
3559 FormatStyle Style = getLLVMStyle();
3560 Style.AlignOperands = false;
3561 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003562 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3563 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3564 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3565 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3566 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3567 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3568 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3569 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3570 " > ccccccccccccccccccccccccccccccccccccccccc;",
3571 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003572
3573 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3574 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3575 " + cc;",
3576 Style);
3577 verifyFormat("int a = aa\n"
3578 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3579 " * cccccccccccccccccccccccccccccccccccc;",
3580 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003581
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003582 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003583 verifyFormat("return (a > b\n"
3584 " // comment1\n"
3585 " // comment2\n"
3586 " || c);",
3587 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003588}
3589
Daniel Jasperac043c92014-09-15 11:11:00 +00003590TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3591 FormatStyle Style = getLLVMStyle();
3592 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3593 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3594 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003595 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3596 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003597}
3598
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003599TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003600 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003601 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3602 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003603 verifyFormat("Constructor()\n"
3604 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003605 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003606 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003607 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003608 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003609
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003610 verifyFormat("template <typename T>\n"
3611 "Constructor() : Initializer(FitsOnTheLine) {}",
3612 getLLVMStyleWithColumns(45));
3613
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003614 verifyFormat(
3615 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003616 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003617
3618 verifyFormat(
3619 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003620 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003621 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003622 verifyFormat(
3623 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003624 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003625 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003626 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3627 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3628 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003629
3630 verifyFormat("Constructor()\n"
3631 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3632 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3633 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003634 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003635
Daniel Jasper65585ed2013-01-28 13:31:35 +00003636 verifyFormat("Constructor()\n"
3637 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003638 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003639
Daniel Jasper62e68172013-02-25 15:59:54 +00003640 verifyFormat("Constructor(int Parameter = 0)\n"
3641 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3642 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003643 verifyFormat("Constructor()\n"
3644 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3645 "}",
3646 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003647 verifyFormat("Constructor()\n"
3648 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3649 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003650
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003651 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003652 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003653 verifyFormat("Constructor()\n"
3654 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3655 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3656 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003657
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003658 FormatStyle OnePerLine = getLLVMStyle();
3659 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003660 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003661 verifyFormat("SomeClass::Constructor()\n"
3662 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3663 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003664 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003665 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003666 verifyFormat("SomeClass::Constructor()\n"
3667 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3668 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003669 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003670 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003671 verifyFormat("MyClass::MyClass(int var)\n"
3672 " : some_var_(var), // 4 space indent\n"
3673 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003674 "}",
3675 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003676 verifyFormat("Constructor()\n"
3677 " : aaaaa(aaaaaa),\n"
3678 " aaaaa(aaaaaa),\n"
3679 " aaaaa(aaaaaa),\n"
3680 " aaaaa(aaaaaa),\n"
3681 " aaaaa(aaaaaa) {}",
3682 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003683 verifyFormat("Constructor()\n"
3684 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3685 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3686 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003687 OnePerLine.BinPackParameters = false;
3688 verifyFormat(
3689 "Constructor()\n"
3690 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3691 " aaaaaaaaaaa().aaa(),\n"
3692 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3693 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003694 OnePerLine.ColumnLimit = 60;
3695 verifyFormat("Constructor()\n"
3696 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3697 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3698 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003699
3700 EXPECT_EQ("Constructor()\n"
3701 " : // Comment forcing unwanted break.\n"
3702 " aaaa(aaaa) {}",
3703 format("Constructor() :\n"
3704 " // Comment forcing unwanted break.\n"
3705 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003706}
3707
3708TEST_F(FormatTest, MemoizationTests) {
3709 // This breaks if the memoization lookup does not take \c Indent and
3710 // \c LastSpace into account.
3711 verifyFormat(
3712 "extern CFRunLoopTimerRef\n"
3713 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3714 " CFTimeInterval interval, CFOptionFlags flags,\n"
3715 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003716 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003717
3718 // Deep nesting somewhat works around our memoization.
3719 verifyFormat(
3720 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3721 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3722 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3723 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3724 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3725 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003726 verifyFormat(
3727 "aaaaa(\n"
3728 " aaaaa,\n"
3729 " aaaaa(\n"
3730 " aaaaa,\n"
3731 " aaaaa(\n"
3732 " aaaaa,\n"
3733 " aaaaa(\n"
3734 " aaaaa,\n"
3735 " aaaaa(\n"
3736 " aaaaa,\n"
3737 " aaaaa(\n"
3738 " aaaaa,\n"
3739 " aaaaa(\n"
3740 " aaaaa,\n"
3741 " aaaaa(\n"
3742 " aaaaa,\n"
3743 " aaaaa(\n"
3744 " aaaaa,\n"
3745 " aaaaa(\n"
3746 " aaaaa,\n"
3747 " aaaaa(\n"
3748 " aaaaa,\n"
3749 " aaaaa(\n"
3750 " aaaaa,\n"
3751 " aaaaa))))))))))));",
3752 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003753 verifyFormat(
3754 "a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(), a), a), a), a),\n"
3755 " a),\n"
3756 " a),\n"
3757 " a),\n"
3758 " a),\n"
3759 " a),\n"
3760 " a),\n"
3761 " a),\n"
3762 " a),\n"
3763 " a),\n"
3764 " a),\n"
3765 " a),\n"
3766 " a),\n"
3767 " a),\n"
3768 " a),\n"
3769 " a),\n"
3770 " a),\n"
3771 " a)",
3772 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003773
3774 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003775 FormatStyle OnePerLine = getLLVMStyle();
3776 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003777 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003778 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003779 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003780 for (unsigned i = 0, e = 80; i != e; ++i) {
3781 input += " a,\n";
3782 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003783 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003784 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003785}
3786
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003787TEST_F(FormatTest, BreaksAsHighAsPossible) {
3788 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003789 "void f() {\n"
3790 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3791 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3792 " f();\n"
3793 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003794 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003795 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003796}
3797
Daniel Jasper6728fc12013-04-11 14:29:13 +00003798TEST_F(FormatTest, BreaksFunctionDeclarations) {
3799 // Principially, we break function declarations in a certain order:
3800 // 1) break amongst arguments.
3801 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3802 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003803 verifyFormat("template <class TemplateIt>\n"
3804 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3805 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003806
3807 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003808 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003809 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003810 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003811 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003812
3813 // 3) break after (.
3814 verifyFormat(
3815 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003816 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3817 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003818
3819 // 4) break before after nested name specifiers.
3820 verifyFormat(
3821 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003822 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3823 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003824 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003825
3826 // However, there are exceptions, if a sufficient amount of lines can be
3827 // saved.
3828 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3829 // more adjusting.
3830 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3831 " Cccccccccccccc cccccccccc,\n"
3832 " Cccccccccccccc cccccccccc,\n"
3833 " Cccccccccccccc cccccccccc,\n"
3834 " Cccccccccccccc cccccccccc);");
3835 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003836 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003837 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3838 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3839 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003840 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003841 verifyFormat(
3842 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3843 " Cccccccccccccc cccccccccc,\n"
3844 " Cccccccccccccc cccccccccc,\n"
3845 " Cccccccccccccc cccccccccc,\n"
3846 " Cccccccccccccc cccccccccc,\n"
3847 " Cccccccccccccc cccccccccc,\n"
3848 " Cccccccccccccc cccccccccc);");
3849 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3850 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3851 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3852 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3853 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003854
3855 // Break after multi-line parameters.
3856 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3857 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3858 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3859 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003860 verifyFormat("void SomeLoooooooooooongFunction(\n"
3861 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3862 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3863 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003864
3865 // Treat overloaded operators like other functions.
3866 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3867 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003868 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3869 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003870 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3871 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3872 verifyGoogleFormat(
3873 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3874 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003875 verifyGoogleFormat(
3876 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3877 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003878 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3879 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3880 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3881 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003882 verifyGoogleFormat(
3883 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3884 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3885 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003886 verifyGoogleFormat(
3887 "template <typename T>\n"
3888 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3889 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3890 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003891
3892 FormatStyle Style = getLLVMStyle();
3893 Style.PointerAlignment = FormatStyle::PAS_Left;
3894 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3895 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3896 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003897 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3898 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3899 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003900}
3901
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003902TEST_F(FormatTest, TrailingReturnType) {
3903 verifyFormat("auto foo() -> int;\n");
3904 verifyFormat("struct S {\n"
3905 " auto bar() const -> int;\n"
3906 "};");
3907 verifyFormat("template <size_t Order, typename T>\n"
3908 "auto load_img(const std::string &filename)\n"
3909 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003910 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3911 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003912 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003913 verifyFormat("template <typename T>\n"
3914 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3915 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003916
3917 // Not trailing return types.
3918 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003919}
3920
Daniel Jasper5be31f72013-05-21 09:16:31 +00003921TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003922 // Avoid breaking before trailing 'const' or other trailing annotations, if
3923 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003924 FormatStyle Style = getGoogleStyle();
3925 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003926 verifyFormat("void someLongFunction(\n"
3927 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003928 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003929 verifyFormat("LoooooongReturnType\n"
3930 "someLoooooooongFunction() const {}",
3931 getLLVMStyleWithColumns(47));
3932 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3933 " const {}",
3934 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003935 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3936 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3937 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3938 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3939 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3940 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003941 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3942 " aaaaaaaaaaa aaaaa) const override;");
3943 verifyGoogleFormat(
3944 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3945 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003946
Daniel Jasper5550de62014-02-17 07:57:46 +00003947 // Even if the first parameter has to be wrapped.
3948 verifyFormat("void someLongFunction(\n"
3949 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003950 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003951 verifyFormat("void someLongFunction(\n"
3952 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003953 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003954 verifyFormat("void someLongFunction(\n"
3955 " int someLongParameter) override {}",
3956 Style);
3957 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003958 " int someLongParameter) OVERRIDE {}",
3959 Style);
3960 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003961 " int someLongParameter) final {}",
3962 Style);
3963 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003964 " int someLongParameter) FINAL {}",
3965 Style);
3966 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003967 " int parameter) const override {}",
3968 Style);
3969
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003970 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3971 verifyFormat("void someLongFunction(\n"
3972 " int someLongParameter) const\n"
3973 "{\n"
3974 "}",
3975 Style);
3976
Daniel Jasper5550de62014-02-17 07:57:46 +00003977 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003978 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3979 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3980 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003981
3982 // Breaking before function-like trailing annotations is fine to keep them
3983 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003984 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3985 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3986 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3987 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3988 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3989 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003990 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3991 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003992 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003993
3994 verifyFormat(
3995 "void aaaaaaaaaaaaaaaaaa()\n"
3996 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3997 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
3998 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3999 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004000 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004001 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004002 " GUARDED_BY(aaaaaaaaaaaa);");
4003 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004004 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004005 " GUARDED_BY(aaaaaaaaaaaa);");
4006 verifyGoogleFormat(
4007 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4008 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004009 verifyGoogleFormat(
4010 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4011 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004012}
4013
Daniel Jasperf090f032015-05-18 09:47:22 +00004014TEST_F(FormatTest, FunctionAnnotations) {
4015 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004016 "int OldFunction(const string &parameter) {}");
4017 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004018 "string OldFunction(const string &parameter) {}");
4019 verifyFormat("template <typename T>\n"
4020 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4021 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004022
4023 // Not function annotations.
4024 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4025 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004026 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4027 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004028 verifyFormat("MACRO(abc).function() // wrap\n"
4029 " << abc;");
4030 verifyFormat("MACRO(abc)->function() // wrap\n"
4031 " << abc;");
4032 verifyFormat("MACRO(abc)::function() // wrap\n"
4033 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004034}
4035
Daniel Jasperf7935112012-12-03 18:12:45 +00004036TEST_F(FormatTest, BreaksDesireably) {
4037 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4038 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004039 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004040 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4041 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4042 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004043
4044 verifyFormat(
4045 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004046 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004047
4048 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4049 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4050 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004051
4052 verifyFormat(
4053 "aaaaaaaa(aaaaaaaaaaaaa, aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4054 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4055 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4056 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004057
4058 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4059 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4060
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004061 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004062 "void f() {\n"
4063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4064 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4065 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004066 verifyFormat(
4067 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4068 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4069 verifyFormat(
4070 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4071 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jaspera44991332015-04-29 13:06:49 +00004072 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4073 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4074 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004075
Daniel Jasper739b85f2015-06-29 10:42:59 +00004076 // Indent consistently independent of call expression and unary operator.
4077 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4078 " dddddddddddddddddddddddddddddd));");
4079 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4080 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004081 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004082 " dddddddddddddddddddddddddddddd));");
4083
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004084 // This test case breaks on an incorrect memoization, i.e. an optimization not
4085 // taking into account the StopAt value.
4086 verifyFormat(
4087 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004088 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4089 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4090 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004091
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004092 verifyFormat("{\n {\n {\n"
4093 " Annotation.SpaceRequiredBefore =\n"
4094 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4095 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4096 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004097
4098 // Break on an outer level if there was a break on an inner level.
4099 EXPECT_EQ("f(g(h(a, // comment\n"
4100 " b, c),\n"
4101 " d, e),\n"
4102 " x, y);",
4103 format("f(g(h(a, // comment\n"
4104 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004105
4106 // Prefer breaking similar line breaks.
4107 verifyFormat(
4108 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4109 " NSTrackingMouseEnteredAndExited |\n"
4110 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004111}
4112
Daniel Jasper18210d72014-10-09 09:52:05 +00004113TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4114 FormatStyle NoBinPacking = getGoogleStyle();
4115 NoBinPacking.BinPackParameters = false;
4116 NoBinPacking.BinPackArguments = true;
4117 verifyFormat("void f() {\n"
4118 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4119 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4120 "}",
4121 NoBinPacking);
4122 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4123 " int aaaaaaaaaaaaaaaaaaaa,\n"
4124 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4125 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004126
Daniel Jasper00693b082016-01-09 15:56:47 +00004127 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4128 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4129 " vector<int> bbbbbbbbbbbbbbb);",
4130 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004131 // FIXME: This behavior difference is probably not wanted. However, currently
4132 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4133 // template arguments from BreakBeforeParameter being set because of the
4134 // one-per-line formatting.
4135 verifyFormat(
4136 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4137 " aaaaaaaaaa> aaaaaaaaaa);",
4138 NoBinPacking);
4139 verifyFormat(
4140 "void fffffffffff(\n"
4141 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4142 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004143}
4144
Daniel Jasper9278eb92013-01-16 14:59:02 +00004145TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004146 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004147 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004148 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004149 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4150 " aaaaaaaaaaaaaaaaaaaa,\n"
4151 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4152 NoBinPacking);
4153 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4154 " aaaaaaaaaaaaa,\n"
4155 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4156 NoBinPacking);
4157 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004158 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4159 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4160 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4161 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004162 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4163 NoBinPacking);
4164 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4165 " .aaaaaaaaaaaaaaaaaa();",
4166 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004167 verifyFormat("void f() {\n"
4168 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4169 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4170 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004171 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004172
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004173 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004174 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4175 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004176 " aaaaaaaaaaaa);",
4177 NoBinPacking);
4178 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004179 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4180 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004181 " test);",
4182 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004183
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004184 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4185 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004186 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4187 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004188 NoBinPacking);
4189 verifyFormat("a(\"a\"\n"
4190 " \"a\",\n"
4191 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004192
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004193 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004194 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004195 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004196 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004197 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004198 verifyFormat(
4199 "void f() {\n"
4200 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4201 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004202 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004203 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004204 verifyFormat(
4205 "template <class SomeType, class SomeOtherType>\n"
4206 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4207 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004208}
4209
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004210TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4211 FormatStyle Style = getLLVMStyleWithColumns(15);
4212 Style.ExperimentalAutoDetectBinPacking = true;
4213 EXPECT_EQ("aaa(aaaa,\n"
4214 " aaaa,\n"
4215 " aaaa);\n"
4216 "aaa(aaaa,\n"
4217 " aaaa,\n"
4218 " aaaa);",
4219 format("aaa(aaaa,\n" // one-per-line
4220 " aaaa,\n"
4221 " aaaa );\n"
4222 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4223 Style));
4224 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4225 " aaaa);\n"
4226 "aaa(aaaa, aaaa,\n"
4227 " aaaa);",
4228 format("aaa(aaaa, aaaa,\n" // bin-packed
4229 " aaaa );\n"
4230 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4231 Style));
4232}
4233
Daniel Jasper04468962013-01-18 10:56:38 +00004234TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004235 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4236 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4237 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4238 " .StartsWith(\".init\", ORDER_INIT)\n"
4239 " .StartsWith(\".fini\", ORDER_FINI)\n"
4240 " .StartsWith(\".hash\", ORDER_HASH)\n"
4241 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004242
Daniel Jaspereb50c672013-02-15 20:33:06 +00004243 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004244 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004245 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004246 "aaaaaaa->aaaaaaa\n"
4247 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4248 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004249 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004250 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004251 "aaaaaaa->aaaaaaa\n"
4252 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4253 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4254 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004255 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004256 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004257 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004258 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4259 " aaaaaa->aaaaaaaaaaaa()\n"
4260 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004261 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004262 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004263 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004264 "void f() {\n"
4265 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004266 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004267 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004268 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004269 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004270 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004271 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004272 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004273 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004274 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004275 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004276 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004277
4278 verifyFormat(
4279 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4280 verifyFormat("aaaaaaaaaaaaaaa()\n"
4281 " .aaaaaaaaaaaaaaa()\n"
4282 " .aaaaaaaaaaaaaaa()\n"
4283 " .aaaaaaaaaaaaaaa()\n"
4284 " .aaaaaaaaaaaaaaa();");
4285 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4286 " .aaaaaaaaaaaaaaa()\n"
4287 " .aaaaaaaaaaaaaaa()\n"
4288 " .aaaaaaaaaaaaaaa();");
4289 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4290 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4291 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004292 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4293 " ->aaaaaaaaaaaaaae(0)\n"
4294 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004295
Daniel Jasper775954b2015-04-24 10:08:09 +00004296 // Don't linewrap after very short segments.
4297 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4298 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4299 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4300 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4301 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4302 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4303 verifyFormat("aaa()\n"
4304 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4305 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4306 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4307
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004308 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4309 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4310 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4311 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4312 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004313 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004314
Daniel Jaspera41aa532014-09-19 08:01:25 +00004315 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004316 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4317 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004318
4319 // Prefer not to create "hanging" indents.
4320 verifyFormat(
4321 "return !soooooooooooooome_map\n"
4322 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4323 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004324 verifyFormat(
4325 "return aaaaaaaaaaaaaaaa\n"
4326 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4327 " .aaaa(aaaaaaaaaaaaaa);");
4328 // No hanging indent here.
4329 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4330 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4331 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4332 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004333 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4334 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4335 getLLVMStyleWithColumns(60));
4336 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4337 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4338 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4339 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004340 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4341 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4342 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004343}
4344
Daniel Jasperde5c2072012-12-24 00:13:23 +00004345TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4346 verifyFormat(
4347 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004348 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004349 verifyFormat(
4350 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4351 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4352
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004353 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004354 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004355 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4356 " ccccccccccccccccccccccccc) {\n}");
4357
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004358 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004359 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004360 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4361 " ccccccccccccccccccccccccc) {\n}");
4362
Daniel Jasperde5c2072012-12-24 00:13:23 +00004363 verifyFormat(
4364 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004365 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004366 verifyFormat(
4367 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4368 " ccccccccccccccccccccccccc) {\n}");
4369
Daniel Jasper400adc62013-02-08 15:28:42 +00004370 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4371 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4372 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4373 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004374 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4375 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4376 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4377 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4378
Daniel Jasper400adc62013-02-08 15:28:42 +00004379 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4380 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4381 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004382 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4383 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4384 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004385}
4386
Daniel Jasper43b65482013-01-23 12:27:43 +00004387TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004388 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004389 "unsigned Cost =\n"
4390 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4391 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004392 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004393 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4394 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004395
4396 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004397 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4398 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004399 verifyFormat("unsigned OriginalStartColumn =\n"
4400 " SourceMgr.getSpellingColumnNumber(\n"
4401 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4402 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004403}
4404
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004405TEST_F(FormatTest, AlignsAfterAssignments) {
4406 verifyFormat(
4407 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004408 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004409 verifyFormat(
4410 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004411 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004412 verifyFormat(
4413 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004414 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004415 verifyFormat(
4416 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004417 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004418 verifyFormat(
4419 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4420 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4421 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004422}
4423
4424TEST_F(FormatTest, AlignsAfterReturn) {
4425 verifyFormat(
4426 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4427 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4428 verifyFormat(
4429 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4430 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004431 verifyFormat(
4432 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004433 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004434 verifyFormat(
4435 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004436 " aaaaaaaaaaaaaaaaaaaaaa());");
4437 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4438 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4439 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4440 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4441 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004442 verifyFormat("return\n"
4443 " // true if code is one of a or b.\n"
4444 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004445}
4446
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004447TEST_F(FormatTest, AlignsAfterOpenBracket) {
4448 verifyFormat(
4449 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4450 " aaaaaaaaa aaaaaaa) {}");
4451 verifyFormat(
4452 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4453 " aaaaaaaaaaa aaaaaaaaa);");
4454 verifyFormat(
4455 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4456 " aaaaaaaaaaaaaaaaaaaaa));");
4457 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004458 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004459 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4460 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4461 Style);
4462 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4463 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4464 Style);
4465 verifyFormat("SomeLongVariableName->someFunction(\n"
4466 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4467 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004468 verifyFormat(
4469 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4470 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4471 Style);
4472 verifyFormat(
4473 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4474 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4475 Style);
4476 verifyFormat(
4477 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4478 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4479 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004480
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004481 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4482 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4483 " b));",
4484 Style);
4485
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004486 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4487 Style.BinPackArguments = false;
4488 Style.BinPackParameters = false;
4489 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4490 " aaaaaaaaaaa aaaaaaaa,\n"
4491 " aaaaaaaaa aaaaaaa,\n"
4492 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4493 Style);
4494 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4495 " aaaaaaaaaaa aaaaaaaaa,\n"
4496 " aaaaaaaaaaa aaaaaaaaa,\n"
4497 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4498 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004499 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4500 " aaaaaaaaaaaaaaa,\n"
4501 " aaaaaaaaaaaaaaaaaaaaa,\n"
4502 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004503 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004504 verifyFormat(
4505 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4506 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4507 Style);
4508 verifyFormat(
4509 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4510 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4511 Style);
4512 verifyFormat(
4513 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4514 " aaaaaaaaaaaaaaaaaaaaa(\n"
4515 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4516 " aaaaaaaaaaaaaaaa);",
4517 Style);
4518 verifyFormat(
4519 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4520 " aaaaaaaaaaaaaaaaaaaaa(\n"
4521 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4522 " aaaaaaaaaaaaaaaa);",
4523 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004524}
4525
Daniel Jasper3219e432014-12-02 13:24:51 +00004526TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4527 FormatStyle Style = getLLVMStyleWithColumns(40);
4528 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4529 " bbbbbbbbbbbbbbbbbbbbbb);",
4530 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004531 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004532 Style.AlignOperands = false;
4533 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4534 " bbbbbbbbbbbbbbbbbbbbbb);",
4535 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004536 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004537 Style.AlignOperands = true;
4538 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4539 " bbbbbbbbbbbbbbbbbbbbbb);",
4540 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004541 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004542 Style.AlignOperands = false;
4543 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4544 " bbbbbbbbbbbbbbbbbbbbbb);",
4545 Style);
4546}
4547
Daniel Jasper399d24b2013-01-09 07:06:56 +00004548TEST_F(FormatTest, BreaksConditionalExpressions) {
4549 verifyFormat(
Daniel Jasperee7539a2013-07-08 14:25:23 +00004550 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4551 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4552 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004553 verifyFormat(
Daniel Jasperca6623b2013-01-28 12:45:14 +00004554 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4555 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4556 verifyFormat(
4557 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4558 " : aaaaaaaaaaaaa);");
4559 verifyFormat(
4560 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004561 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004562 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4563 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004564 verifyFormat(
4565 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4566 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4567 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004568 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4569 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4570 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4571 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4572 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4573 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4574 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4575 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4576 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4577 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4578 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4579 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004580 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4581 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4582 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4583 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4584 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004585 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4586 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4587 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004588 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4589 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4590 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4591 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004592 verifyFormat(
4593 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4594 " ? aaaaaaaaaaaaaaa\n"
4595 " : aaaaaaaaaaaaaaa;");
4596 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004597 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004598 " ? b\n"
4599 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004600 verifyFormat("return aaaa == bbbb\n"
4601 " // comment\n"
4602 " ? aaaa\n"
4603 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004604 verifyFormat("unsigned Indent =\n"
4605 " format(TheLine.First, IndentForLevel[TheLine.Level] >= 0\n"
4606 " ? IndentForLevel[TheLine.Level]\n"
4607 " : TheLine * 2,\n"
4608 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4609 getLLVMStyleWithColumns(70));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004610 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4611 " ? aaaaaaaaaaaaaaa\n"
4612 " : bbbbbbbbbbbbbbb //\n"
4613 " ? ccccccccccccccc\n"
4614 " : ddddddddddddddd;");
4615 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4616 " ? aaaaaaaaaaaaaaa\n"
4617 " : (bbbbbbbbbbbbbbb //\n"
4618 " ? ccccccccccccccc\n"
4619 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004620 verifyFormat(
4621 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4622 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4623 " aaaaaaaaaaaaaaaaaaaaa +\n"
4624 " aaaaaaaaaaaaaaaaaaaaa\n"
4625 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004626 verifyFormat(
4627 "aaaaaa = aaaaaaaaaaaa\n"
4628 " ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4629 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4630 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004631
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004632 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004633 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004634 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004635 "void f() {\n"
4636 " g(aaa,\n"
4637 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4638 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4639 " ? aaaaaaaaaaaaaaa\n"
4640 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004641 "}",
4642 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004643 verifyFormat(
4644 "void f() {\n"
4645 " g(aaa,\n"
4646 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4647 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4648 " ?: aaaaaaaaaaaaaaa);\n"
4649 "}",
4650 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004651
4652 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4653 " // comment.\n"
4654 " ccccccccccccccccccccccccccccccccccccccc\n"
4655 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4656 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004657
4658 // Assignments in conditional expressions. Apparently not uncommon :-(.
4659 verifyFormat("return a != b\n"
4660 " // comment\n"
4661 " ? a = b\n"
4662 " : a = b;");
4663 verifyFormat("return a != b\n"
4664 " // comment\n"
4665 " ? a = a != b\n"
4666 " // comment\n"
4667 " ? a = b\n"
4668 " : a\n"
4669 " : a;\n");
4670 verifyFormat("return a != b\n"
4671 " // comment\n"
4672 " ? a\n"
4673 " : a = a != b\n"
4674 " // comment\n"
4675 " ? a = b\n"
4676 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004677}
4678
Daniel Jasper165b29e2013-11-08 00:57:11 +00004679TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4680 FormatStyle Style = getLLVMStyle();
4681 Style.BreakBeforeTernaryOperators = false;
4682 Style.ColumnLimit = 70;
4683 verifyFormat(
4684 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4685 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4686 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4687 Style);
4688 verifyFormat(
4689 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4690 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4691 Style);
4692 verifyFormat(
4693 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4694 " aaaaaaaaaaaaa);",
4695 Style);
4696 verifyFormat(
4697 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4698 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4699 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4700 " aaaaaaaaaaaaa);",
4701 Style);
4702 verifyFormat(
4703 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4704 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4705 " aaaaaaaaaaaaa);",
4706 Style);
4707 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4708 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4709 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4710 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4711 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4712 Style);
4713 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4714 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4715 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4716 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4717 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4718 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4719 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4720 Style);
4721 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4722 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4723 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4724 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4725 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4726 Style);
4727 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4728 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4729 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4730 Style);
4731 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004732 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004733 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4734 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4735 Style);
4736 verifyFormat(
4737 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4738 " aaaaaaaaaaaaaaa :\n"
4739 " aaaaaaaaaaaaaaa;",
4740 Style);
4741 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4742 " aaaaaaaaa ?\n"
4743 " b :\n"
4744 " c);",
4745 Style);
4746 verifyFormat(
4747 "unsigned Indent =\n"
4748 " format(TheLine.First, IndentForLevel[TheLine.Level] >= 0 ?\n"
4749 " IndentForLevel[TheLine.Level] :\n"
4750 " TheLine * 2,\n"
4751 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4752 Style);
4753 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4754 " aaaaaaaaaaaaaaa :\n"
4755 " bbbbbbbbbbbbbbb ? //\n"
4756 " ccccccccccccccc :\n"
4757 " ddddddddddddddd;",
4758 Style);
4759 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4760 " aaaaaaaaaaaaaaa :\n"
4761 " (bbbbbbbbbbbbbbb ? //\n"
4762 " ccccccccccccccc :\n"
4763 " ddddddddddddddd);",
4764 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004765 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4766 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4767 " ccccccccccccccccccccccccccc;",
4768 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004769 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4770 " aaaaa :\n"
4771 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4772 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004773}
4774
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004775TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4776 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4777 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4778 verifyFormat("bool a = true, b = false;");
4779
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004780 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004781 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004782 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004783 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004784 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004785 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004786 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004787 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004788 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4789 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4790 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4791 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4792 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4793 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004794
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004795 FormatStyle Style = getGoogleStyle();
4796 Style.PointerAlignment = FormatStyle::PAS_Left;
4797 Style.DerivePointerAlignment = false;
4798 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4799 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4800 " *b = bbbbbbbbbbbbbbbbbbb;",
4801 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004802 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4803 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4804 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004805 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004806 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004807}
4808
Nico Weber4a5030c2013-01-12 01:28:06 +00004809TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4810 verifyFormat("arr[foo ? bar : baz];");
4811 verifyFormat("f()[foo ? bar : baz];");
4812 verifyFormat("(a + b)[foo ? bar : baz];");
4813 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4814}
4815
Daniel Jasperf7935112012-12-03 18:12:45 +00004816TEST_F(FormatTest, AlignsStringLiterals) {
4817 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4818 " \"short literal\");");
4819 verifyFormat(
4820 "looooooooooooooooooooooooongFunction(\n"
4821 " \"short literal\"\n"
4822 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004823 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4824 " \" string literals\",\n"
4825 " and, other, parameters);");
Manuel Klimek02f640a2013-02-20 15:25:48 +00004826 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4827 " \"5678\";",
4828 format("fun + \"1243\" /* comment */\n"
4829 " \"5678\";",
4830 getLLVMStyleWithColumns(28)));
4831 EXPECT_EQ(
4832 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4833 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4834 " \"aaaaaaaaaaaaaaaa\";",
4835 format("aaaaaa ="
4836 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4837 "aaaaaaaaaaaaaaaaaaaaa\" "
4838 "\"aaaaaaaaaaaaaaaa\";"));
Manuel Klimek0c915712013-02-20 15:32:58 +00004839 verifyFormat("a = a + \"a\"\n"
4840 " \"a\"\n"
4841 " \"a\";");
Daniel Jasper7dd22c51b2013-05-16 04:26:02 +00004842 verifyFormat("f(\"a\", \"b\"\n"
4843 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004844
4845 verifyFormat(
4846 "#define LL_FORMAT \"ll\"\n"
4847 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4848 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004849
4850 verifyFormat("#define A(X) \\\n"
4851 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4852 " \"ccccc\"",
4853 getLLVMStyleWithColumns(23));
4854 verifyFormat("#define A \"def\"\n"
4855 "f(\"abc\" A \"ghi\"\n"
4856 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004857
4858 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004859 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004860 verifyFormat("#define A(X) \\\n"
4861 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4862 " L\"ccccc\"",
4863 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004864
4865 verifyFormat("f(@\"a\"\n"
4866 " @\"b\");");
4867 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004868 " @\"b\"\n"
4869 " @\"c\";");
4870 verifyFormat("NSString s = @\"a\"\n"
4871 " \"b\"\n"
4872 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004873}
4874
Zachary Turner448592e2015-12-18 22:20:15 +00004875TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004876 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004877 // No declarations or definitions should be moved to own line.
4878 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4879 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004880 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004881 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004882 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004883 "int f() { return 1; }\n"
4884 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004885 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004886
4887 // All declarations and definitions should have the return type moved to its
4888 // own
4889 // line.
4890 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4891 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004892 " int\n"
4893 " f() {\n"
4894 " return 1;\n"
4895 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004896 " int\n"
4897 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004898 "};\n"
4899 "int\n"
4900 "f() {\n"
4901 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004902 "}\n"
4903 "int\n"
4904 "g();\n",
4905 Style);
4906
4907 // Top-level definitions, and no kinds of declarations should have the
4908 // return type moved to its own line.
4909 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4910 verifyFormat("class B {\n"
4911 " int f() { return 1; }\n"
4912 " int g();\n"
4913 "};\n"
4914 "int\n"
4915 "f() {\n"
4916 " return 1;\n"
4917 "}\n"
4918 "int g();\n",
4919 Style);
4920
4921 // Top-level definitions and declarations should have the return type moved
4922 // to its own line.
4923 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4924 verifyFormat("class C {\n"
4925 " int f() { return 1; }\n"
4926 " int g();\n"
4927 "};\n"
4928 "int\n"
4929 "f() {\n"
4930 " return 1;\n"
4931 "}\n"
4932 "int\n"
4933 "g();\n",
4934 Style);
4935
4936 // All definitions should have the return type moved to its own line, but no
4937 // kinds of declarations.
4938 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4939 verifyFormat("class D {\n"
4940 " int\n"
4941 " f() {\n"
4942 " return 1;\n"
4943 " }\n"
4944 " int g();\n"
4945 "};\n"
4946 "int\n"
4947 "f() {\n"
4948 " return 1;\n"
4949 "}\n"
4950 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004951 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004952 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004953 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004954 " return \"\";\n"
4955 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004956 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004957 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004958 verifyFormat("template <class T>\n"
4959 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004960 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004961 " return NULL;\n"
4962 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004963 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004964 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00004965 verifyFormat("class C {\n"
4966 " int\n"
4967 " operator+() {\n"
4968 " return 1;\n"
4969 " }\n"
4970 " int\n"
4971 " operator()() {\n"
4972 " return 1;\n"
4973 " }\n"
4974 "};\n",
4975 Style);
4976 verifyFormat("void\n"
4977 "A::operator()() {}\n"
4978 "void\n"
4979 "A::operator>>() {}\n"
4980 "void\n"
4981 "A::operator+() {}\n",
4982 Style);
4983 verifyFormat("void *operator new(std::size_t s);", // No break here.
4984 Style);
4985 verifyFormat("void *\n"
4986 "operator new(std::size_t s) {}",
4987 Style);
4988 verifyFormat("void *\n"
4989 "operator delete[](void *ptr) {}",
4990 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004991 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00004992 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004993 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004994 "{\n"
4995 " return \"\";\n"
4996 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004997 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004998 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004999 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005000 "T *\n" // Problem here: no line break
5001 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005002 "{\n"
5003 " return NULL;\n"
5004 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005005 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005006 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005007}
5008
Alexander Kornienko58611712013-07-04 12:02:44 +00005009TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5010 FormatStyle NoBreak = getLLVMStyle();
5011 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5012 FormatStyle Break = getLLVMStyle();
5013 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005014 verifyFormat("aaaa = \"bbbb\"\n"
5015 " \"cccc\";",
5016 NoBreak);
5017 verifyFormat("aaaa =\n"
5018 " \"bbbb\"\n"
5019 " \"cccc\";",
5020 Break);
5021 verifyFormat("aaaa(\"bbbb\"\n"
5022 " \"cccc\");",
5023 NoBreak);
5024 verifyFormat("aaaa(\n"
5025 " \"bbbb\"\n"
5026 " \"cccc\");",
5027 Break);
5028 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5029 " \"cccc\");",
5030 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005031 verifyFormat("aaaa(qqq,\n"
5032 " \"bbbb\"\n"
5033 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005034 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005035 verifyFormat("aaaa(qqq,\n"
5036 " L\"bbbb\"\n"
5037 " L\"cccc\");",
5038 Break);
5039 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5040 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005041 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005042 verifyFormat("string s = someFunction(\n"
5043 " \"abc\"\n"
5044 " \"abc\");",
5045 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005046
Daniel Jasper3251fff2014-06-10 06:27:23 +00005047 // As we break before unary operators, breaking right after them is bad.
5048 verifyFormat("string foo = abc ? \"x\"\n"
5049 " \"blah blah blah blah blah blah\"\n"
5050 " : \"y\";",
5051 Break);
5052
Daniel Jasperc834c702013-07-17 15:38:19 +00005053 // Don't break if there is no column gain.
5054 verifyFormat("f(\"aaaa\"\n"
5055 " \"bbbb\");",
5056 Break);
5057
5058 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005059 EXPECT_EQ("x = \"a\\\n"
5060 "b\\\n"
5061 "c\";",
5062 format("x = \"a\\\n"
5063 "b\\\n"
5064 "c\";",
5065 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005066 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005067 " \"a\\\n"
5068 "b\\\n"
5069 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005070 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005071 "b\\\n"
5072 "c\";",
5073 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005074
5075 // Exempt ObjC strings for now.
5076 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005077 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005078 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005079 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005080 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005081
5082 Break.ColumnLimit = 0;
5083 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005084}
5085
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005086TEST_F(FormatTest, AlignsPipes) {
5087 verifyFormat(
5088 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5089 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5090 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5091 verifyFormat(
5092 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5093 " << aaaaaaaaaaaaaaaaaaaa;");
5094 verifyFormat(
5095 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5096 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5097 verifyFormat(
5098 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5099 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5100 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5101 verifyFormat(
5102 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5103 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5104 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005105 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5106 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5107 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5108 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005109 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5110 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005111 verifyFormat(
5112 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5113 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005114
5115 verifyFormat("return out << \"somepacket = {\\n\"\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00005116 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5117 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5118 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5119 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
Daniel Jasper2603ee02013-02-04 07:34:48 +00005120 " << \"}\";");
Daniel Jasperba9ddb62013-02-06 21:04:05 +00005121
Daniel Jasper0d5e44d2013-07-15 14:12:30 +00005122 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5123 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5124 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
Daniel Jasperba9ddb62013-02-06 21:04:05 +00005125 verifyFormat(
5126 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5127 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5128 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5129 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5130 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
Daniel Jasperf38a0ac2013-03-14 14:00:17 +00005131 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5132 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperfa21c072013-07-15 14:33:14 +00005133 verifyFormat(
5134 "void f() {\n"
5135 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5136 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5137 "}");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005138 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5139 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005140 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5141 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5142 " aaaaaaaaaaaaaaaaaaaaa)\n"
5143 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005144 verifyFormat("LOG_IF(aaa == //\n"
5145 " bbb)\n"
5146 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005147
Daniel Jasper4e9678f2013-07-11 20:41:21 +00005148 // Breaking before the first "<<" is generally not desirable.
5149 verifyFormat(
5150 "llvm::errs()\n"
5151 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5152 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5153 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5154 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5155 getLLVMStyleWithColumns(70));
5156 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5157 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5158 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5159 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5160 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5161 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5162 getLLVMStyleWithColumns(70));
5163
Daniel Jasper467ddb12013-08-12 12:58:05 +00005164 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005165 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5166 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005167 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5168 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5169 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005170 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5171 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005172 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5173 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5175 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5176 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5177 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5178 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005179
Daniel Jasperc238c872013-04-02 14:33:13 +00005180 verifyFormat(
5181 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5182 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005183
5184 // Incomplete string literal.
5185 EXPECT_EQ("llvm::errs() << \"\n"
5186 " << a;",
5187 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005188
5189 verifyFormat("void f() {\n"
5190 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5191 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5192 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005193
5194 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005195 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5196 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5197 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005198
5199 // Handle '\n'.
5200 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5201 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5202 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5203 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5204 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5205 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5206 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005207}
5208
Daniel Jasperf7935112012-12-03 18:12:45 +00005209TEST_F(FormatTest, UnderstandsEquals) {
5210 verifyFormat(
5211 "aaaaaaaaaaaaaaaaa =\n"
5212 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5213 verifyFormat(
5214 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005215 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005216 verifyFormat(
5217 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005218 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005219 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005220 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5221 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005222
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005223 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5224 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005225}
5226
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005227TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005228 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5229 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005230
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005231 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5232 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005233
5234 verifyFormat(
5235 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5236 " Parameter2);");
5237
5238 verifyFormat(
5239 "ShortObject->shortFunction(\n"
5240 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5241 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5242
5243 verifyFormat("loooooooooooooongFunction(\n"
5244 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5245
5246 verifyFormat(
5247 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5248 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5249
Daniel Jasper687af3b2013-02-14 14:26:07 +00005250 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5251 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005252 verifyFormat("void f() {\n"
5253 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5254 " .Times(2)\n"
5255 " .WillRepeatedly(Return(SomeValue));\n"
5256 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005257 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5258 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005259 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005260 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5261 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005262 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005263 verifyFormat("void f() {\n"
5264 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5265 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5266 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005267 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5268 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5269 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5270 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5271 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005272 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5273 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5274 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5275 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5276 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005277
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005278 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005279 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005280 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005281 verifyFormat(
5282 "aaaaaaaaaaa->aaaaaaaaa(\n"
5283 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5284 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005285
5286 verifyFormat(
5287 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5288 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005289 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5290 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5291 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5292 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005293
Daniel Jasper9b334242013-03-15 14:57:30 +00005294 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005295 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5296 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005297
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005298 FormatStyle NoBinPacking = getLLVMStyle();
5299 NoBinPacking.BinPackParameters = false;
5300 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5301 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5302 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5303 " aaaaaaaaaaaaaaaaaaa,\n"
5304 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5305 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005306
5307 // If there is a subsequent call, change to hanging indentation.
5308 verifyFormat(
5309 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5310 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5311 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5312 verifyFormat(
5313 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5314 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005315 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5316 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5317 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5318 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5319 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5320 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005321}
5322
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005323TEST_F(FormatTest, WrapsTemplateDeclarations) {
5324 verifyFormat("template <typename T>\n"
5325 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005326 verifyFormat("template <typename T>\n"
5327 "// T should be one of {A, B}.\n"
5328 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005329 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005330 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005331 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005332 verifyFormat("template <typename T>\n"
5333 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5334 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005335 verifyFormat(
5336 "template <typename T>\n"
5337 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5338 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005339 verifyFormat(
5340 "template <typename T>\n"
5341 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5342 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5343 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005344 verifyFormat("template <typename T>\n"
5345 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005346 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005347 verifyFormat(
5348 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5349 " typename T4 = char>\n"
5350 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005351 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5352 " template <typename> class cccccccccccccccccccccc,\n"
5353 " typename ddddddddddddd>\n"
5354 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005355 verifyFormat(
5356 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5357 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005358
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005359 verifyFormat("void f() {\n"
5360 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5361 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5362 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005363
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005364 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005365 verifyFormat("template <typename T> void f();");
5366 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005367 verifyFormat(
5368 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5369 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5370 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5371 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5372 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5373 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5374 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5375 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005376 EXPECT_EQ("static_cast<A< //\n"
5377 " B> *>(\n"
5378 "\n"
5379 " );",
5380 format("static_cast<A<//\n"
5381 " B>*>(\n"
5382 "\n"
5383 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005384 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5385 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005386
5387 FormatStyle AlwaysBreak = getLLVMStyle();
5388 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5389 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5390 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5391 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5392 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5393 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5394 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5395 verifyFormat("template <template <typename> class Fooooooo,\n"
5396 " template <typename> class Baaaaaaar>\n"
5397 "struct C {};",
5398 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005399 verifyFormat("template <typename T> // T can be A, B or C.\n"
5400 "struct C {};",
5401 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005402 verifyFormat("template <enum E> class A {\n"
5403 "public:\n"
5404 " E *f();\n"
5405 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005406}
5407
Daniel Jasper45797022013-01-25 10:57:27 +00005408TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5409 verifyFormat(
5410 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5411 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5412 verifyFormat(
5413 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5414 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5415 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5416
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005417 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005418 verifyFormat(
5419 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5420 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005421 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005422
Daniel Jasper45797022013-01-25 10:57:27 +00005423 verifyFormat(
5424 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005425 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005426
5427 // Breaking at nested name specifiers is generally not desirable.
5428 verifyFormat(
5429 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5430 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005431
5432 verifyFormat(
5433 "aaaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5434 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5435 " aaaaaaaaaaaaaaaaaaaaa);",
5436 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005437
5438 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5439 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5440 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005441}
5442
Daniel Jasperf7935112012-12-03 18:12:45 +00005443TEST_F(FormatTest, UnderstandsTemplateParameters) {
5444 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005445 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005446 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5447 verifyFormat("bool x = a < 1 || 2 > a;");
5448 verifyFormat("bool x = 5 < f<int>();");
5449 verifyFormat("bool x = f<int>() > 5;");
5450 verifyFormat("bool x = 5 < a<int>::x;");
5451 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5452 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5453
5454 verifyGoogleFormat("A<A<int>> a;");
5455 verifyGoogleFormat("A<A<A<int>>> a;");
5456 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005457 verifyGoogleFormat("A<A<int> > a;");
5458 verifyGoogleFormat("A<A<A<int> > > a;");
5459 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005460 verifyGoogleFormat("A<::A<int>> a;");
5461 verifyGoogleFormat("A<::A> a;");
5462 verifyGoogleFormat("A< ::A> a;");
5463 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005464 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5465 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005466 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5467 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005468 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5469 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005470
Nico Weber7533b4d2014-09-24 17:17:32 +00005471 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5472
Daniel Jasperf7935112012-12-03 18:12:45 +00005473 verifyFormat("test >> a >> b;");
5474 verifyFormat("test << a >> b;");
5475
5476 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005477 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005478 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005479 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5480 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005481 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005482 verifyFormat("f(a.operator()<A>());");
5483 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5484 " .template operator()<A>());",
5485 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005486
5487 // Not template parameters.
5488 verifyFormat("return a < b && c > d;");
5489 verifyFormat("void f() {\n"
5490 " while (a < b && c > d) {\n"
5491 " }\n"
5492 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005493 verifyFormat("template <typename... Types>\n"
5494 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005495
5496 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5497 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5498 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005499 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005500 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005501 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005502}
5503
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005504TEST_F(FormatTest, UnderstandsBinaryOperators) {
5505 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005506 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005507}
5508
5509TEST_F(FormatTest, UnderstandsPointersToMembers) {
5510 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005511 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005512 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005513 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005514 verifyFormat("void f() {\n"
5515 " (a->*f)();\n"
5516 " a->*x;\n"
5517 " (a.*f)();\n"
5518 " ((*a).*f)();\n"
5519 " a.*x;\n"
5520 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005521 verifyFormat("void f() {\n"
5522 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5523 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5524 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005525 verifyFormat(
5526 "(aaaaaaaaaa->*bbbbbbb)(\n"
5527 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005528 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005529 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005530 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005531}
5532
Daniel Jasper8dd40472012-12-21 09:41:31 +00005533TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005534 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005535 verifyFormat("f(-1, -2, -3);");
5536 verifyFormat("a[-1] = 5;");
5537 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005538 verifyFormat("if (i == -1) {\n}");
5539 verifyFormat("if (i != -1) {\n}");
5540 verifyFormat("if (i > -1) {\n}");
5541 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005542 verifyFormat("++(a->f());");
5543 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005544 verifyFormat("(a->f())++;");
5545 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005546 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005547
5548 verifyFormat("a-- > b;");
5549 verifyFormat("b ? -a : c;");
5550 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005551 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005552 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005553 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005554
5555 verifyFormat("return -1;");
5556 verifyFormat("switch (a) {\n"
5557 "case -1:\n"
5558 " break;\n"
5559 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005560 verifyFormat("#define X -1");
5561 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005562
Chandler Carruthf8b72662014-03-02 12:37:31 +00005563 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5564 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005565
5566 verifyFormat("int a = /* confusing comment */ -1;");
5567 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5568 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005569}
5570
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005571TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005572 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005573 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005574 "}");
5575 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005576 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005577 verifyFormat("*aaa = aaaaaaa( // break\n"
5578 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005579}
5580
Daniel Jasper8863ada2013-08-26 08:10:17 +00005581TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005582 verifyFormat("bool operator<();");
5583 verifyFormat("bool operator>();");
5584 verifyFormat("bool operator=();");
5585 verifyFormat("bool operator==();");
5586 verifyFormat("bool operator!=();");
5587 verifyFormat("int operator+();");
5588 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00005589 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005590 verifyFormat("bool operator();");
5591 verifyFormat("bool operator()();");
5592 verifyFormat("bool operator[]();");
5593 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005594 verifyFormat("operator int();");
5595 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005596 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005597 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005598 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005599 verifyFormat("void *operator new(std::size_t size);");
5600 verifyFormat("void *operator new[](std::size_t size);");
5601 verifyFormat("void operator delete(void *ptr);");
5602 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005603 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5604 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005605 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005606 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005607
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005608 verifyFormat(
5609 "ostream &operator<<(ostream &OutputStream,\n"
5610 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005611 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5612 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5613 " return left.group < right.group;\n"
5614 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005615 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005616 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005617
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005618 verifyGoogleFormat("operator void*();");
5619 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005620 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005621
5622 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005623 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5624 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005625}
5626
Daniel Jasper1c220482015-02-25 10:30:06 +00005627TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005628 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5629 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5630 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5631 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5632 verifyFormat("Deleted &operator=(const Deleted &) &;");
5633 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5634 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5635 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5636 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5637 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5638 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005639 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005640 verifyFormat("template <typename T>\n"
5641 "void F(T) && = delete;",
5642 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005643
Daniel Jasperaf642c62015-08-25 13:40:51 +00005644 FormatStyle AlignLeft = getLLVMStyle();
5645 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005646 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005647 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5648 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5649 AlignLeft);
5650 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5651 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005652 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5653 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5654 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5655 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005656 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005657
5658 FormatStyle Spaces = getLLVMStyle();
5659 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005660 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5661 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5662 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5663 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005664
5665 Spaces.SpacesInCStyleCastParentheses = false;
5666 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005667 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5668 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5669 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5670 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005671}
5672
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005673TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005674 verifyFormat("void f() {\n"
5675 " A *a = new A;\n"
5676 " A *a = new (placement) A;\n"
5677 " delete a;\n"
5678 " delete (A *)a;\n"
5679 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005680 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5681 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005682 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5683 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5684 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005685 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005686}
5687
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005688TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005689 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005690 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005691 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005692 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005693 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005694 verifyIndependentOfContext("int a = b * 10;");
5695 verifyIndependentOfContext("int a = 10 * b;");
5696 verifyIndependentOfContext("int a = b * c;");
5697 verifyIndependentOfContext("int a += b * c;");
5698 verifyIndependentOfContext("int a -= b * c;");
5699 verifyIndependentOfContext("int a *= b * c;");
5700 verifyIndependentOfContext("int a /= b * c;");
5701 verifyIndependentOfContext("int a = *b;");
5702 verifyIndependentOfContext("int a = *b * c;");
5703 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005704 verifyIndependentOfContext("int a = b * (10);");
5705 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005706 verifyIndependentOfContext("return 10 * b;");
5707 verifyIndependentOfContext("return *b * *c;");
5708 verifyIndependentOfContext("return a & ~b;");
5709 verifyIndependentOfContext("f(b ? *c : *d);");
5710 verifyIndependentOfContext("int a = b ? *c : *d;");
5711 verifyIndependentOfContext("*b = a;");
5712 verifyIndependentOfContext("a * ~b;");
5713 verifyIndependentOfContext("a * !b;");
5714 verifyIndependentOfContext("a * +b;");
5715 verifyIndependentOfContext("a * -b;");
5716 verifyIndependentOfContext("a * ++b;");
5717 verifyIndependentOfContext("a * --b;");
5718 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005719 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005720 verifyIndependentOfContext("f() * b;");
5721 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005722 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005723 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005724 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005725 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005726 verifyIndependentOfContext("return sizeof(int **);");
5727 verifyIndependentOfContext("return sizeof(int ******);");
5728 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005729 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005730 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005731 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005732 verifyGoogleFormat("return sizeof(int**);");
5733 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5734 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005735 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005736 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005737 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005738 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005739 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005740 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005741 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005742 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005743 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005744 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005745 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005746 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005747 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005748 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005749 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005750 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasper27234032012-12-07 09:52:15 +00005751
Daniel Jasper5b49f472013-01-23 12:10:53 +00005752 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005753
Daniel Jasper5b49f472013-01-23 12:10:53 +00005754 verifyIndependentOfContext("A<int *> a;");
5755 verifyIndependentOfContext("A<int **> a;");
5756 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005757 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005758 verifyIndependentOfContext(
5759 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005760 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005761 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005762 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005763 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005764 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005765
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005766 verifyFormat(
5767 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5768 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5769
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005770 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005771 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005772 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005773 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005774 verifyGoogleFormat("A<int*> a;");
5775 verifyGoogleFormat("A<int**> a;");
5776 verifyGoogleFormat("A<int*, int*> a;");
5777 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005778 verifyGoogleFormat("f(b ? *c : *d);");
5779 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005780 verifyGoogleFormat("Type* t = **x;");
5781 verifyGoogleFormat("Type* t = *++*x;");
5782 verifyGoogleFormat("*++*x;");
5783 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5784 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005785 verifyGoogleFormat(
5786 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005787 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005788 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5789 verifyGoogleFormat("template <typename T>\n"
5790 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005791
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005792 FormatStyle Left = getLLVMStyle();
5793 Left.PointerAlignment = FormatStyle::PAS_Left;
5794 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005795 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005796 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005797
Daniel Jasper5b49f472013-01-23 12:10:53 +00005798 verifyIndependentOfContext("a = *(x + y);");
5799 verifyIndependentOfContext("a = &(x + y);");
5800 verifyIndependentOfContext("*(x + y).call();");
5801 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005802 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005803
Daniel Jasper5b49f472013-01-23 12:10:53 +00005804 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005805 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005806 "int *MyValues = {\n"
5807 " *A, // Operator detection might be confused by the '{'\n"
5808 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005809 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005810
Daniel Jasper5b49f472013-01-23 12:10:53 +00005811 verifyIndependentOfContext("if (int *a = &b)");
5812 verifyIndependentOfContext("if (int &a = *b)");
5813 verifyIndependentOfContext("if (a & b[i])");
5814 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5815 verifyIndependentOfContext("if (*b[i])");
5816 verifyIndependentOfContext("if (int *a = (&b))");
5817 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005818 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005819 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005820 verifyFormat("void f() {\n"
5821 " for (const int &v : Values) {\n"
5822 " }\n"
5823 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005824 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5825 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005826 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005827
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005828 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005829 verifyFormat("#define MACRO \\\n"
5830 " int *i = a * b; \\\n"
5831 " void f(a *b);",
5832 getLLVMStyleWithColumns(19));
5833
Daniel Jasper97b89482013-03-13 07:49:51 +00005834 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005835 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005836 verifyIndependentOfContext("T **t = new T *;");
5837 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005838 verifyGoogleFormat("A = new SomeType*[Length]();");
5839 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005840 verifyGoogleFormat("T** t = new T*;");
5841 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005842
Daniel Jasper990ff972013-05-07 14:17:18 +00005843 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005844 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00005845 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00005846 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5847 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005848 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005849 "typename t::if<x && y>::type f() {}");
5850 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005851 verifyFormat("vector<int *> v;");
5852 verifyFormat("vector<int *const> v;");
5853 verifyFormat("vector<int *const **const *> v;");
5854 verifyFormat("vector<int *volatile> v;");
5855 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005856 verifyFormat("foo<b && false>();");
5857 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005858 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005859 verifyFormat(
5860 "template <class T, class = typename std::enable_if<\n"
5861 " std::is_integral<T>::value &&\n"
5862 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005863 "void F();",
5864 getLLVMStyleWithColumns(76));
5865 verifyFormat(
5866 "template <class T,\n"
5867 " class = typename ::std::enable_if<\n"
5868 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5869 "void F();",
5870 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005871
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005872 verifyIndependentOfContext("MACRO(int *i);");
5873 verifyIndependentOfContext("MACRO(auto *a);");
5874 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00005875 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00005876 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005877 // FIXME: Is there a way to make this work?
5878 // verifyIndependentOfContext("MACRO(A *a);");
5879
Daniel Jasper32ccb032014-06-23 07:36:18 +00005880 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005881 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005882
Daniel Jasper866468a2014-04-14 13:15:29 +00005883 EXPECT_EQ("#define OP(x) \\\n"
5884 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5885 " return s << a.DebugString(); \\\n"
5886 " }",
5887 format("#define OP(x) \\\n"
5888 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5889 " return s << a.DebugString(); \\\n"
5890 " }",
5891 getLLVMStyleWithColumns(50)));
5892
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005893 // FIXME: We cannot handle this case yet; we might be able to figure out that
5894 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005895 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005896
5897 FormatStyle PointerMiddle = getLLVMStyle();
5898 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5899 verifyFormat("delete *x;", PointerMiddle);
5900 verifyFormat("int * x;", PointerMiddle);
5901 verifyFormat("template <int * y> f() {}", PointerMiddle);
5902 verifyFormat("int * f(int * a) {}", PointerMiddle);
5903 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5904 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5905 verifyFormat("A<int *> a;", PointerMiddle);
5906 verifyFormat("A<int **> a;", PointerMiddle);
5907 verifyFormat("A<int *, int *> a;", PointerMiddle);
5908 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005909 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5910 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005911 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005912
5913 // Member function reference qualifiers aren't binary operators.
5914 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005915 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005916 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005917 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005918 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005919 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005920}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005921
Daniel Jasperee6d6502013-07-17 20:25:02 +00005922TEST_F(FormatTest, UnderstandsAttributes) {
5923 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005924 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5925 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005926 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005927 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005928 verifyFormat("__attribute__((nodebug)) void\n"
5929 "foo() {}\n",
5930 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005931}
5932
Daniel Jasper10cd5812013-05-06 06:35:44 +00005933TEST_F(FormatTest, UnderstandsEllipsis) {
5934 verifyFormat("int printf(const char *fmt, ...);");
5935 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005936 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5937
5938 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005939 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005940 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005941}
5942
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005943TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005944 EXPECT_EQ("int *a;\n"
5945 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005946 "int *a;",
5947 format("int *a;\n"
5948 "int* a;\n"
5949 "int *a;",
5950 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005951 EXPECT_EQ("int* a;\n"
5952 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005953 "int* a;",
5954 format("int* a;\n"
5955 "int* a;\n"
5956 "int *a;",
5957 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005958 EXPECT_EQ("int *a;\n"
5959 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005960 "int *a;",
5961 format("int *a;\n"
5962 "int * a;\n"
5963 "int * a;",
5964 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005965 EXPECT_EQ("auto x = [] {\n"
5966 " int *a;\n"
5967 " int *a;\n"
5968 " int *a;\n"
5969 "};",
5970 format("auto x=[]{int *a;\n"
5971 "int * a;\n"
5972 "int * a;};",
5973 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005974}
5975
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005976TEST_F(FormatTest, UnderstandsRvalueReferences) {
5977 verifyFormat("int f(int &&a) {}");
5978 verifyFormat("int f(int a, char &&b) {}");
5979 verifyFormat("void f() { int &&a = b; }");
5980 verifyGoogleFormat("int f(int a, char&& b) {}");
5981 verifyGoogleFormat("void f() { int&& a = b; }");
5982
Daniel Jasper1eff9082013-05-27 16:36:33 +00005983 verifyIndependentOfContext("A<int &&> a;");
5984 verifyIndependentOfContext("A<int &&, int &&> a;");
5985 verifyGoogleFormat("A<int&&> a;");
5986 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00005987
5988 // Not rvalue references:
5989 verifyFormat("template <bool B, bool C> class A {\n"
5990 " static_assert(B && C, \"Something is wrong\");\n"
5991 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00005992 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
5993 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00005994 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005995}
5996
Manuel Klimekc1237a82013-01-23 14:08:21 +00005997TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
5998 verifyFormat("void f() {\n"
5999 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006000 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006001 "}",
6002 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006003}
6004
Daniel Jasperef906a92013-01-13 08:01:36 +00006005TEST_F(FormatTest, FormatsCasts) {
6006 verifyFormat("Type *A = static_cast<Type *>(P);");
6007 verifyFormat("Type *A = (Type *)P;");
6008 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6009 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006010 verifyFormat("int a = (int)2.0f;");
6011 verifyFormat("x[(int32)y];");
6012 verifyFormat("x = (int32)y;");
6013 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6014 verifyFormat("int a = (int)*b;");
6015 verifyFormat("int a = (int)2.0f;");
6016 verifyFormat("int a = (int)~0;");
6017 verifyFormat("int a = (int)++a;");
6018 verifyFormat("int a = (int)sizeof(int);");
6019 verifyFormat("int a = (int)+2;");
6020 verifyFormat("my_int a = (my_int)2.0f;");
6021 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006022 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006023 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006024 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006025 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006026 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006027
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006028 verifyFormat("void f() { my_int a = (my_int)*b; }");
6029 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6030 verifyFormat("my_int a = (my_int)~0;");
6031 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006032 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006033 verifyFormat("my_int a = (my_int)1;");
6034 verifyFormat("my_int a = (my_int *)1;");
6035 verifyFormat("my_int a = (const my_int)-1;");
6036 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006037 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006038 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006039 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006040 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006041
6042 // FIXME: single value wrapped with paren will be treated as cast.
6043 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006044
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006045 verifyFormat("{ (void)F; }");
6046
Daniel Jasper998cabc2013-07-18 14:46:07 +00006047 // Don't break after a cast's
6048 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6049 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6050 " bbbbbbbbbbbbbbbbbbbbbb);");
6051
Daniel Jasperef906a92013-01-13 08:01:36 +00006052 // These are not casts.
6053 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006054 verifyFormat("f(foo)->b;");
6055 verifyFormat("f(foo).b;");
6056 verifyFormat("f(foo)(b);");
6057 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006058 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006059 verifyFormat("(*funptr)(foo)[4];");
6060 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006061 verifyFormat("void f(int *);");
6062 verifyFormat("void f(int *) = 0;");
6063 verifyFormat("void f(SmallVector<int>) {}");
6064 verifyFormat("void f(SmallVector<int>);");
6065 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006066 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006067 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006068 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006069 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6070 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006071 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006072
Daniel Jasperba0bda92013-02-23 08:07:18 +00006073 // These are not casts, but at some point were confused with casts.
6074 verifyFormat("virtual void foo(int *) override;");
6075 verifyFormat("virtual void foo(char &) const;");
6076 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006077 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006078 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006079 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006080 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006081
6082 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6083 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006084 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006085 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006086 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6087 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6088 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006089}
6090
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006091TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006092 verifyFormat("A<bool()> a;");
6093 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006094 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006095 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006096 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006097 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006098 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006099 verifyFormat("template <class CallbackClass>\n"
6100 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006101
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006102 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6103 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006104 verifyGoogleFormat(
6105 "template <class CallbackClass>\n"
6106 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006107
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006108 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006109 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006110 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006111 verifyFormat("some_var = function(*some_pointer_var)[0];");
6112 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006113 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006114 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006115}
6116
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006117TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6118 verifyFormat("A (*foo_)[6];");
6119 verifyFormat("vector<int> (*foo_)[6];");
6120}
6121
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006122TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6123 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6124 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6125 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6126 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006127 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6128 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006129
6130 // Different ways of ()-initializiation.
6131 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6132 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6133 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6134 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6135 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6136 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006137 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6138 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006139}
6140
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006141TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006142 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006143 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006144 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006145 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006146 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006147 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006148 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6149 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006150 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6151 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006152 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6153 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006154 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6155 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006156 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6157 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006158 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6159 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6160 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6161 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006162 FormatStyle Indented = getLLVMStyle();
6163 Indented.IndentWrappedFunctionNames = true;
6164 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6165 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6166 Indented);
6167 verifyFormat(
6168 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6169 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6170 Indented);
6171 verifyFormat(
6172 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6173 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6174 Indented);
6175 verifyFormat(
6176 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6177 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6178 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006179
6180 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006181 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6182 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6183 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006184
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006185 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006186 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006187 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006188 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6189 " SourceLocation L, IdentifierIn *II,\n"
6190 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006191 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006192 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006193 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006194 " const SomeType<string, SomeOtherTemplateParameter>\n"
6195 " &ReallyReallyLongParameterName,\n"
6196 " const SomeType<string, SomeOtherTemplateParameter>\n"
6197 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006198 verifyFormat("template <typename A>\n"
6199 "SomeLoooooooooooooooooooooongType<\n"
6200 " typename some_namespace::SomeOtherType<A>::Type>\n"
6201 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006202
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006203 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006204 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6205 " aaaaaaaaaaaaaaaaaaaaaaa;");
6206 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006207 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6208 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006209 verifyGoogleFormat(
6210 "some_namespace::LongReturnType\n"
6211 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006212 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006213
6214 verifyGoogleFormat("template <typename T>\n"
6215 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006216 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006217 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6218 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006219
6220 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006221 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6222 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006223 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6224 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6225 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6226 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6227 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6228 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6229 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006230}
6231
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006232TEST_F(FormatTest, FormatsArrays) {
6233 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6234 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006235 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6236 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006237 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6238 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006239 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6240 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6241 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6242 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6243 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6244 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6245 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6246 verifyFormat(
6247 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6248 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6249 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006250 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6251 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006252
6253 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6254 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006255 verifyFormat(
6256 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6257 " .aaaaaaa[0]\n"
6258 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006259 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006260
6261 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006262
6263 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6264 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006265}
6266
Daniel Jaspere9de2602012-12-06 09:56:08 +00006267TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6268 verifyFormat("(a)->b();");
6269 verifyFormat("--a;");
6270}
6271
Daniel Jasper8b529712012-12-04 13:02:32 +00006272TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006273 verifyFormat("#include <string>\n"
6274 "#include <a/b/c.h>\n"
6275 "#include \"a/b/string\"\n"
6276 "#include \"string.h\"\n"
6277 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006278 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006279 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006280 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006281 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006282 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006283 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6284 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006285 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6286 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006287
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006288 verifyFormat("#import <string>");
6289 verifyFormat("#import <a/b/c.h>");
6290 verifyFormat("#import \"a/b/string\"");
6291 verifyFormat("#import \"string.h\"");
6292 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006293 verifyFormat("#if __has_include(<strstream>)\n"
6294 "#include <strstream>\n"
6295 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006296
Daniel Jasper343643b2014-08-13 08:29:18 +00006297 verifyFormat("#define MY_IMPORT <a/b>");
6298
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006299 // Protocol buffer definition or missing "#".
6300 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6301 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006302
6303 FormatStyle Style = getLLVMStyle();
6304 Style.AlwaysBreakBeforeMultilineStrings = true;
6305 Style.ColumnLimit = 0;
6306 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006307
6308 // But 'import' might also be a regular C++ namespace.
6309 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6310 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006311}
6312
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006313//===----------------------------------------------------------------------===//
6314// Error recovery tests.
6315//===----------------------------------------------------------------------===//
6316
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006317TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006318 FormatStyle NoBinPacking = getLLVMStyle();
6319 NoBinPacking.BinPackParameters = false;
6320 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6321 " double *min_x,\n"
6322 " double *max_x,\n"
6323 " double *min_y,\n"
6324 " double *max_y,\n"
6325 " double *min_z,\n"
6326 " double *max_z, ) {}",
6327 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006328}
6329
Daniel Jasper83a54d22013-01-10 09:26:47 +00006330TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006331 verifyFormat("void f() { return; }\n42");
6332 verifyFormat("void f() {\n"
6333 " if (0)\n"
6334 " return;\n"
6335 "}\n"
6336 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006337 verifyFormat("void f() { return }\n42");
6338 verifyFormat("void f() {\n"
6339 " if (0)\n"
6340 " return\n"
6341 "}\n"
6342 "42");
6343}
6344
6345TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6346 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6347 EXPECT_EQ("void f() {\n"
6348 " if (a)\n"
6349 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006350 "}",
6351 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006352 EXPECT_EQ("namespace N {\n"
6353 "void f()\n"
6354 "}",
6355 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006356 EXPECT_EQ("namespace N {\n"
6357 "void f() {}\n"
6358 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006359 "}",
6360 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006361}
6362
Daniel Jasper2df93312013-01-09 10:16:05 +00006363TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6364 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006365 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006366 " b;",
6367 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006368 verifyFormat("function(\n"
6369 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006370 " LoooooooooooongArgument);\n",
6371 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006372}
6373
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006374TEST_F(FormatTest, IncorrectAccessSpecifier) {
6375 verifyFormat("public:");
6376 verifyFormat("class A {\n"
6377 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006378 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006379 "};");
6380 verifyFormat("public\n"
6381 "int qwerty;");
6382 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006383 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006384 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006385 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006386 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006387 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006388}
Daniel Jasperf7935112012-12-03 18:12:45 +00006389
Daniel Jasper291f9362013-03-20 15:58:10 +00006390TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6391 verifyFormat("{");
6392 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006393 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006394}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006395
6396TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006397 verifyFormat("do {\n}");
6398 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006399 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006400 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006401 "wheeee(fun);");
6402 verifyFormat("do {\n"
6403 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006404 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006405}
6406
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006407TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006408 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006409 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006410 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006411 verifyFormat("while {\n foo;\n foo();\n}");
6412 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006413}
6414
Daniel Jasperc0880a92013-01-04 18:52:56 +00006415TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006416 verifyIncompleteFormat("namespace {\n"
6417 "class Foo { Foo (\n"
6418 "};\n"
6419 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006420}
6421
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006422TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006423 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006424 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6425 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006426 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006427
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006428 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006429 " {\n"
6430 " breakme(\n"
6431 " qwe);\n"
6432 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006433 format("{\n"
6434 " {\n"
6435 " breakme(qwe);\n"
6436 "}\n",
6437 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006438}
6439
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006440TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006441 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006442 " avariable,\n"
6443 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006444 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006445}
6446
Manuel Klimek762dd182013-01-21 10:07:49 +00006447TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006448 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006449}
6450
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006451TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006452 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006453 verifyFormat("vector<int> x{\n"
6454 " 1, 2, 3, 4,\n"
6455 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006456 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6457 verifyFormat("f({1, 2});");
6458 verifyFormat("auto v = Foo{-1};");
6459 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6460 verifyFormat("Class::Class : member{1, 2, 3} {}");
6461 verifyFormat("new vector<int>{1, 2, 3};");
6462 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006463 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006464 verifyFormat("return {arg1, arg2};");
6465 verifyFormat("return {arg1, SomeType{parameter}};");
6466 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6467 verifyFormat("new T{arg1, arg2};");
6468 verifyFormat("f(MyMap[{composite, key}]);");
6469 verifyFormat("class Class {\n"
6470 " T member = {arg1, arg2};\n"
6471 "};");
6472 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006473 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6474 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006475
Daniel Jasper438059e2014-05-22 12:11:13 +00006476 verifyFormat("int foo(int i) { return fo1{}(i); }");
6477 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006478 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006479 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006480 verifyFormat("Node n{1, Node{1000}, //\n"
6481 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006482 verifyFormat("Aaaa aaaaaaa{\n"
6483 " {\n"
6484 " aaaa,\n"
6485 " },\n"
6486 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006487 verifyFormat("class C : public D {\n"
6488 " SomeClass SC{2};\n"
6489 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006490 verifyFormat("class C : public A {\n"
6491 " class D : public B {\n"
6492 " void f() { int i{2}; }\n"
6493 " };\n"
6494 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006495 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006496
Daniel Jasper08434342015-05-26 07:26:26 +00006497 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006498 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006499 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006500 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6501 " bbbbb,\n"
6502 " ccccc,\n"
6503 " ddddd,\n"
6504 " eeeee,\n"
6505 " ffffff,\n"
6506 " ggggg,\n"
6507 " hhhhhh,\n"
6508 " iiiiii,\n"
6509 " jjjjjj,\n"
6510 " kkkkkk};",
6511 NoBinPacking);
6512 verifyFormat("const Aaaaaa aaaaa = {\n"
6513 " aaaaa,\n"
6514 " bbbbb,\n"
6515 " ccccc,\n"
6516 " ddddd,\n"
6517 " eeeee,\n"
6518 " ffffff,\n"
6519 " ggggg,\n"
6520 " hhhhhh,\n"
6521 " iiiiii,\n"
6522 " jjjjjj,\n"
6523 " kkkkkk,\n"
6524 "};",
6525 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006526 verifyFormat(
6527 "const Aaaaaa aaaaa = {\n"
6528 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6529 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6530 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6531 "};",
6532 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006533
Chandler Carruthf8b72662014-03-02 12:37:31 +00006534 // FIXME: The alignment of these trailing comments might be bad. Then again,
6535 // this might be utterly useless in real code.
6536 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006537 " : some_value{ //\n"
6538 " aaaaaaa, //\n"
6539 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006540
Chandler Carruthf8b72662014-03-02 12:37:31 +00006541 // In braced lists, the first comment is always assumed to belong to the
6542 // first element. Thus, it can be moved to the next or previous line as
6543 // appropriate.
6544 EXPECT_EQ("function({// First element:\n"
6545 " 1,\n"
6546 " // Second element:\n"
6547 " 2});",
6548 format("function({\n"
6549 " // First element:\n"
6550 " 1,\n"
6551 " // Second element:\n"
6552 " 2});"));
6553 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6554 " // First element:\n"
6555 " 1,\n"
6556 " // Second element:\n"
6557 " 2};",
6558 format("std::vector<int> MyNumbers{// First element:\n"
6559 " 1,\n"
6560 " // Second element:\n"
6561 " 2};",
6562 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00006563 // A trailing comma should still lead to an enforced line break.
6564 EXPECT_EQ("vector<int> SomeVector = {\n"
6565 " // aaa\n"
6566 " 1, 2,\n"
6567 "};",
6568 format("vector<int> SomeVector = { // aaa\n"
6569 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006570
Chandler Carruthf8b72662014-03-02 12:37:31 +00006571 FormatStyle ExtraSpaces = getLLVMStyle();
6572 ExtraSpaces.Cpp11BracedListStyle = false;
6573 ExtraSpaces.ColumnLimit = 75;
6574 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6575 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6576 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6577 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6578 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6579 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6580 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6581 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6582 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6583 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6584 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6585 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6586 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6587 verifyFormat("class Class {\n"
6588 " T member = { arg1, arg2 };\n"
6589 "};",
6590 ExtraSpaces);
6591 verifyFormat(
6592 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6593 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6594 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6595 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6596 ExtraSpaces);
6597 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006598 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006599 ExtraSpaces);
6600 verifyFormat(
6601 "someFunction(OtherParam,\n"
6602 " BracedList{ // comment 1 (Forcing interesting break)\n"
6603 " param1, param2,\n"
6604 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006605 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006606 ExtraSpaces);
6607 verifyFormat(
6608 "std::this_thread::sleep_for(\n"
6609 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6610 ExtraSpaces);
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006611 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaa{\n"
6612 " aaaaaaa,\n"
6613 " aaaaaaaaaa,\n"
6614 " aaaaa,\n"
6615 " aaaaaaaaaaaaaaa,\n"
6616 " aaa,\n"
6617 " aaaaaaaaaa,\n"
6618 " a,\n"
6619 " aaaaaaaaaaaaaaaaaaaaa,\n"
6620 " aaaaaaaaaaaa,\n"
6621 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6622 " aaaaaaa,\n"
6623 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006624 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006625}
6626
Daniel Jasper33b909c2013-10-25 14:29:37 +00006627TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006628 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6629 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6630 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6631 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6632 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6633 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006634 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006635 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006636 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006637 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6638 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006639 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006640 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6641 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6642 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6643 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6644 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6645 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6646 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006647 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006648 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6649 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006650 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6651 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6652 " // Separating comment.\n"
6653 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6654 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6655 " // Leading comment\n"
6656 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6657 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006658 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6659 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006660 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006661 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6662 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006663 getLLVMStyleWithColumns(38));
6664 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006665 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6666 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006667 verifyFormat(
6668 "static unsigned SomeValues[10][3] = {\n"
6669 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6670 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6671 verifyFormat("static auto fields = new vector<string>{\n"
6672 " \"aaaaaaaaaaaaa\",\n"
6673 " \"aaaaaaaaaaaaa\",\n"
6674 " \"aaaaaaaaaaaa\",\n"
6675 " \"aaaaaaaaaaaaaa\",\n"
6676 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6677 " \"aaaaaaaaaaaa\",\n"
6678 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6679 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006680 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6681 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6682 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6683 " 3, cccccccccccccccccccccc};",
6684 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006685
6686 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006687 verifyFormat("vector<int> x = {\n"
6688 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6689 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006690 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006691 verifyFormat("vector<int> x = {\n"
6692 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006693 "};",
6694 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006695 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6696 " 1, 1, 1, 1,\n"
6697 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006698 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006699
Daniel Jasper60c27072015-05-13 08:16:00 +00006700 // Trailing comment in the first line.
6701 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6702 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6703 " 111111111, 222222222, 3333333333, 444444444, //\n"
6704 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006705 // Trailing comment in the last line.
6706 verifyFormat("int aaaaa[] = {\n"
6707 " 1, 2, 3, // comment\n"
6708 " 4, 5, 6 // comment\n"
6709 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006710
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006711 // With nested lists, we should either format one item per line or all nested
6712 // lists one on line.
6713 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006714 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6715 " {aaaaaaaaaaaaaaaaaaa},\n"
6716 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6717 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006718 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006719 verifyFormat(
6720 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006721 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6722 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6723 " {aaa, aaa},\n"
6724 " {aaa, aaa},\n"
6725 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6726 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6727 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006728
6729 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006730 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
6731 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006732
6733 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006734
Daniel Jaspereb65e912015-12-21 18:31:15 +00006735 // No braced initializer here.
6736 verifyFormat("void f() {\n"
6737 " struct Dummy {};\n"
6738 " f(v);\n"
6739 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006740
6741 // Long lists should be formatted in columns even if they are nested.
6742 verifyFormat(
6743 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6744 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6745 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6746 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6747 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6748 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006749}
6750
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006751TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006752 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006753 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006754
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006755 verifyFormat("void f() { return 42; }");
6756 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006757 " return 42;\n"
6758 "}",
6759 DoNotMerge);
6760 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006761 " // Comment\n"
6762 "}");
6763 verifyFormat("{\n"
6764 "#error {\n"
6765 " int a;\n"
6766 "}");
6767 verifyFormat("{\n"
6768 " int a;\n"
6769 "#error {\n"
6770 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006771 verifyFormat("void f() {} // comment");
6772 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006773 verifyFormat("void f() {\n"
6774 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006775 DoNotMerge);
6776 verifyFormat("void f() {\n"
6777 " int a;\n"
6778 "} // comment",
6779 DoNotMerge);
6780 verifyFormat("void f() {\n"
6781 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006782 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006783
6784 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6785 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6786
6787 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6788 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006789 verifyFormat("class C {\n"
6790 " C()\n"
6791 " : iiiiiiii(nullptr),\n"
6792 " kkkkkkk(nullptr),\n"
6793 " mmmmmmm(nullptr),\n"
6794 " nnnnnnn(nullptr) {}\n"
6795 "};",
6796 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006797
6798 FormatStyle NoColumnLimit = getLLVMStyle();
6799 NoColumnLimit.ColumnLimit = 0;
6800 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6801 EXPECT_EQ("class C {\n"
6802 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006803 "};",
6804 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006805 EXPECT_EQ("A()\n"
6806 " : b(0) {\n"
6807 "}",
6808 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6809
6810 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006811 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6812 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006813 EXPECT_EQ("A()\n"
6814 " : b(0) {\n"
6815 "}",
6816 format("A():b(0){}", DoNotMergeNoColumnLimit));
6817 EXPECT_EQ("A()\n"
6818 " : b(0) {\n"
6819 "}",
6820 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006821
6822 verifyFormat("#define A \\\n"
6823 " void f() { \\\n"
6824 " int i; \\\n"
6825 " }",
6826 getLLVMStyleWithColumns(20));
6827 verifyFormat("#define A \\\n"
6828 " void f() { int i; }",
6829 getLLVMStyleWithColumns(21));
6830 verifyFormat("#define A \\\n"
6831 " void f() { \\\n"
6832 " int i; \\\n"
6833 " } \\\n"
6834 " int j;",
6835 getLLVMStyleWithColumns(22));
6836 verifyFormat("#define A \\\n"
6837 " void f() { int i; } \\\n"
6838 " int j;",
6839 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006840}
6841
Daniel Jasperd74cf402014-04-08 12:46:38 +00006842TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6843 FormatStyle MergeInlineOnly = getLLVMStyle();
6844 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6845 verifyFormat("class C {\n"
6846 " int f() { return 42; }\n"
6847 "};",
6848 MergeInlineOnly);
6849 verifyFormat("int f() {\n"
6850 " return 42;\n"
6851 "}",
6852 MergeInlineOnly);
6853}
6854
Manuel Klimeke01bab52013-01-15 13:38:33 +00006855TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6856 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006857 verifyFormat("struct foo a = {bar};\nint n;");
6858 verifyFormat("class foo a = {bar};\nint n;");
6859 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006860
6861 // Elaborate types inside function definitions.
6862 verifyFormat("struct foo f() {}\nint n;");
6863 verifyFormat("class foo f() {}\nint n;");
6864 verifyFormat("union foo f() {}\nint n;");
6865
6866 // Templates.
6867 verifyFormat("template <class X> void f() {}\nint n;");
6868 verifyFormat("template <struct X> void f() {}\nint n;");
6869 verifyFormat("template <union X> void f() {}\nint n;");
6870
6871 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006872 verifyFormat("struct {\n} n;");
6873 verifyFormat(
6874 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006875 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006876 verifyFormat("class MACRO Z {\n} n;");
6877 verifyFormat("class MACRO(X) Z {\n} n;");
6878 verifyFormat("class __attribute__(X) Z {\n} n;");
6879 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006880 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006881 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006882 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6883 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006884
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006885 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006886 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006887
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006888 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006889 verifyFormat(
6890 "template <typename F>\n"
6891 "Matcher(const Matcher<F> &Other,\n"
6892 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6893 " !is_same<F, T>::value>::type * = 0)\n"
6894 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6895
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006896 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006897 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006898 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006899
6900 // FIXME:
6901 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006902 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006903
Manuel Klimeke01bab52013-01-15 13:38:33 +00006904 // Elaborate types where incorrectly parsing the structural element would
6905 // break the indent.
6906 verifyFormat("if (true)\n"
6907 " class X x;\n"
6908 "else\n"
6909 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006910
6911 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006912 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006913}
6914
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006915TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00006916 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
6917 format("#error Leave all white!!!!! space* alone!\n"));
6918 EXPECT_EQ(
6919 "#warning Leave all white!!!!! space* alone!\n",
6920 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006921 EXPECT_EQ("#error 1", format(" # error 1"));
6922 EXPECT_EQ("#warning 1", format(" # warning 1"));
6923}
6924
Daniel Jasper4431aa92013-04-23 13:54:04 +00006925TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00006926 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00006927 verifyFormat("#if (AAAA && BBBB)");
6928 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00006929 // FIXME: Come up with a better indentation for #elif.
6930 verifyFormat(
6931 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
6932 " defined(BBBBBBBB)\n"
6933 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
6934 " defined(BBBBBBBB)\n"
6935 "#endif",
6936 getLLVMStyleWithColumns(65));
6937}
6938
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006939TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
6940 FormatStyle AllowsMergedIf = getGoogleStyle();
6941 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
6942 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
6943 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00006944 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
6945 EXPECT_EQ("if (true) return 42;",
6946 format("if (true)\nreturn 42;", AllowsMergedIf));
6947 FormatStyle ShortMergedIf = AllowsMergedIf;
6948 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006949 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006950 " if (true) return 42;",
6951 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006952 verifyFormat("#define A \\\n"
6953 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006954 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006955 "#define B",
6956 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006957 verifyFormat("#define A \\\n"
6958 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006959 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006960 "g();",
6961 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00006962 verifyFormat("{\n"
6963 "#ifdef A\n"
6964 " // Comment\n"
6965 " if (true) continue;\n"
6966 "#endif\n"
6967 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00006968 " if (true) continue;\n"
6969 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006970 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00006971 ShortMergedIf.ColumnLimit = 29;
6972 verifyFormat("#define A \\\n"
6973 " if (aaaaaaaaaa) return 1; \\\n"
6974 " return 2;",
6975 ShortMergedIf);
6976 ShortMergedIf.ColumnLimit = 28;
6977 verifyFormat("#define A \\\n"
6978 " if (aaaaaaaaaa) \\\n"
6979 " return 1; \\\n"
6980 " return 2;",
6981 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006982}
6983
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00006984TEST_F(FormatTest, BlockCommentsInControlLoops) {
6985 verifyFormat("if (0) /* a comment in a strange place */ {\n"
6986 " f();\n"
6987 "}");
6988 verifyFormat("if (0) /* a comment in a strange place */ {\n"
6989 " f();\n"
6990 "} /* another comment */ else /* comment #3 */ {\n"
6991 " g();\n"
6992 "}");
6993 verifyFormat("while (0) /* a comment in a strange place */ {\n"
6994 " f();\n"
6995 "}");
6996 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
6997 " f();\n"
6998 "}");
6999 verifyFormat("do /* a comment in a strange place */ {\n"
7000 " f();\n"
7001 "} /* another comment */ while (0);");
7002}
7003
7004TEST_F(FormatTest, BlockComments) {
7005 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7006 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007007 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007008 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007009 " b\n"
7010 "/* */\n"
7011 "someCall(\n"
7012 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007013 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007014 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007015 "someCall(parameter);",
7016 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007017
7018 EXPECT_EQ("#define A\n"
7019 "/* */ someCall(\n"
7020 " parameter);",
7021 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007022 "/* */someCall(parameter);",
7023 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007024 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007025 EXPECT_EQ("/*\n"
7026 "*\n"
7027 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007028 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007029 "*/",
7030 format("/*\n"
7031 "*\n"
7032 " * aaaaaa aaaaaa\n"
7033 "*/",
7034 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007035 EXPECT_EQ("/*\n"
7036 "**\n"
7037 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007038 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007039 "*/",
7040 format("/*\n"
7041 "**\n"
7042 "* aaaaaa aaaaaa\n"
7043 "*/",
7044 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007045 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7046 " /* line 1\n"
7047 " bbbbbbbbbbbb */\n"
7048 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7049 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7050 " /* line 1\n"
7051 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7052 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007053
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007054 FormatStyle NoBinPacking = getLLVMStyle();
7055 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007056 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7057 " 2, /* comment 2 */\n"
7058 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007059 " aaaa,\n"
7060 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007061 format("someFunction (1, /* comment 1 */\n"
7062 " 2, /* comment 2 */ \n"
7063 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007064 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007065 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007066 verifyFormat(
7067 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7068 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7069 EXPECT_EQ(
7070 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7071 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7072 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7073 format(
7074 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7075 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7076 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007077 EXPECT_EQ(
7078 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7079 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7080 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7081 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7082 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7083 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007084
7085 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007086
7087 EXPECT_EQ("/*\n"
7088 " **\n"
7089 " */",
7090 format("/*\n"
7091 " **\n"
7092 " */"));
7093 EXPECT_EQ("/*\n"
7094 " *q\n"
7095 " */",
7096 format("/*\n"
7097 " *q\n"
7098 " */"));
7099 EXPECT_EQ("/*\n"
7100 " * q\n"
7101 " */",
7102 format("/*\n"
7103 " * q\n"
7104 " */"));
7105 EXPECT_EQ("/*\n"
7106 " **/",
7107 format("/*\n"
7108 " **/"));
7109 EXPECT_EQ("/*\n"
7110 " ***/",
7111 format("/*\n"
7112 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007113}
7114
Manuel Klimek82b836a2013-02-06 16:40:56 +00007115TEST_F(FormatTest, BlockCommentsInMacros) {
7116 EXPECT_EQ("#define A \\\n"
7117 " { \\\n"
7118 " /* one line */ \\\n"
7119 " someCall();",
7120 format("#define A { \\\n"
7121 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007122 " someCall();",
7123 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007124 EXPECT_EQ("#define A \\\n"
7125 " { \\\n"
7126 " /* previous */ \\\n"
7127 " /* one line */ \\\n"
7128 " someCall();",
7129 format("#define A { \\\n"
7130 " /* previous */ \\\n"
7131 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007132 " someCall();",
7133 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007134}
7135
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007136TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7137 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007138 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007139 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007140 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007141 "};",
7142 getLLVMStyleWithColumns(15)));
7143 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007144 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007145 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007146 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007147 "};",
7148 getLLVMStyleWithColumns(15)));
7149
7150 // FIXME: The formatting is still wrong here.
7151 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007152 " 1111 /* a\n"
7153 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007154 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007155 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007156 "};",
7157 getLLVMStyleWithColumns(15)));
7158}
7159
Manuel Klimek82b836a2013-02-06 16:40:56 +00007160TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007161 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007162 " // a\n"
7163 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007164}
7165
Manuel Klimekd33516e2013-01-23 10:09:28 +00007166TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007167 verifyFormat("void f(int *a);");
7168 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007169 verifyFormat("class A {\n void f(int *a);\n};");
7170 verifyFormat("class A {\n int *a;\n};");
7171 verifyFormat("namespace a {\n"
7172 "namespace b {\n"
7173 "class A {\n"
7174 " void f() {}\n"
7175 " int *a;\n"
7176 "};\n"
7177 "}\n"
7178 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007179}
7180
Manuel Klimekd33516e2013-01-23 10:09:28 +00007181TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7182 verifyFormat("while");
7183 verifyFormat("operator");
7184}
7185
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007186TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7187 // This code would be painfully slow to format if we didn't skip it.
7188 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
7189 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7190 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7191 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7192 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7193 "A(1, 1)\n"
7194 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7195 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7196 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7197 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7198 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7199 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7200 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7201 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7202 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7203 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7204 // Deeply nested part is untouched, rest is formatted.
7205 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7206 format(std::string("int i;\n") + Code + "int j;\n",
7207 getLLVMStyle(), IC_ExpectIncomplete));
7208}
7209
Nico Weber7e6a7a12013-01-08 17:56:31 +00007210//===----------------------------------------------------------------------===//
7211// Objective-C tests.
7212//===----------------------------------------------------------------------===//
7213
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007214TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7215 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7216 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7217 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007218 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007219 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7220 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7221 format("-(NSInteger)Method3:(id)anObject;"));
7222 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7223 format("-(NSInteger)Method4:(id)anObject;"));
7224 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7225 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7226 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7227 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007228 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7229 "forAllCells:(BOOL)flag;",
7230 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7231 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007232
7233 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007234 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7235 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007236 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7237 " inRange:(NSRange)range\n"
7238 " outRange:(NSRange)out_range\n"
7239 " outRange1:(NSRange)out_range1\n"
7240 " outRange2:(NSRange)out_range2\n"
7241 " outRange3:(NSRange)out_range3\n"
7242 " outRange4:(NSRange)out_range4\n"
7243 " outRange5:(NSRange)out_range5\n"
7244 " outRange6:(NSRange)out_range6\n"
7245 " outRange7:(NSRange)out_range7\n"
7246 " outRange8:(NSRange)out_range8\n"
7247 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007248
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007249 // When the function name has to be wrapped.
7250 FormatStyle Style = getLLVMStyle();
7251 Style.IndentWrappedFunctionNames = false;
7252 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7253 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7254 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7255 "}",
7256 Style);
7257 Style.IndentWrappedFunctionNames = true;
7258 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7259 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7260 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7261 "}",
7262 Style);
7263
Nico Weberd6f962f2013-01-10 20:18:33 +00007264 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007265 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007266 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7267 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007268 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007269
Daniel Jasper37194282013-05-28 08:33:00 +00007270 verifyFormat("- (int (*)())foo:(int (*)())f;");
7271 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007272
7273 // If there's no return type (very rare in practice!), LLVM and Google style
7274 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007275 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007276 verifyFormat("- foo:(int)f;");
7277 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007278}
7279
Nico Weber7eecf4b2013-01-09 20:25:35 +00007280TEST_F(FormatTest, FormatObjCInterface) {
Nico Webera6087752013-01-10 20:12:55 +00007281 verifyFormat("@interface Foo : NSObject <NSSomeDelegate> {\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007282 "@public\n"
7283 " int field1;\n"
7284 "@protected\n"
7285 " int field2;\n"
7286 "@private\n"
7287 " int field3;\n"
7288 "@package\n"
7289 " int field4;\n"
7290 "}\n"
7291 "+ (id)init;\n"
7292 "@end");
7293
Nico Weber7eecf4b2013-01-09 20:25:35 +00007294 verifyGoogleFormat("@interface Foo : NSObject<NSSomeDelegate> {\n"
7295 " @public\n"
7296 " int field1;\n"
7297 " @protected\n"
7298 " int field2;\n"
7299 " @private\n"
7300 " int field3;\n"
7301 " @package\n"
7302 " int field4;\n"
7303 "}\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007304 "+ (id)init;\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007305 "@end");
7306
Nico Weber6029d4f2013-01-22 16:53:59 +00007307 verifyFormat("@interface /* wait for it */ Foo\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007308 "+ (id)init;\n"
7309 "// Look, a comment!\n"
7310 "- (int)answerWith:(int)i;\n"
7311 "@end");
7312
7313 verifyFormat("@interface Foo\n"
Nico Weberd8ffe752013-01-09 21:42:32 +00007314 "@end\n"
7315 "@interface Bar\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007316 "@end");
7317
7318 verifyFormat("@interface Foo : Bar\n"
7319 "+ (id)init;\n"
7320 "@end");
7321
Nico Weber6029d4f2013-01-22 16:53:59 +00007322 verifyFormat("@interface Foo : /**/ Bar /**/ <Baz, /**/ Quux>\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007323 "+ (id)init;\n"
7324 "@end");
7325
Nico Webera6087752013-01-10 20:12:55 +00007326 verifyGoogleFormat("@interface Foo : Bar<Baz, Quux>\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007327 "+ (id)init;\n"
Nico Webera6087752013-01-10 20:12:55 +00007328 "@end");
7329
Nico Weber2bb00742013-01-10 19:19:14 +00007330 verifyFormat("@interface Foo (HackStuff)\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007331 "+ (id)init;\n"
7332 "@end");
7333
Nico Weber2bb00742013-01-10 19:19:14 +00007334 verifyFormat("@interface Foo ()\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007335 "+ (id)init;\n"
7336 "@end");
7337
Nico Webera6087752013-01-10 20:12:55 +00007338 verifyFormat("@interface Foo (HackStuff) <MyProtocol>\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007339 "+ (id)init;\n"
7340 "@end");
7341
Daniel Jasper20e15562015-04-16 07:02:19 +00007342 verifyGoogleFormat("@interface Foo (HackStuff)<MyProtocol>\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007343 "+ (id)init;\n"
Nico Webera6087752013-01-10 20:12:55 +00007344 "@end");
7345
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007346 verifyFormat("@interface Foo {\n"
7347 " int _i;\n"
7348 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007349 "+ (id)init;\n"
7350 "@end");
7351
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007352 verifyFormat("@interface Foo : Bar {\n"
7353 " int _i;\n"
7354 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007355 "+ (id)init;\n"
7356 "@end");
7357
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007358 verifyFormat("@interface Foo : Bar <Baz, Quux> {\n"
7359 " int _i;\n"
7360 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007361 "+ (id)init;\n"
7362 "@end");
7363
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007364 verifyFormat("@interface Foo (HackStuff) {\n"
7365 " int _i;\n"
7366 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007367 "+ (id)init;\n"
7368 "@end");
7369
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007370 verifyFormat("@interface Foo () {\n"
7371 " int _i;\n"
7372 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007373 "+ (id)init;\n"
7374 "@end");
7375
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007376 verifyFormat("@interface Foo (HackStuff) <MyProtocol> {\n"
7377 " int _i;\n"
7378 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007379 "+ (id)init;\n"
7380 "@end");
Daniel Jasper437c3f52014-04-28 07:34:48 +00007381
7382 FormatStyle OnePerLine = getGoogleStyle();
7383 OnePerLine.BinPackParameters = false;
Daniel Jasper20e15562015-04-16 07:02:19 +00007384 verifyFormat("@interface aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ()<\n"
Daniel Jasper437c3f52014-04-28 07:34:48 +00007385 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7386 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7387 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
7389 "}",
7390 OnePerLine);
Nico Weber7eecf4b2013-01-09 20:25:35 +00007391}
7392
Nico Weber2ce0ac52013-01-09 23:25:37 +00007393TEST_F(FormatTest, FormatObjCImplementation) {
7394 verifyFormat("@implementation Foo : NSObject {\n"
7395 "@public\n"
7396 " int field1;\n"
7397 "@protected\n"
7398 " int field2;\n"
7399 "@private\n"
7400 " int field3;\n"
7401 "@package\n"
7402 " int field4;\n"
7403 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007404 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007405 "@end");
7406
7407 verifyGoogleFormat("@implementation Foo : NSObject {\n"
7408 " @public\n"
7409 " int field1;\n"
7410 " @protected\n"
7411 " int field2;\n"
7412 " @private\n"
7413 " int field3;\n"
7414 " @package\n"
7415 " int field4;\n"
7416 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007417 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007418 "@end");
7419
7420 verifyFormat("@implementation Foo\n"
7421 "+ (id)init {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +00007422 " if (true)\n"
7423 " return nil;\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007424 "}\n"
7425 "// Look, a comment!\n"
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007426 "- (int)answerWith:(int)i {\n"
7427 " return i;\n"
7428 "}\n"
Nico Webera21aaae2013-01-11 21:14:08 +00007429 "+ (int)answerWith:(int)i {\n"
7430 " return i;\n"
7431 "}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007432 "@end");
7433
7434 verifyFormat("@implementation Foo\n"
7435 "@end\n"
7436 "@implementation Bar\n"
7437 "@end");
7438
Daniel Jasper91b032a2014-05-22 12:46:38 +00007439 EXPECT_EQ("@implementation Foo : Bar\n"
7440 "+ (id)init {\n}\n"
7441 "- (void)foo {\n}\n"
7442 "@end",
7443 format("@implementation Foo : Bar\n"
7444 "+(id)init{}\n"
7445 "-(void)foo{}\n"
7446 "@end"));
Nico Weber2ce0ac52013-01-09 23:25:37 +00007447
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007448 verifyFormat("@implementation Foo {\n"
7449 " int _i;\n"
7450 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007451 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007452 "@end");
7453
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007454 verifyFormat("@implementation Foo : Bar {\n"
7455 " int _i;\n"
7456 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007457 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007458 "@end");
7459
Nico Weber2bb00742013-01-10 19:19:14 +00007460 verifyFormat("@implementation Foo (HackStuff)\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007461 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007462 "@end");
Daniel Jaspera15da302013-08-28 08:04:23 +00007463 verifyFormat("@implementation ObjcClass\n"
7464 "- (void)method;\n"
7465 "{}\n"
7466 "@end");
Nico Weber2ce0ac52013-01-09 23:25:37 +00007467}
7468
Nico Weber8696a8d2013-01-09 21:15:03 +00007469TEST_F(FormatTest, FormatObjCProtocol) {
7470 verifyFormat("@protocol Foo\n"
7471 "@property(weak) id delegate;\n"
7472 "- (NSUInteger)numberOfThings;\n"
7473 "@end");
7474
Nico Webera6087752013-01-10 20:12:55 +00007475 verifyFormat("@protocol MyProtocol <NSObject>\n"
Nico Weber8696a8d2013-01-09 21:15:03 +00007476 "- (NSUInteger)numberOfThings;\n"
7477 "@end");
7478
Nico Webera6087752013-01-10 20:12:55 +00007479 verifyGoogleFormat("@protocol MyProtocol<NSObject>\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007480 "- (NSUInteger)numberOfThings;\n"
Nico Webera6087752013-01-10 20:12:55 +00007481 "@end");
7482
Nico Weber8696a8d2013-01-09 21:15:03 +00007483 verifyFormat("@protocol Foo;\n"
7484 "@protocol Bar;\n");
Nico Weberd8ffe752013-01-09 21:42:32 +00007485
7486 verifyFormat("@protocol Foo\n"
7487 "@end\n"
7488 "@protocol Bar\n"
7489 "@end");
Nico Weber51306d22013-01-10 00:25:19 +00007490
7491 verifyFormat("@protocol myProtocol\n"
7492 "- (void)mandatoryWithInt:(int)i;\n"
7493 "@optional\n"
7494 "- (void)optional;\n"
7495 "@required\n"
7496 "- (void)required;\n"
Nico Weberbbe28b32013-01-10 00:42:07 +00007497 "@optional\n"
7498 "@property(assign) int madProp;\n"
Nico Weber51306d22013-01-10 00:25:19 +00007499 "@end\n");
Daniel Jasper9688ff12013-08-01 13:46:58 +00007500
7501 verifyFormat("@property(nonatomic, assign, readonly)\n"
7502 " int *looooooooooooooooooooooooooooongNumber;\n"
7503 "@property(nonatomic, assign, readonly)\n"
7504 " NSString *looooooooooooooooooooooooooooongName;");
Benjamin Kramere21cb742014-01-08 15:59:42 +00007505
7506 verifyFormat("@implementation PR18406\n"
7507 "}\n"
7508 "@end");
Nico Weber8696a8d2013-01-09 21:15:03 +00007509}
7510
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007511TEST_F(FormatTest, FormatObjCMethodDeclarations) {
7512 verifyFormat("- (void)doSomethingWith:(GTMFoo *)theFoo\n"
7513 " rect:(NSRect)theRect\n"
7514 " interval:(float)theInterval {\n"
7515 "}");
7516 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
Daniel Jasper06a26952016-01-04 07:29:07 +00007517 " longKeyword:(NSRect)theRect\n"
7518 " longerKeyword:(float)theInterval\n"
7519 " error:(NSError **)theError {\n"
7520 "}");
7521 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007522 " longKeyword:(NSRect)theRect\n"
7523 " evenLongerKeyword:(float)theInterval\n"
7524 " error:(NSError **)theError {\n"
7525 "}");
Daniel Jasperec8e8382014-10-11 08:24:56 +00007526 verifyFormat("- (instancetype)initXxxxxx:(id<x>)x\n"
7527 " y:(id<yyyyyyyyyyyyyyyyyyyy>)y\n"
7528 " NS_DESIGNATED_INITIALIZER;",
7529 getLLVMStyleWithColumns(60));
Daniel Jasper3c44c222015-07-16 22:58:24 +00007530
7531 // Continuation indent width should win over aligning colons if the function
7532 // name is long.
7533 FormatStyle continuationStyle = getGoogleStyle();
7534 continuationStyle.ColumnLimit = 40;
7535 continuationStyle.IndentWrappedFunctionNames = true;
7536 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
7537 " dontAlignNamef:(NSRect)theRect {\n"
7538 "}",
7539 continuationStyle);
7540
7541 // Make sure we don't break aligning for short parameter names.
7542 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
7543 " aShortf:(NSRect)theRect {\n"
7544 "}",
7545 continuationStyle);
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007546}
7547
Nico Webera7252d82013-01-12 06:18:40 +00007548TEST_F(FormatTest, FormatObjCMethodExpr) {
7549 verifyFormat("[foo bar:baz];");
7550 verifyFormat("return [foo bar:baz];");
Daniel Jasperea772b4d2014-10-16 08:38:51 +00007551 verifyFormat("return (a)[foo bar:baz];");
Nico Webera7252d82013-01-12 06:18:40 +00007552 verifyFormat("f([foo bar:baz]);");
7553 verifyFormat("f(2, [foo bar:baz]);");
7554 verifyFormat("f(2, a ? b : c);");
7555 verifyFormat("[[self initWithInt:4] bar:[baz quux:arrrr]];");
7556
Nico Weberb76de882013-02-05 16:21:00 +00007557 // Unary operators.
7558 verifyFormat("int a = +[foo bar:baz];");
7559 verifyFormat("int a = -[foo bar:baz];");
7560 verifyFormat("int a = ![foo bar:baz];");
7561 verifyFormat("int a = ~[foo bar:baz];");
7562 verifyFormat("int a = ++[foo bar:baz];");
7563 verifyFormat("int a = --[foo bar:baz];");
7564 verifyFormat("int a = sizeof [foo bar:baz];");
Alexander Kornienko1e808872013-06-28 12:51:24 +00007565 verifyFormat("int a = alignof [foo bar:baz];", getGoogleStyle());
Nico Weber5d2624e2013-02-06 06:20:11 +00007566 verifyFormat("int a = &[foo bar:baz];");
7567 verifyFormat("int a = *[foo bar:baz];");
Nico Weberb76de882013-02-05 16:21:00 +00007568 // FIXME: Make casts work, without breaking f()[4].
Daniel Jaspera44991332015-04-29 13:06:49 +00007569 // verifyFormat("int a = (int)[foo bar:baz];");
7570 // verifyFormat("return (int)[foo bar:baz];");
7571 // verifyFormat("(void)[foo bar:baz];");
Nico Webera7892392013-02-13 03:48:27 +00007572 verifyFormat("return (MyType *)[self.tableView cellForRowAtIndexPath:cell];");
Nico Weberb76de882013-02-05 16:21:00 +00007573
7574 // Binary operators.
Nico Webera7252d82013-01-12 06:18:40 +00007575 verifyFormat("[foo bar:baz], [foo bar:baz];");
7576 verifyFormat("[foo bar:baz] = [foo bar:baz];");
7577 verifyFormat("[foo bar:baz] *= [foo bar:baz];");
7578 verifyFormat("[foo bar:baz] /= [foo bar:baz];");
7579 verifyFormat("[foo bar:baz] %= [foo bar:baz];");
7580 verifyFormat("[foo bar:baz] += [foo bar:baz];");
7581 verifyFormat("[foo bar:baz] -= [foo bar:baz];");
7582 verifyFormat("[foo bar:baz] <<= [foo bar:baz];");
7583 verifyFormat("[foo bar:baz] >>= [foo bar:baz];");
7584 verifyFormat("[foo bar:baz] &= [foo bar:baz];");
7585 verifyFormat("[foo bar:baz] ^= [foo bar:baz];");
7586 verifyFormat("[foo bar:baz] |= [foo bar:baz];");
7587 verifyFormat("[foo bar:baz] ? [foo bar:baz] : [foo bar:baz];");
7588 verifyFormat("[foo bar:baz] || [foo bar:baz];");
7589 verifyFormat("[foo bar:baz] && [foo bar:baz];");
7590 verifyFormat("[foo bar:baz] | [foo bar:baz];");
7591 verifyFormat("[foo bar:baz] ^ [foo bar:baz];");
7592 verifyFormat("[foo bar:baz] & [foo bar:baz];");
7593 verifyFormat("[foo bar:baz] == [foo bar:baz];");
7594 verifyFormat("[foo bar:baz] != [foo bar:baz];");
7595 verifyFormat("[foo bar:baz] >= [foo bar:baz];");
7596 verifyFormat("[foo bar:baz] <= [foo bar:baz];");
7597 verifyFormat("[foo bar:baz] > [foo bar:baz];");
7598 verifyFormat("[foo bar:baz] < [foo bar:baz];");
7599 verifyFormat("[foo bar:baz] >> [foo bar:baz];");
7600 verifyFormat("[foo bar:baz] << [foo bar:baz];");
7601 verifyFormat("[foo bar:baz] - [foo bar:baz];");
7602 verifyFormat("[foo bar:baz] + [foo bar:baz];");
7603 verifyFormat("[foo bar:baz] * [foo bar:baz];");
7604 verifyFormat("[foo bar:baz] / [foo bar:baz];");
7605 verifyFormat("[foo bar:baz] % [foo bar:baz];");
7606 // Whew!
7607
Nico Weber29f9dea2013-02-11 15:32:15 +00007608 verifyFormat("return in[42];");
Daniel Jasper3a623db2014-12-18 12:11:01 +00007609 verifyFormat("for (auto v : in[1]) {\n}");
Daniel Jasper2b1865c2015-04-15 07:26:18 +00007610 verifyFormat("for (int i = 0; i < in[a]; ++i) {\n}");
7611 verifyFormat("for (int i = 0; in[a] < i; ++i) {\n}");
7612 verifyFormat("for (int i = 0; i < n; ++i, ++in[a]) {\n}");
7613 verifyFormat("for (int i = 0; i < n; ++i, in[a]++) {\n}");
7614 verifyFormat("for (int i = 0; i < f(in[a]); ++i, in[a]++) {\n}");
Nico Weber29f9dea2013-02-11 15:32:15 +00007615 verifyFormat("for (id foo in [self getStuffFor:bla]) {\n"
7616 "}");
Daniel Jasper78580792014-10-20 12:01:45 +00007617 verifyFormat("[self aaaaa:MACRO(a, b:, c:)];");
Daniel Jaspercdb58b22015-05-15 09:05:31 +00007618 verifyFormat("[self aaaaa:(1 + 2) bbbbb:3];");
7619 verifyFormat("[self aaaaa:(Type)a bbbbb:3];");
Nico Weber29f9dea2013-02-11 15:32:15 +00007620
Nico Webera7252d82013-01-12 06:18:40 +00007621 verifyFormat("[self stuffWithInt:(4 + 2) float:4.5];");
7622 verifyFormat("[self stuffWithInt:a ? b : c float:4.5];");
7623 verifyFormat("[self stuffWithInt:a ? [self foo:bar] : c];");
7624 verifyFormat("[self stuffWithInt:a ? (e ? f : g) : c];");
7625 verifyFormat("[cond ? obj1 : obj2 methodWithParam:param]");
Nico Weber5c8709b2013-01-12 23:41:33 +00007626 verifyFormat("[button setAction:@selector(zoomOut:)];");
Nico Weber2827a7e2013-01-12 23:48:49 +00007627 verifyFormat("[color getRed:&r green:&g blue:&b alpha:&a];");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007628
Nico Webera7252d82013-01-12 06:18:40 +00007629 verifyFormat("arr[[self indexForFoo:a]];");
7630 verifyFormat("throw [self errorFor:a];");
7631 verifyFormat("@throw [self errorFor:a];");
7632
Nico Weberec9e4102013-06-25 00:55:57 +00007633 verifyFormat("[(id)foo bar:(id)baz quux:(id)snorf];");
7634 verifyFormat("[(id)foo bar:(id) ? baz : quux];");
7635 verifyFormat("4 > 4 ? (id)a : (id)baz;");
7636
Nico Weberc9d73612013-01-12 22:48:47 +00007637 // This tests that the formatter doesn't break after "backing" but before ":",
7638 // which would be at 80 columns.
Nico Webera7252d82013-01-12 06:18:40 +00007639 verifyFormat(
7640 "void f() {\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007641 " if ((self = [super initWithContentRect:contentRect\n"
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007642 " styleMask:styleMask ?: otherMask\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007643 " backing:NSBackingStoreBuffered\n"
7644 " defer:YES]))");
7645
Daniel Jasperc697ad22013-02-06 10:05:46 +00007646 verifyFormat(
7647 "[foo checkThatBreakingAfterColonWorksOk:\n"
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007648 " [bar ifItDoes:reduceOverallLineLengthLikeInThisCase]];");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007649
7650 verifyFormat("[myObj short:arg1 // Force line break\n"
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007651 " longKeyword:arg2 != nil ? arg2 : @\"longKeyword\"\n"
7652 " evenLongerKeyword:arg3 ?: @\"evenLongerKeyword\"\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007653 " error:arg4];");
7654 verifyFormat(
7655 "void f() {\n"
7656 " popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
7657 " initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n"
7658 " pos.width(), pos.height())\n"
7659 " styleMask:NSBorderlessWindowMask\n"
7660 " backing:NSBackingStoreBuffered\n"
7661 " defer:NO]);\n"
7662 "}");
Daniel Jasper4478e522013-11-08 17:33:24 +00007663 verifyFormat(
7664 "void f() {\n"
7665 " popup_wdow_.reset([[RenderWidgetPopupWindow alloc]\n"
7666 " iniithContentRect:NSMakRet(origin_global.x, origin_global.y,\n"
7667 " pos.width(), pos.height())\n"
7668 " syeMask:NSBorderlessWindowMask\n"
7669 " bking:NSBackingStoreBuffered\n"
7670 " der:NO]);\n"
7671 "}",
7672 getLLVMStyleWithColumns(70));
Daniel Jasper18210d72014-10-09 09:52:05 +00007673 verifyFormat(
7674 "void f() {\n"
7675 " popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
7676 " initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n"
7677 " pos.width(), pos.height())\n"
7678 " styleMask:NSBorderlessWindowMask\n"
7679 " backing:NSBackingStoreBuffered\n"
7680 " defer:NO]);\n"
7681 "}",
7682 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasperc697ad22013-02-06 10:05:46 +00007683 verifyFormat("[contentsContainer replaceSubview:[subviews objectAtIndex:0]\n"
7684 " with:contentsNativeView];");
7685
7686 verifyFormat(
7687 "[pboard addTypes:[NSArray arrayWithObject:kBookmarkButtonDragType]\n"
7688 " owner:nillllll];");
7689
Daniel Jasperc697ad22013-02-06 10:05:46 +00007690 verifyFormat(
Daniel Jasperacc33662013-02-08 08:22:00 +00007691 "[pboard setData:[NSData dataWithBytes:&button length:sizeof(button)]\n"
Daniel Jasperc697ad22013-02-06 10:05:46 +00007692 " forType:kBookmarkButtonDragType];");
7693
7694 verifyFormat("[defaultCenter addObserver:self\n"
7695 " selector:@selector(willEnterFullscreen)\n"
7696 " name:kWillEnterFullscreenNotification\n"
7697 " object:nil];");
Daniel Jasperc485b4e2013-02-06 16:00:26 +00007698 verifyFormat("[image_rep drawInRect:drawRect\n"
7699 " fromRect:NSZeroRect\n"
7700 " operation:NSCompositeCopy\n"
7701 " fraction:1.0\n"
7702 " respectFlipped:NO\n"
7703 " hints:nil];");
Daniel Jaspereb536682015-05-06 12:48:06 +00007704 verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7705 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasper9c950132015-05-07 14:19:59 +00007706 verifyFormat("[aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
7707 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jaspera7b14262015-05-13 10:23:03 +00007708 verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaa[aaaaaaaaaaaaaaaaaaaaa]\n"
7709 " aaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasper00492f92016-01-05 13:03:50 +00007710 verifyFormat("[call aaaaaaaa.aaaaaa.aaaaaaaa.aaaaaaaa.aaaaaaaa.aaaaaaaa\n"
7711 " .aaaaaaaa];", // FIXME: Indentation seems off.
Daniel Jaspered41f772015-05-19 11:06:33 +00007712 getLLVMStyleWithColumns(60));
Nico Weberac9bde22013-02-06 16:54:35 +00007713
7714 verifyFormat(
7715 "scoped_nsobject<NSTextField> message(\n"
7716 " // The frame will be fixed up when |-setMessageText:| is called.\n"
7717 " [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 0, 0)]);");
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007718 verifyFormat("[self aaaaaa:bbbbbbbbbbbbb\n"
7719 " aaaaaaaaaa:bbbbbbbbbbbbbbbbb\n"
7720 " aaaaa:bbbbbbbbbbb + bbbbbbbbbbbb\n"
7721 " aaaa:bbb];");
Daniel Jasper4478e522013-11-08 17:33:24 +00007722 verifyFormat("[self param:function( //\n"
7723 " parameter)]");
Daniel Jasperf48b5ab2013-11-07 19:23:49 +00007724 verifyFormat(
7725 "[self aaaaaaaaaa:aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |\n"
7726 " aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |\n"
7727 " aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa];");
Daniel Jaspera1ea4cb2013-10-26 17:00:22 +00007728
Daniel Jasper2746a302015-05-06 13:13:03 +00007729 // FIXME: This violates the column limit.
7730 verifyFormat(
7731 "[aaaaaaaaaaaaaaaaaaaaaaaaa\n"
7732 " aaaaaaaaaaaaaaaaa:aaaaaaaa\n"
7733 " aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];",
7734 getLLVMStyleWithColumns(60));
7735
Daniel Jaspera1ea4cb2013-10-26 17:00:22 +00007736 // Variadic parameters.
7737 verifyFormat(
7738 "NSArray *myStrings = [NSArray stringarray:@\"a\", @\"b\", nil];");
Daniel Jasperf48b5ab2013-11-07 19:23:49 +00007739 verifyFormat(
7740 "[self aaaaaaaaaaaaa:aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
7741 " aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
7742 " aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa];");
Daniel Jasperb302f9a2013-11-08 02:08:01 +00007743 verifyFormat("[self // break\n"
7744 " a:a\n"
7745 " aaa:aaa];");
Daniel Jasper3460b252013-12-18 07:08:51 +00007746 verifyFormat("bool a = ([aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaa ||\n"
7747 " [aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaaaaa);");
Nico Webera7252d82013-01-12 06:18:40 +00007748}
7749
Nico Weber12d5bab2013-01-07 15:56:25 +00007750TEST_F(FormatTest, ObjCAt) {
Nico Weber803d61d2013-01-07 16:07:07 +00007751 verifyFormat("@autoreleasepool");
Nico Webere89c42f2013-01-07 16:14:28 +00007752 verifyFormat("@catch");
7753 verifyFormat("@class");
Nico Weber803d61d2013-01-07 16:07:07 +00007754 verifyFormat("@compatibility_alias");
7755 verifyFormat("@defs");
Nico Webera8876502013-01-07 15:17:23 +00007756 verifyFormat("@dynamic");
Nico Weber803d61d2013-01-07 16:07:07 +00007757 verifyFormat("@encode");
7758 verifyFormat("@end");
7759 verifyFormat("@finally");
7760 verifyFormat("@implementation");
7761 verifyFormat("@import");
7762 verifyFormat("@interface");
7763 verifyFormat("@optional");
7764 verifyFormat("@package");
Nico Webere89c42f2013-01-07 16:14:28 +00007765 verifyFormat("@private");
Nico Weber803d61d2013-01-07 16:07:07 +00007766 verifyFormat("@property");
Nico Webere89c42f2013-01-07 16:14:28 +00007767 verifyFormat("@protected");
Nico Weber803d61d2013-01-07 16:07:07 +00007768 verifyFormat("@protocol");
Nico Webere89c42f2013-01-07 16:14:28 +00007769 verifyFormat("@public");
Nico Weber803d61d2013-01-07 16:07:07 +00007770 verifyFormat("@required");
7771 verifyFormat("@selector");
7772 verifyFormat("@synchronized");
7773 verifyFormat("@synthesize");
Nico Webere89c42f2013-01-07 16:14:28 +00007774 verifyFormat("@throw");
7775 verifyFormat("@try");
Nico Weber803d61d2013-01-07 16:07:07 +00007776
Nico Weber12d5bab2013-01-07 15:56:25 +00007777 EXPECT_EQ("@interface", format("@ interface"));
7778
7779 // The precise formatting of this doesn't matter, nobody writes code like
7780 // this.
7781 verifyFormat("@ /*foo*/ interface");
Nico Webera8876502013-01-07 15:17:23 +00007782}
7783
Nico Weberd8cdb532013-01-08 19:15:23 +00007784TEST_F(FormatTest, ObjCSnippets) {
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007785 verifyFormat("@autoreleasepool {\n"
7786 " foo();\n"
7787 "}");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007788 verifyFormat("@class Foo, Bar;");
Nico Weberd8cdb532013-01-08 19:15:23 +00007789 verifyFormat("@compatibility_alias AliasName ExistingClass;");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007790 verifyFormat("@dynamic textColor;");
Nico Webere3025672013-01-18 05:11:47 +00007791 verifyFormat("char *buf1 = @encode(int *);");
7792 verifyFormat("char *buf1 = @encode(typeof(4 * 5));");
Nico Weber44449172013-02-12 16:17:07 +00007793 verifyFormat("char *buf1 = @encode(int **);");
Nico Weber4cc98742013-01-08 20:16:23 +00007794 verifyFormat("Protocol *proto = @protocol(p1);");
Nico Weber250fe712013-01-18 02:43:57 +00007795 verifyFormat("SEL s = @selector(foo:);");
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007796 verifyFormat("@synchronized(self) {\n"
7797 " f();\n"
7798 "}");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007799
Nico Webera2a84952013-01-10 21:30:42 +00007800 verifyFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
7801 verifyGoogleFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
7802
Nico Weber7e6a7a12013-01-08 17:56:31 +00007803 verifyFormat("@property(assign, nonatomic) CGFloat hoverAlpha;");
Nico Webera2a84952013-01-10 21:30:42 +00007804 verifyFormat("@property(assign, getter=isEditable) BOOL editable;");
7805 verifyGoogleFormat("@property(assign, getter=isEditable) BOOL editable;");
Daniel Jaspere9beea22014-01-28 15:20:33 +00007806 verifyFormat("@property (assign, getter=isEditable) BOOL editable;",
7807 getMozillaStyle());
7808 verifyFormat("@property BOOL editable;", getMozillaStyle());
7809 verifyFormat("@property (assign, getter=isEditable) BOOL editable;",
7810 getWebKitStyle());
7811 verifyFormat("@property BOOL editable;", getWebKitStyle());
Nico Webere8d78242013-06-25 00:25:40 +00007812
7813 verifyFormat("@import foo.bar;\n"
7814 "@import baz;");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007815}
7816
Daniel Jasper9cb1ac282015-10-07 15:09:08 +00007817TEST_F(FormatTest, ObjCForIn) {
7818 verifyFormat("- (void)test {\n"
7819 " for (NSString *n in arrayOfStrings) {\n"
7820 " foo(n);\n"
7821 " }\n"
7822 "}");
7823 verifyFormat("- (void)test {\n"
7824 " for (NSString *n in (__bridge NSArray *)arrayOfStrings) {\n"
7825 " foo(n);\n"
7826 " }\n"
7827 "}");
7828}
7829
Nico Weber0588b502013-02-07 00:19:29 +00007830TEST_F(FormatTest, ObjCLiterals) {
7831 verifyFormat("@\"String\"");
7832 verifyFormat("@1");
7833 verifyFormat("@+4.8");
7834 verifyFormat("@-4");
7835 verifyFormat("@1LL");
7836 verifyFormat("@.5");
7837 verifyFormat("@'c'");
7838 verifyFormat("@true");
7839
7840 verifyFormat("NSNumber *smallestInt = @(-INT_MAX - 1);");
7841 verifyFormat("NSNumber *piOverTwo = @(M_PI / 2);");
7842 verifyFormat("NSNumber *favoriteColor = @(Green);");
7843 verifyFormat("NSString *path = @(getenv(\"PATH\"));");
Daniel Jasperb1c19f82014-01-10 07:44:53 +00007844
7845 verifyFormat("[dictionary setObject:@(1) forKey:@\"number\"];");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007846}
Nico Weber0588b502013-02-07 00:19:29 +00007847
Daniel Jasperb596fb22013-10-24 10:31:50 +00007848TEST_F(FormatTest, ObjCDictLiterals) {
Nico Weber0588b502013-02-07 00:19:29 +00007849 verifyFormat("@{");
Nico Weber372d8dc2013-02-10 20:35:35 +00007850 verifyFormat("@{}");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007851 verifyFormat("@{@\"one\" : @1}");
7852 verifyFormat("return @{@\"one\" : @1;");
Daniel Jaspera125d532014-03-21 12:38:57 +00007853 verifyFormat("@{@\"one\" : @1}");
Manuel Klimek1a18c402013-04-12 14:13:36 +00007854
Chandler Carruthf8b72662014-03-02 12:37:31 +00007855 verifyFormat("@{@\"one\" : @{@2 : @1}}");
Daniel Jaspera125d532014-03-21 12:38:57 +00007856 verifyFormat("@{\n"
7857 " @\"one\" : @{@2 : @1},\n"
7858 "}");
Manuel Klimek1a18c402013-04-12 14:13:36 +00007859
Chandler Carruthf8b72662014-03-02 12:37:31 +00007860 verifyFormat("@{1 > 2 ? @\"one\" : @\"two\" : 1 > 2 ? @1 : @2}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007861 verifyIncompleteFormat("[self setDict:@{}");
7862 verifyIncompleteFormat("[self setDict:@{@1 : @2}");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007863 verifyFormat("NSLog(@\"%@\", @{@1 : @2, @2 : @3}[@1]);");
Nico Weber372d8dc2013-02-10 20:35:35 +00007864 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007865 "NSDictionary *masses = @{@\"H\" : @1.0078, @\"He\" : @4.0026};");
Nico Weber33c68e92013-02-10 20:39:05 +00007866 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007867 "NSDictionary *settings = @{AVEncoderKey : @(AVAudioQualityMax)};");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007868
Daniel Jaspera44991332015-04-29 13:06:49 +00007869 verifyFormat("NSDictionary *d = @{\n"
7870 " @\"nam\" : NSUserNam(),\n"
7871 " @\"dte\" : [NSDate date],\n"
7872 " @\"processInfo\" : [NSProcessInfo processInfo]\n"
7873 "};");
Nico Weberced7d412013-05-26 05:39:26 +00007874 verifyFormat(
Daniel Jasperd489dd32013-10-20 16:45:46 +00007875 "@{\n"
7876 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee : "
7877 "regularFont,\n"
7878 "};");
Daniel Jasperb8f61682013-10-22 15:45:58 +00007879 verifyGoogleFormat(
7880 "@{\n"
7881 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee : "
7882 "regularFont,\n"
7883 "};");
Daniel Jasper1fd6f1f2014-03-17 14:32:47 +00007884 verifyFormat(
7885 "@{\n"
7886 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee :\n"
7887 " reeeeeeeeeeeeeeeeeeeeeeeegularFont,\n"
7888 "};");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007889
7890 // We should try to be robust in case someone forgets the "@".
Daniel Jaspera44991332015-04-29 13:06:49 +00007891 verifyFormat("NSDictionary *d = {\n"
7892 " @\"nam\" : NSUserNam(),\n"
7893 " @\"dte\" : [NSDate date],\n"
7894 " @\"processInfo\" : [NSProcessInfo processInfo]\n"
7895 "};");
Daniel Jasper335ff262014-05-28 09:11:53 +00007896 verifyFormat("NSMutableDictionary *dictionary =\n"
7897 " [NSMutableDictionary dictionaryWithDictionary:@{\n"
7898 " aaaaaaaaaaaaaaaaaaaaa : aaaaaaaaaaaaa,\n"
7899 " bbbbbbbbbbbbbbbbbb : bbbbb,\n"
7900 " cccccccccccccccc : ccccccccccccccc\n"
7901 " }];");
Daniel Jasper4d724492015-10-12 03:19:07 +00007902
7903 // Ensure that casts before the key are kept on the same line as the key.
7904 verifyFormat(
7905 "NSDictionary *d = @{\n"
7906 " (aaaaaaaa id)aaaaaaaaa : (aaaaaaaa id)aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7907 " (aaaaaaaa id)aaaaaaaaaaaaaa : (aaaaaaaa id)aaaaaaaaaaaaaa,\n"
7908 "};");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007909}
7910
7911TEST_F(FormatTest, ObjCArrayLiterals) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007912 verifyIncompleteFormat("@[");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007913 verifyFormat("@[]");
7914 verifyFormat(
7915 "NSArray *array = @[ @\" Hey \", NSApp, [NSNumber numberWithInt:42] ];");
7916 verifyFormat("return @[ @3, @[], @[ @4, @5 ] ];");
7917 verifyFormat("NSArray *array = @[ [foo description] ];");
7918
7919 verifyFormat(
7920 "NSArray *some_variable = @[\n"
7921 " aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" : @\"aaaaaaaaaaaaaa\",\n"
7922 " @\"aaaaaaaaaaaaaaaaa\",\n"
7923 " @\"aaaaaaaaaaaaaaaaa\",\n"
Daniel Jasper50780ce2016-01-13 16:41:34 +00007924 " @\"aaaaaaaaaaaaaaaaa\",\n"
7925 "];");
7926 verifyFormat(
7927 "NSArray *some_variable = @[\n"
7928 " aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" : @\"aaaaaaaaaaaaaa\",\n"
7929 " @\"aaaaaaaaaaaaaaaa\", @\"aaaaaaaaaaaaaaaa\", @\"aaaaaaaaaaaaaaaa\"\n"
Daniel Jasperb8f61682013-10-22 15:45:58 +00007930 "];");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007931 verifyFormat("NSArray *some_variable = @[\n"
7932 " @\"aaaaaaaaaaaaaaaaa\",\n"
7933 " @\"aaaaaaaaaaaaaaaaa\",\n"
7934 " @\"aaaaaaaaaaaaaaaaa\",\n"
7935 " @\"aaaaaaaaaaaaaaaaa\",\n"
7936 "];");
Daniel Jasper308062b2015-02-27 08:41:05 +00007937 verifyFormat("NSArray *array = @[\n"
7938 " @\"a\",\n"
7939 " @\"a\",\n" // Trailing comma -> one per line.
7940 "];");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007941
7942 // We should try to be robust in case someone forgets the "@".
7943 verifyFormat("NSArray *some_variable = [\n"
7944 " @\"aaaaaaaaaaaaaaaaa\",\n"
7945 " @\"aaaaaaaaaaaaaaaaa\",\n"
7946 " @\"aaaaaaaaaaaaaaaaa\",\n"
7947 " @\"aaaaaaaaaaaaaaaaa\",\n"
7948 "];");
Daniel Jasper4bf0d802013-11-23 14:27:27 +00007949 verifyFormat(
7950 "- (NSAttributedString *)attributedStringForSegment:(NSUInteger)segment\n"
7951 " index:(NSUInteger)index\n"
7952 " nonDigitAttributes:\n"
7953 " (NSDictionary *)noDigitAttributes;");
Daniel Jasperf841d3a2015-05-28 07:21:50 +00007954 verifyFormat("[someFunction someLooooooooooooongParameter:@[\n"
7955 " NSBundle.mainBundle.infoDictionary[@\"a\"]\n"
7956 "]];");
Nico Weber0588b502013-02-07 00:19:29 +00007957}
7958
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007959TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007960 EXPECT_EQ("\"some text \"\n"
7961 "\"other\";",
7962 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007963 EXPECT_EQ("\"some text \"\n"
7964 "\"other\";",
7965 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007966 EXPECT_EQ(
7967 "#define A \\\n"
7968 " \"some \" \\\n"
7969 " \"text \" \\\n"
7970 " \"other\";",
7971 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7972 EXPECT_EQ(
7973 "#define A \\\n"
7974 " \"so \" \\\n"
7975 " \"text \" \\\n"
7976 " \"other\";",
7977 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7978
7979 EXPECT_EQ("\"some text\"",
7980 format("\"some text\"", getLLVMStyleWithColumns(1)));
7981 EXPECT_EQ("\"some text\"",
7982 format("\"some text\"", getLLVMStyleWithColumns(11)));
7983 EXPECT_EQ("\"some \"\n"
7984 "\"text\"",
7985 format("\"some text\"", getLLVMStyleWithColumns(10)));
7986 EXPECT_EQ("\"some \"\n"
7987 "\"text\"",
7988 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007989 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007990 "\" tex\"\n"
7991 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007992 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007993 EXPECT_EQ("\"some\"\n"
7994 "\" tex\"\n"
7995 "\" and\"",
7996 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7997 EXPECT_EQ("\"some\"\n"
7998 "\"/tex\"\n"
7999 "\"/and\"",
8000 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008001
8002 EXPECT_EQ("variable =\n"
8003 " \"long string \"\n"
8004 " \"literal\";",
8005 format("variable = \"long string literal\";",
8006 getLLVMStyleWithColumns(20)));
8007
8008 EXPECT_EQ("variable = f(\n"
8009 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00008010 " \"literal\",\n"
8011 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00008012 " loooooooooooooooooooong);",
8013 format("variable = f(\"long string literal\", short, "
8014 "loooooooooooooooooooong);",
8015 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008016
Daniel Jaspera44991332015-04-29 13:06:49 +00008017 EXPECT_EQ(
8018 "f(g(\"long string \"\n"
8019 " \"literal\"),\n"
8020 " b);",
8021 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008022 EXPECT_EQ("f(g(\"long string \"\n"
8023 " \"literal\",\n"
8024 " a),\n"
8025 " b);",
8026 format("f(g(\"long string literal\", a), b);",
8027 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008028 EXPECT_EQ(
8029 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00008030 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008031 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8032 EXPECT_EQ("f(\"one two three four five six \"\n"
8033 " \"seven\".split(\n"
8034 " really_looooong_variable));",
8035 format("f(\"one two three four five six seven\"."
8036 "split(really_looooong_variable));",
8037 getLLVMStyleWithColumns(33)));
8038
8039 EXPECT_EQ("f(\"some \"\n"
8040 " \"text\",\n"
8041 " other);",
8042 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008043
8044 // Only break as a last resort.
8045 verifyFormat(
8046 "aaaaaaaaaaaaaaaaaaaa(\n"
8047 " aaaaaaaaaaaaaaaaaaaa,\n"
8048 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008049
Daniel Jaspera44991332015-04-29 13:06:49 +00008050 EXPECT_EQ("\"splitmea\"\n"
8051 "\"trandomp\"\n"
8052 "\"oint\"",
8053 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008054
Daniel Jaspera44991332015-04-29 13:06:49 +00008055 EXPECT_EQ("\"split/\"\n"
8056 "\"pathat/\"\n"
8057 "\"slashes\"",
8058 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008059
Daniel Jaspera44991332015-04-29 13:06:49 +00008060 EXPECT_EQ("\"split/\"\n"
8061 "\"pathat/\"\n"
8062 "\"slashes\"",
8063 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008064 EXPECT_EQ("\"split at \"\n"
8065 "\"spaces/at/\"\n"
8066 "\"slashes.at.any$\"\n"
8067 "\"non-alphanumeric%\"\n"
8068 "\"1111111111characte\"\n"
8069 "\"rs\"",
8070 format("\"split at "
8071 "spaces/at/"
8072 "slashes.at."
8073 "any$non-"
8074 "alphanumeric%"
8075 "1111111111characte"
8076 "rs\"",
8077 getLLVMStyleWithColumns(20)));
8078
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008079 // Verify that splitting the strings understands
8080 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008081 EXPECT_EQ(
8082 "aaaaaaaaaaaa(\n"
8083 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8084 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8085 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8086 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8087 "aaaaaaaaaaaaaaaaaaaaaa\");",
8088 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008089 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8090 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8091 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8092 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8093 "aaaaaaaaaaaaaaaaaaaaaa\";",
8094 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008095 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8096 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8097 format("llvm::outs() << "
8098 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8099 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008100 EXPECT_EQ("ffff(\n"
8101 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8102 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8103 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8104 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8105 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008106
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008107 FormatStyle Style = getLLVMStyleWithColumns(12);
8108 Style.BreakStringLiterals = false;
8109 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8110
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008111 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8112 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00008113 EXPECT_EQ("#define A \\\n"
8114 " \"some \" \\\n"
8115 " \"text \" \\\n"
8116 " \"other\";",
8117 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008118}
8119
Manuel Klimek9e321992015-07-28 15:50:24 +00008120TEST_F(FormatTest, FullyRemoveEmptyLines) {
8121 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8122 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8123 EXPECT_EQ("int i = a(b());",
8124 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8125}
8126
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008127TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8128 EXPECT_EQ(
8129 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8130 "(\n"
8131 " \"x\t\");",
8132 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8133 "aaaaaaa("
8134 "\"x\t\");"));
8135}
8136
Daniel Jasper174b0122014-01-09 14:18:12 +00008137TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008138 EXPECT_EQ(
8139 "u8\"utf8 string \"\n"
8140 "u8\"literal\";",
8141 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8142 EXPECT_EQ(
8143 "u\"utf16 string \"\n"
8144 "u\"literal\";",
8145 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8146 EXPECT_EQ(
8147 "U\"utf32 string \"\n"
8148 "U\"literal\";",
8149 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8150 EXPECT_EQ("L\"wide string \"\n"
8151 "L\"literal\";",
8152 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008153 EXPECT_EQ("@\"NSString \"\n"
8154 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008155 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008156
8157 // This input makes clang-format try to split the incomplete unicode escape
8158 // sequence, which used to lead to a crasher.
8159 verifyNoCrash(
8160 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8161 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008162}
8163
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008164TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8165 FormatStyle Style = getGoogleStyleWithColumns(15);
8166 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8167 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8168 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8169 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8170 EXPECT_EQ("u8R\"x(raw literal)x\";",
8171 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008172}
8173
8174TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8175 FormatStyle Style = getLLVMStyleWithColumns(20);
8176 EXPECT_EQ(
8177 "_T(\"aaaaaaaaaaaaaa\")\n"
8178 "_T(\"aaaaaaaaaaaaaa\")\n"
8179 "_T(\"aaaaaaaaaaaa\")",
8180 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8181 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
8182 " _T(\"aaaaaa\"),\n"
8183 " z);",
8184 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8185
8186 // FIXME: Handle embedded spaces in one iteration.
8187 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8188 // "_T(\"aaaaaaaaaaaaa\")\n"
8189 // "_T(\"aaaaaaaaaaaaa\")\n"
8190 // "_T(\"a\")",
8191 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8192 // getLLVMStyleWithColumns(20)));
8193 EXPECT_EQ(
8194 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8195 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008196 EXPECT_EQ("f(\n"
8197 "#if !TEST\n"
8198 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8199 "#endif\n"
8200 " );",
8201 format("f(\n"
8202 "#if !TEST\n"
8203 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8204 "#endif\n"
8205 ");"));
8206 EXPECT_EQ("f(\n"
8207 "\n"
8208 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8209 format("f(\n"
8210 "\n"
8211 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008212}
8213
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008214TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008215 EXPECT_EQ(
8216 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8217 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8218 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8219 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8220 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8221 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8222}
8223
8224TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8225 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008226 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008227 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8228 "multiline raw string literal xxxxxxxxxxxxxx\n"
8229 ")x\",\n"
8230 " a),\n"
8231 " b);",
8232 format("fffffffffff(g(R\"x(\n"
8233 "multiline raw string literal xxxxxxxxxxxxxx\n"
8234 ")x\", a), b);",
8235 getGoogleStyleWithColumns(20)));
8236 EXPECT_EQ("fffffffffff(\n"
8237 " g(R\"x(qqq\n"
8238 "multiline raw string literal xxxxxxxxxxxxxx\n"
8239 ")x\",\n"
8240 " a),\n"
8241 " b);",
8242 format("fffffffffff(g(R\"x(qqq\n"
8243 "multiline raw string literal xxxxxxxxxxxxxx\n"
8244 ")x\", a), b);",
8245 getGoogleStyleWithColumns(20)));
8246
8247 EXPECT_EQ("fffffffffff(R\"x(\n"
8248 "multiline raw string literal xxxxxxxxxxxxxx\n"
8249 ")x\");",
8250 format("fffffffffff(R\"x(\n"
8251 "multiline raw string literal xxxxxxxxxxxxxx\n"
8252 ")x\");",
8253 getGoogleStyleWithColumns(20)));
8254 EXPECT_EQ("fffffffffff(R\"x(\n"
8255 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008256 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008257 format("fffffffffff(R\"x(\n"
8258 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008259 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008260 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008261 EXPECT_EQ("fffffffffff(\n"
8262 " R\"x(\n"
8263 "multiline raw string literal xxxxxxxxxxxxxx\n"
8264 ")x\" +\n"
8265 " bbbbbb);",
8266 format("fffffffffff(\n"
8267 " R\"x(\n"
8268 "multiline raw string literal xxxxxxxxxxxxxx\n"
8269 ")x\" + bbbbbb);",
8270 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008271}
8272
Alexander Kornienkobe633902013-06-14 11:46:10 +00008273TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008274 verifyFormat("string a = \"unterminated;");
8275 EXPECT_EQ("function(\"unterminated,\n"
8276 " OtherParameter);",
8277 format("function( \"unterminated,\n"
8278 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008279}
8280
8281TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008282 FormatStyle Style = getLLVMStyle();
8283 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008284 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008285 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008286}
8287
Daniel Jaspera44991332015-04-29 13:06:49 +00008288TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008289
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008290TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8291 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8292 " \"ddeeefff\");",
8293 format("someFunction(\"aaabbbcccdddeeefff\");",
8294 getLLVMStyleWithColumns(25)));
8295 EXPECT_EQ("someFunction1234567890(\n"
8296 " \"aaabbbcccdddeeefff\");",
8297 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8298 getLLVMStyleWithColumns(26)));
8299 EXPECT_EQ("someFunction1234567890(\n"
8300 " \"aaabbbcccdddeeeff\"\n"
8301 " \"f\");",
8302 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8303 getLLVMStyleWithColumns(25)));
8304 EXPECT_EQ("someFunction1234567890(\n"
8305 " \"aaabbbcccdddeeeff\"\n"
8306 " \"f\");",
8307 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8308 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008309 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8310 " \"ddde \"\n"
8311 " \"efff\");",
8312 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008313 getLLVMStyleWithColumns(25)));
8314 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8315 " \"ddeeefff\");",
8316 format("someFunction(\"aaabbbccc ddeeefff\");",
8317 getLLVMStyleWithColumns(25)));
8318 EXPECT_EQ("someFunction1234567890(\n"
8319 " \"aaabb \"\n"
8320 " \"cccdddeeefff\");",
8321 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8322 getLLVMStyleWithColumns(25)));
8323 EXPECT_EQ("#define A \\\n"
8324 " string s = \\\n"
8325 " \"123456789\" \\\n"
8326 " \"0\"; \\\n"
8327 " int i;",
8328 format("#define A string s = \"1234567890\"; int i;",
8329 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008330 // FIXME: Put additional penalties on breaking at non-whitespace locations.
8331 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8332 " \"dddeeeff\"\n"
8333 " \"f\");",
8334 format("someFunction(\"aaabbbcc dddeeefff\");",
8335 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008336}
8337
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008338TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008339 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8340 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008341 EXPECT_EQ("\"test\"\n"
8342 "\"\\n\"",
8343 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8344 EXPECT_EQ("\"tes\\\\\"\n"
8345 "\"n\"",
8346 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8347 EXPECT_EQ("\"\\\\\\\\\"\n"
8348 "\"\\n\"",
8349 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008350 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008351 EXPECT_EQ("\"\\uff01\"\n"
8352 "\"test\"",
8353 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8354 EXPECT_EQ("\"\\Uff01ff02\"",
8355 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8356 EXPECT_EQ("\"\\x000000000001\"\n"
8357 "\"next\"",
8358 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8359 EXPECT_EQ("\"\\x000000000001next\"",
8360 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8361 EXPECT_EQ("\"\\x000000000001\"",
8362 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8363 EXPECT_EQ("\"test\"\n"
8364 "\"\\000000\"\n"
8365 "\"000001\"",
8366 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8367 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008368 "\"00000000\"\n"
8369 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008370 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008371}
8372
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008373TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8374 verifyFormat("void f() {\n"
8375 " return g() {}\n"
8376 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008377 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008378 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008379 "}");
8380}
8381
Manuel Klimek421147e2014-01-24 09:25:23 +00008382TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8383 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008384 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008385}
8386
Manuel Klimek13b97d82013-05-13 08:42:42 +00008387TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8388 verifyFormat("class X {\n"
8389 " void f() {\n"
8390 " }\n"
8391 "};",
8392 getLLVMStyleWithColumns(12));
8393}
8394
8395TEST_F(FormatTest, ConfigurableIndentWidth) {
8396 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8397 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008398 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008399 verifyFormat("void f() {\n"
8400 " someFunction();\n"
8401 " if (true) {\n"
8402 " f();\n"
8403 " }\n"
8404 "}",
8405 EightIndent);
8406 verifyFormat("class X {\n"
8407 " void f() {\n"
8408 " }\n"
8409 "};",
8410 EightIndent);
8411 verifyFormat("int x[] = {\n"
8412 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008413 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008414 EightIndent);
8415}
8416
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008417TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008418 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008419 "f();",
8420 getLLVMStyleWithColumns(8));
8421}
8422
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008423TEST_F(FormatTest, ConfigurableUseOfTab) {
8424 FormatStyle Tab = getLLVMStyleWithColumns(42);
8425 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008426 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008427 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008428
8429 EXPECT_EQ("if (aaaaaaaa && // q\n"
8430 " bb)\t\t// w\n"
8431 "\t;",
8432 format("if (aaaaaaaa &&// q\n"
8433 "bb)// w\n"
8434 ";",
8435 Tab));
8436 EXPECT_EQ("if (aaa && bbb) // w\n"
8437 "\t;",
8438 format("if(aaa&&bbb)// w\n"
8439 ";",
8440 Tab));
8441
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008442 verifyFormat("class X {\n"
8443 "\tvoid f() {\n"
8444 "\t\tsomeFunction(parameter1,\n"
8445 "\t\t\t parameter2);\n"
8446 "\t}\n"
8447 "};",
8448 Tab);
8449 verifyFormat("#define A \\\n"
8450 "\tvoid f() { \\\n"
8451 "\t\tsomeFunction( \\\n"
8452 "\t\t parameter1, \\\n"
8453 "\t\t parameter2); \\\n"
8454 "\t}",
8455 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008456
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008457 Tab.TabWidth = 4;
8458 Tab.IndentWidth = 8;
8459 verifyFormat("class TabWidth4Indent8 {\n"
8460 "\t\tvoid f() {\n"
8461 "\t\t\t\tsomeFunction(parameter1,\n"
8462 "\t\t\t\t\t\t\t parameter2);\n"
8463 "\t\t}\n"
8464 "};",
8465 Tab);
8466
8467 Tab.TabWidth = 4;
8468 Tab.IndentWidth = 4;
8469 verifyFormat("class TabWidth4Indent4 {\n"
8470 "\tvoid f() {\n"
8471 "\t\tsomeFunction(parameter1,\n"
8472 "\t\t\t\t\t parameter2);\n"
8473 "\t}\n"
8474 "};",
8475 Tab);
8476
8477 Tab.TabWidth = 8;
8478 Tab.IndentWidth = 4;
8479 verifyFormat("class TabWidth8Indent4 {\n"
8480 " void f() {\n"
8481 "\tsomeFunction(parameter1,\n"
8482 "\t\t parameter2);\n"
8483 " }\n"
8484 "};",
8485 Tab);
8486
Alexander Kornienko39856b72013-09-10 09:38:25 +00008487 Tab.TabWidth = 8;
8488 Tab.IndentWidth = 8;
8489 EXPECT_EQ("/*\n"
8490 "\t a\t\tcomment\n"
8491 "\t in multiple lines\n"
8492 " */",
8493 format(" /*\t \t \n"
8494 " \t \t a\t\tcomment\t \t\n"
8495 " \t \t in multiple lines\t\n"
8496 " \t */",
8497 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008498
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008499 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008500 verifyFormat("{\n"
8501 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8502 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8503 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8504 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8505 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8506 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008507 "};",
8508 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008509 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008510 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008511 "\ta2,\n"
8512 "\ta3\n"
8513 "};",
8514 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008515 EXPECT_EQ("if (aaaaaaaa && // q\n"
8516 " bb) // w\n"
8517 "\t;",
8518 format("if (aaaaaaaa &&// q\n"
8519 "bb)// w\n"
8520 ";",
8521 Tab));
8522 verifyFormat("class X {\n"
8523 "\tvoid f() {\n"
8524 "\t\tsomeFunction(parameter1,\n"
8525 "\t\t parameter2);\n"
8526 "\t}\n"
8527 "};",
8528 Tab);
8529 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008530 "\tQ(\n"
8531 "\t {\n"
8532 "\t\t int a;\n"
8533 "\t\t someFunction(aaaaaaaa,\n"
8534 "\t\t bbbbbbb);\n"
8535 "\t },\n"
8536 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008537 "}",
8538 Tab);
8539 EXPECT_EQ("{\n"
8540 "\t/* aaaa\n"
8541 "\t bbbb */\n"
8542 "}",
8543 format("{\n"
8544 "/* aaaa\n"
8545 " bbbb */\n"
8546 "}",
8547 Tab));
8548 EXPECT_EQ("{\n"
8549 "\t/*\n"
8550 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8551 "\t bbbbbbbbbbbbb\n"
8552 "\t*/\n"
8553 "}",
8554 format("{\n"
8555 "/*\n"
8556 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8557 "*/\n"
8558 "}",
8559 Tab));
8560 EXPECT_EQ("{\n"
8561 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8562 "\t// bbbbbbbbbbbbb\n"
8563 "}",
8564 format("{\n"
8565 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8566 "}",
8567 Tab));
8568 EXPECT_EQ("{\n"
8569 "\t/*\n"
8570 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8571 "\t bbbbbbbbbbbbb\n"
8572 "\t*/\n"
8573 "}",
8574 format("{\n"
8575 "\t/*\n"
8576 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8577 "\t*/\n"
8578 "}",
8579 Tab));
8580 EXPECT_EQ("{\n"
8581 "\t/*\n"
8582 "\n"
8583 "\t*/\n"
8584 "}",
8585 format("{\n"
8586 "\t/*\n"
8587 "\n"
8588 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008589 "}",
8590 Tab));
8591 EXPECT_EQ("{\n"
8592 "\t/*\n"
8593 " asdf\n"
8594 "\t*/\n"
8595 "}",
8596 format("{\n"
8597 "\t/*\n"
8598 " asdf\n"
8599 "\t*/\n"
8600 "}",
8601 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008602
8603 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008604 EXPECT_EQ("/*\n"
8605 " a\t\tcomment\n"
8606 " in multiple lines\n"
8607 " */",
8608 format(" /*\t \t \n"
8609 " \t \t a\t\tcomment\t \t\n"
8610 " \t \t in multiple lines\t\n"
8611 " \t */",
8612 Tab));
8613 EXPECT_EQ("/* some\n"
8614 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008615 format(" \t \t /* some\n"
8616 " \t \t comment */",
8617 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008618 EXPECT_EQ("int a; /* some\n"
8619 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008620 format(" \t \t int a; /* some\n"
8621 " \t \t comment */",
8622 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008623
Alexander Kornienko39856b72013-09-10 09:38:25 +00008624 EXPECT_EQ("int a; /* some\n"
8625 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008626 format(" \t \t int\ta; /* some\n"
8627 " \t \t comment */",
8628 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008629 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8630 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008631 format(" \t \t f(\"\t\t\"); /* some\n"
8632 " \t \t comment */",
8633 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008634 EXPECT_EQ("{\n"
8635 " /*\n"
8636 " * Comment\n"
8637 " */\n"
8638 " int i;\n"
8639 "}",
8640 format("{\n"
8641 "\t/*\n"
8642 "\t * Comment\n"
8643 "\t */\n"
8644 "\t int i;\n"
8645 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008646
8647 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8648 Tab.TabWidth = 8;
8649 Tab.IndentWidth = 8;
8650 EXPECT_EQ("if (aaaaaaaa && // q\n"
8651 " bb) // w\n"
8652 "\t;",
8653 format("if (aaaaaaaa &&// q\n"
8654 "bb)// w\n"
8655 ";",
8656 Tab));
8657 EXPECT_EQ("if (aaa && bbb) // w\n"
8658 "\t;",
8659 format("if(aaa&&bbb)// w\n"
8660 ";",
8661 Tab));
8662 verifyFormat("class X {\n"
8663 "\tvoid f() {\n"
8664 "\t\tsomeFunction(parameter1,\n"
8665 "\t\t\t parameter2);\n"
8666 "\t}\n"
8667 "};",
8668 Tab);
8669 verifyFormat("#define A \\\n"
8670 "\tvoid f() { \\\n"
8671 "\t\tsomeFunction( \\\n"
8672 "\t\t parameter1, \\\n"
8673 "\t\t parameter2); \\\n"
8674 "\t}",
8675 Tab);
8676 Tab.TabWidth = 4;
8677 Tab.IndentWidth = 8;
8678 verifyFormat("class TabWidth4Indent8 {\n"
8679 "\t\tvoid f() {\n"
8680 "\t\t\t\tsomeFunction(parameter1,\n"
8681 "\t\t\t\t\t\t\t parameter2);\n"
8682 "\t\t}\n"
8683 "};",
8684 Tab);
8685 Tab.TabWidth = 4;
8686 Tab.IndentWidth = 4;
8687 verifyFormat("class TabWidth4Indent4 {\n"
8688 "\tvoid f() {\n"
8689 "\t\tsomeFunction(parameter1,\n"
8690 "\t\t\t\t\t parameter2);\n"
8691 "\t}\n"
8692 "};",
8693 Tab);
8694 Tab.TabWidth = 8;
8695 Tab.IndentWidth = 4;
8696 verifyFormat("class TabWidth8Indent4 {\n"
8697 " void f() {\n"
8698 "\tsomeFunction(parameter1,\n"
8699 "\t\t parameter2);\n"
8700 " }\n"
8701 "};",
8702 Tab);
8703 Tab.TabWidth = 8;
8704 Tab.IndentWidth = 8;
8705 EXPECT_EQ("/*\n"
8706 "\t a\t\tcomment\n"
8707 "\t in multiple lines\n"
8708 " */",
8709 format(" /*\t \t \n"
8710 " \t \t a\t\tcomment\t \t\n"
8711 " \t \t in multiple lines\t\n"
8712 " \t */",
8713 Tab));
8714 verifyFormat("{\n"
8715 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8716 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8717 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8718 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8719 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8720 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8721 "};",
8722 Tab);
8723 verifyFormat("enum AA {\n"
8724 "\ta1, // Force multiple lines\n"
8725 "\ta2,\n"
8726 "\ta3\n"
8727 "};",
8728 Tab);
8729 EXPECT_EQ("if (aaaaaaaa && // q\n"
8730 " bb) // w\n"
8731 "\t;",
8732 format("if (aaaaaaaa &&// q\n"
8733 "bb)// w\n"
8734 ";",
8735 Tab));
8736 verifyFormat("class X {\n"
8737 "\tvoid f() {\n"
8738 "\t\tsomeFunction(parameter1,\n"
8739 "\t\t\t parameter2);\n"
8740 "\t}\n"
8741 "};",
8742 Tab);
8743 verifyFormat("{\n"
8744 "\tQ(\n"
8745 "\t {\n"
8746 "\t\t int a;\n"
8747 "\t\t someFunction(aaaaaaaa,\n"
8748 "\t\t\t\t bbbbbbb);\n"
8749 "\t },\n"
8750 "\t p);\n"
8751 "}",
8752 Tab);
8753 EXPECT_EQ("{\n"
8754 "\t/* aaaa\n"
8755 "\t bbbb */\n"
8756 "}",
8757 format("{\n"
8758 "/* aaaa\n"
8759 " bbbb */\n"
8760 "}",
8761 Tab));
8762 EXPECT_EQ("{\n"
8763 "\t/*\n"
8764 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8765 "\t bbbbbbbbbbbbb\n"
8766 "\t*/\n"
8767 "}",
8768 format("{\n"
8769 "/*\n"
8770 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8771 "*/\n"
8772 "}",
8773 Tab));
8774 EXPECT_EQ("{\n"
8775 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8776 "\t// bbbbbbbbbbbbb\n"
8777 "}",
8778 format("{\n"
8779 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8780 "}",
8781 Tab));
8782 EXPECT_EQ("{\n"
8783 "\t/*\n"
8784 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8785 "\t bbbbbbbbbbbbb\n"
8786 "\t*/\n"
8787 "}",
8788 format("{\n"
8789 "\t/*\n"
8790 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8791 "\t*/\n"
8792 "}",
8793 Tab));
8794 EXPECT_EQ("{\n"
8795 "\t/*\n"
8796 "\n"
8797 "\t*/\n"
8798 "}",
8799 format("{\n"
8800 "\t/*\n"
8801 "\n"
8802 "\t*/\n"
8803 "}",
8804 Tab));
8805 EXPECT_EQ("{\n"
8806 "\t/*\n"
8807 " asdf\n"
8808 "\t*/\n"
8809 "}",
8810 format("{\n"
8811 "\t/*\n"
8812 " asdf\n"
8813 "\t*/\n"
8814 "}",
8815 Tab));
8816 EXPECT_EQ("/*\n"
8817 "\t a\t\tcomment\n"
8818 "\t in multiple lines\n"
8819 " */",
8820 format(" /*\t \t \n"
8821 " \t \t a\t\tcomment\t \t\n"
8822 " \t \t in multiple lines\t\n"
8823 " \t */",
8824 Tab));
8825 EXPECT_EQ("/* some\n"
8826 " comment */",
8827 format(" \t \t /* some\n"
8828 " \t \t comment */",
8829 Tab));
8830 EXPECT_EQ("int a; /* some\n"
8831 " comment */",
8832 format(" \t \t int a; /* some\n"
8833 " \t \t comment */",
8834 Tab));
8835 EXPECT_EQ("int a; /* some\n"
8836 "comment */",
8837 format(" \t \t int\ta; /* some\n"
8838 " \t \t comment */",
8839 Tab));
8840 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8841 " comment */",
8842 format(" \t \t f(\"\t\t\"); /* some\n"
8843 " \t \t comment */",
8844 Tab));
8845 EXPECT_EQ("{\n"
8846 " /*\n"
8847 " * Comment\n"
8848 " */\n"
8849 " int i;\n"
8850 "}",
8851 format("{\n"
8852 "\t/*\n"
8853 "\t * Comment\n"
8854 "\t */\n"
8855 "\t int i;\n"
8856 "}"));
8857 Tab.AlignConsecutiveAssignments = true;
8858 Tab.AlignConsecutiveDeclarations = true;
8859 Tab.TabWidth = 4;
8860 Tab.IndentWidth = 4;
8861 verifyFormat("class Assign {\n"
8862 "\tvoid f() {\n"
8863 "\t\tint x = 123;\n"
8864 "\t\tint random = 4;\n"
8865 "\t\tstd::string alphabet =\n"
8866 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8867 "\t}\n"
8868 "};",
8869 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008870}
8871
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008872TEST_F(FormatTest, CalculatesOriginalColumn) {
8873 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8874 "q\"; /* some\n"
8875 " comment */",
8876 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8877 "q\"; /* some\n"
8878 " comment */",
8879 getLLVMStyle()));
8880 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8881 "/* some\n"
8882 " comment */",
8883 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8884 " /* some\n"
8885 " comment */",
8886 getLLVMStyle()));
8887 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8888 "qqq\n"
8889 "/* some\n"
8890 " comment */",
8891 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8892 "qqq\n"
8893 " /* some\n"
8894 " comment */",
8895 getLLVMStyle()));
8896 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8897 "wwww; /* some\n"
8898 " comment */",
8899 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8900 "wwww; /* some\n"
8901 " comment */",
8902 getLLVMStyle()));
8903}
8904
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008905TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008906 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008907 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008908
8909 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008910 " continue;",
8911 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008912 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008913 " continue;",
8914 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008915 verifyFormat("if(true)\n"
8916 " f();\n"
8917 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008918 " f();",
8919 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008920 verifyFormat("do {\n"
8921 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008922 "} while(something());",
8923 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008924 verifyFormat("switch(x) {\n"
8925 "default:\n"
8926 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008927 "}",
8928 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008929 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008930 verifyFormat("size_t x = sizeof(x);", NoSpace);
8931 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8932 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8933 verifyFormat("alignas(128) char a[128];", NoSpace);
8934 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8935 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8936 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008937 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008938 verifyFormat("T A::operator()();", NoSpace);
8939 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008940
8941 FormatStyle Space = getLLVMStyle();
8942 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8943
8944 verifyFormat("int f ();", Space);
8945 verifyFormat("void f (int a, T b) {\n"
8946 " while (true)\n"
8947 " continue;\n"
8948 "}",
8949 Space);
8950 verifyFormat("if (true)\n"
8951 " f ();\n"
8952 "else if (true)\n"
8953 " f ();",
8954 Space);
8955 verifyFormat("do {\n"
8956 " do_something ();\n"
8957 "} while (something ());",
8958 Space);
8959 verifyFormat("switch (x) {\n"
8960 "default:\n"
8961 " break;\n"
8962 "}",
8963 Space);
8964 verifyFormat("A::A () : a (1) {}", Space);
8965 verifyFormat("void f () __attribute__ ((asdf));", Space);
8966 verifyFormat("*(&a + 1);\n"
8967 "&((&a)[1]);\n"
8968 "a[(b + c) * d];\n"
8969 "(((a + 1) * 2) + 3) * 4;",
8970 Space);
8971 verifyFormat("#define A(x) x", Space);
8972 verifyFormat("#define A (x) x", Space);
8973 verifyFormat("#if defined(x)\n"
8974 "#endif",
8975 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008976 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008977 verifyFormat("size_t x = sizeof (x);", Space);
8978 verifyFormat("auto f (int x) -> decltype (x);", Space);
8979 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8980 verifyFormat("alignas (128) char a[128];", Space);
8981 verifyFormat("size_t x = alignof (MyType);", Space);
8982 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8983 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008984 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008985 verifyFormat("T A::operator() ();", Space);
8986 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008987}
8988
8989TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8990 FormatStyle Spaces = getLLVMStyle();
8991
8992 Spaces.SpacesInParentheses = true;
8993 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008994 verifyFormat("call();", Spaces);
8995 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008996 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8997 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008998 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008999 " continue;",
9000 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009001 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009002 " continue;",
9003 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009004 verifyFormat("if ( true )\n"
9005 " f();\n"
9006 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009007 " f();",
9008 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009009 verifyFormat("do {\n"
9010 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009011 "} while ( something() );",
9012 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009013 verifyFormat("switch ( x ) {\n"
9014 "default:\n"
9015 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009016 "}",
9017 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009018
9019 Spaces.SpacesInParentheses = false;
9020 Spaces.SpacesInCStyleCastParentheses = true;
9021 verifyFormat("Type *A = ( Type * )P;", Spaces);
9022 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9023 verifyFormat("x = ( int32 )y;", Spaces);
9024 verifyFormat("int a = ( int )(2.0f);", Spaces);
9025 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9026 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9027 verifyFormat("#define x (( int )-1)", Spaces);
9028
Daniel Jasper92e09822015-03-18 12:59:19 +00009029 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00009030 Spaces.SpacesInParentheses = false;
9031 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009032 Spaces.SpacesInCStyleCastParentheses = true;
9033 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009034 verifyFormat("call( );", Spaces);
9035 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009036 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009037 " continue;",
9038 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009039 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009040 " continue;",
9041 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009042 verifyFormat("if (true)\n"
9043 " f( );\n"
9044 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009045 " f( );",
9046 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009047 verifyFormat("do {\n"
9048 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009049 "} while (something( ));",
9050 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009051 verifyFormat("switch (x) {\n"
9052 "default:\n"
9053 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009054 "}",
9055 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009056
Daniel Jasper92e09822015-03-18 12:59:19 +00009057 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009058 Spaces.SpaceAfterCStyleCast = true;
9059 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009060 verifyFormat("call( );", Spaces);
9061 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009062 verifyFormat("while (( bool ) 1)\n"
9063 " continue;",
9064 Spaces);
9065 verifyFormat("for (;;)\n"
9066 " continue;",
9067 Spaces);
9068 verifyFormat("if (true)\n"
9069 " f( );\n"
9070 "else if (true)\n"
9071 " f( );",
9072 Spaces);
9073 verifyFormat("do {\n"
9074 " do_something(( int ) i);\n"
9075 "} while (something( ));",
9076 Spaces);
9077 verifyFormat("switch (x) {\n"
9078 "default:\n"
9079 " break;\n"
9080 "}",
9081 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009082
9083 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009084 Spaces.SpacesInCStyleCastParentheses = false;
9085 Spaces.SpaceAfterCStyleCast = true;
9086 verifyFormat("while ((bool) 1)\n"
9087 " continue;",
9088 Spaces);
9089 verifyFormat("do {\n"
9090 " do_something((int) i);\n"
9091 "} while (something( ));",
9092 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009093}
9094
Daniel Jasperad981f82014-08-26 11:41:14 +00009095TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9096 verifyFormat("int a[5];");
9097 verifyFormat("a[3] += 42;");
9098
9099 FormatStyle Spaces = getLLVMStyle();
9100 Spaces.SpacesInSquareBrackets = true;
9101 // Lambdas unchanged.
9102 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9103 verifyFormat("return [i, args...] {};", Spaces);
9104
9105 // Not lambdas.
9106 verifyFormat("int a[ 5 ];", Spaces);
9107 verifyFormat("a[ 3 ] += 42;", Spaces);
9108 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9109 verifyFormat("double &operator[](int i) { return 0; }\n"
9110 "int i;",
9111 Spaces);
9112 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9113 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9114 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9115}
9116
Daniel Jasperd94bff32013-09-25 15:15:02 +00009117TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9118 verifyFormat("int a = 5;");
9119 verifyFormat("a += 42;");
9120 verifyFormat("a or_eq 8;");
9121
9122 FormatStyle Spaces = getLLVMStyle();
9123 Spaces.SpaceBeforeAssignmentOperators = false;
9124 verifyFormat("int a= 5;", Spaces);
9125 verifyFormat("a+= 42;", Spaces);
9126 verifyFormat("a or_eq 8;", Spaces);
9127}
9128
Daniel Jaspera44991332015-04-29 13:06:49 +00009129TEST_F(FormatTest, AlignConsecutiveAssignments) {
9130 FormatStyle Alignment = getLLVMStyle();
9131 Alignment.AlignConsecutiveAssignments = false;
9132 verifyFormat("int a = 5;\n"
9133 "int oneTwoThree = 123;",
9134 Alignment);
9135 verifyFormat("int a = 5;\n"
9136 "int oneTwoThree = 123;",
9137 Alignment);
9138
9139 Alignment.AlignConsecutiveAssignments = true;
9140 verifyFormat("int a = 5;\n"
9141 "int oneTwoThree = 123;",
9142 Alignment);
9143 verifyFormat("int a = method();\n"
9144 "int oneTwoThree = 133;",
9145 Alignment);
9146 verifyFormat("a &= 5;\n"
9147 "bcd *= 5;\n"
9148 "ghtyf += 5;\n"
9149 "dvfvdb -= 5;\n"
9150 "a /= 5;\n"
9151 "vdsvsv %= 5;\n"
9152 "sfdbddfbdfbb ^= 5;\n"
9153 "dvsdsv |= 5;\n"
9154 "int dsvvdvsdvvv = 123;",
9155 Alignment);
9156 verifyFormat("int i = 1, j = 10;\n"
9157 "something = 2000;",
9158 Alignment);
9159 verifyFormat("something = 2000;\n"
9160 "int i = 1, j = 10;\n",
9161 Alignment);
9162 verifyFormat("something = 2000;\n"
9163 "another = 911;\n"
9164 "int i = 1, j = 10;\n"
9165 "oneMore = 1;\n"
9166 "i = 2;",
9167 Alignment);
9168 verifyFormat("int a = 5;\n"
9169 "int one = 1;\n"
9170 "method();\n"
9171 "int oneTwoThree = 123;\n"
9172 "int oneTwo = 12;",
9173 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009174 verifyFormat("int oneTwoThree = 123;\n"
9175 "int oneTwo = 12;\n"
9176 "method();\n",
9177 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009178 verifyFormat("int oneTwoThree = 123; // comment\n"
9179 "int oneTwo = 12; // comment",
9180 Alignment);
9181 EXPECT_EQ("int a = 5;\n"
9182 "\n"
9183 "int oneTwoThree = 123;",
9184 format("int a = 5;\n"
9185 "\n"
9186 "int oneTwoThree= 123;",
9187 Alignment));
9188 EXPECT_EQ("int a = 5;\n"
9189 "int one = 1;\n"
9190 "\n"
9191 "int oneTwoThree = 123;",
9192 format("int a = 5;\n"
9193 "int one = 1;\n"
9194 "\n"
9195 "int oneTwoThree = 123;",
9196 Alignment));
9197 EXPECT_EQ("int a = 5;\n"
9198 "int one = 1;\n"
9199 "\n"
9200 "int oneTwoThree = 123;\n"
9201 "int oneTwo = 12;",
9202 format("int a = 5;\n"
9203 "int one = 1;\n"
9204 "\n"
9205 "int oneTwoThree = 123;\n"
9206 "int oneTwo = 12;",
9207 Alignment));
9208 Alignment.AlignEscapedNewlinesLeft = true;
9209 verifyFormat("#define A \\\n"
9210 " int aaaa = 12; \\\n"
9211 " int b = 23; \\\n"
9212 " int ccc = 234; \\\n"
9213 " int dddddddddd = 2345;",
9214 Alignment);
9215 Alignment.AlignEscapedNewlinesLeft = false;
9216 verifyFormat("#define A "
9217 " \\\n"
9218 " int aaaa = 12; "
9219 " \\\n"
9220 " int b = 23; "
9221 " \\\n"
9222 " int ccc = 234; "
9223 " \\\n"
9224 " int dddddddddd = 2345;",
9225 Alignment);
9226 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9227 "k = 4, int l = 5,\n"
9228 " int m = 6) {\n"
9229 " int j = 10;\n"
9230 " otherThing = 1;\n"
9231 "}",
9232 Alignment);
9233 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9234 " int i = 1;\n"
9235 " int j = 2;\n"
9236 " int big = 10000;\n"
9237 "}",
9238 Alignment);
9239 verifyFormat("class C {\n"
9240 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009241 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009242 " virtual void f() = 0;\n"
9243 "};",
9244 Alignment);
9245 verifyFormat("int i = 1;\n"
9246 "if (SomeType t = getSomething()) {\n"
9247 "}\n"
9248 "int j = 2;\n"
9249 "int big = 10000;",
9250 Alignment);
9251 verifyFormat("int j = 7;\n"
9252 "for (int k = 0; k < N; ++k) {\n"
9253 "}\n"
9254 "int j = 2;\n"
9255 "int big = 10000;\n"
9256 "}",
9257 Alignment);
9258 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9259 verifyFormat("int i = 1;\n"
9260 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9261 " = someLooooooooooooooooongFunction();\n"
9262 "int j = 2;",
9263 Alignment);
9264 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9265 verifyFormat("int i = 1;\n"
9266 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9267 " someLooooooooooooooooongFunction();\n"
9268 "int j = 2;",
9269 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009270
9271 verifyFormat("auto lambda = []() {\n"
9272 " auto i = 0;\n"
9273 " return 0;\n"
9274 "};\n"
9275 "int i = 0;\n"
9276 "auto v = type{\n"
9277 " i = 1, //\n"
9278 " (i = 2), //\n"
9279 " i = 3 //\n"
9280 "};",
9281 Alignment);
9282
Daniel Jaspera44991332015-04-29 13:06:49 +00009283 // FIXME: Should align all three assignments
9284 verifyFormat(
9285 "int i = 1;\n"
9286 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9287 " loooooooooooooooooooooongParameterB);\n"
9288 "int j = 2;",
9289 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009290
9291 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9292 " typename B = very_long_type_name_1,\n"
9293 " typename T_2 = very_long_type_name_2>\n"
9294 "auto foo() {}\n",
9295 Alignment);
9296 verifyFormat("int a, b = 1;\n"
9297 "int c = 2;\n"
9298 "int dd = 3;\n",
9299 Alignment);
9300 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9301 "float b[1][] = {{3.f}};\n",
9302 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009303}
9304
Daniel Jaspere12597c2015-10-01 10:06:54 +00009305TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9306 FormatStyle Alignment = getLLVMStyle();
9307 Alignment.AlignConsecutiveDeclarations = false;
9308 verifyFormat("float const a = 5;\n"
9309 "int oneTwoThree = 123;",
9310 Alignment);
9311 verifyFormat("int a = 5;\n"
9312 "float const oneTwoThree = 123;",
9313 Alignment);
9314
9315 Alignment.AlignConsecutiveDeclarations = true;
9316 verifyFormat("float const a = 5;\n"
9317 "int oneTwoThree = 123;",
9318 Alignment);
9319 verifyFormat("int a = method();\n"
9320 "float const oneTwoThree = 133;",
9321 Alignment);
9322 verifyFormat("int i = 1, j = 10;\n"
9323 "something = 2000;",
9324 Alignment);
9325 verifyFormat("something = 2000;\n"
9326 "int i = 1, j = 10;\n",
9327 Alignment);
9328 verifyFormat("float something = 2000;\n"
9329 "double another = 911;\n"
9330 "int i = 1, j = 10;\n"
9331 "const int *oneMore = 1;\n"
9332 "unsigned i = 2;",
9333 Alignment);
9334 verifyFormat("float a = 5;\n"
9335 "int one = 1;\n"
9336 "method();\n"
9337 "const double oneTwoThree = 123;\n"
9338 "const unsigned int oneTwo = 12;",
9339 Alignment);
9340 verifyFormat("int oneTwoThree{0}; // comment\n"
9341 "unsigned oneTwo; // comment",
9342 Alignment);
9343 EXPECT_EQ("float const a = 5;\n"
9344 "\n"
9345 "int oneTwoThree = 123;",
9346 format("float const a = 5;\n"
9347 "\n"
9348 "int oneTwoThree= 123;",
9349 Alignment));
9350 EXPECT_EQ("float a = 5;\n"
9351 "int one = 1;\n"
9352 "\n"
9353 "unsigned oneTwoThree = 123;",
9354 format("float a = 5;\n"
9355 "int one = 1;\n"
9356 "\n"
9357 "unsigned oneTwoThree = 123;",
9358 Alignment));
9359 EXPECT_EQ("float a = 5;\n"
9360 "int one = 1;\n"
9361 "\n"
9362 "unsigned oneTwoThree = 123;\n"
9363 "int oneTwo = 12;",
9364 format("float a = 5;\n"
9365 "int one = 1;\n"
9366 "\n"
9367 "unsigned oneTwoThree = 123;\n"
9368 "int oneTwo = 12;",
9369 Alignment));
9370 Alignment.AlignConsecutiveAssignments = true;
9371 verifyFormat("float something = 2000;\n"
9372 "double another = 911;\n"
9373 "int i = 1, j = 10;\n"
9374 "const int *oneMore = 1;\n"
9375 "unsigned i = 2;",
9376 Alignment);
9377 verifyFormat("int oneTwoThree = {0}; // comment\n"
9378 "unsigned oneTwo = 0; // comment",
9379 Alignment);
9380 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9381 " int const i = 1;\n"
9382 " int * j = 2;\n"
9383 " int big = 10000;\n"
9384 "\n"
9385 " unsigned oneTwoThree = 123;\n"
9386 " int oneTwo = 12;\n"
9387 " method();\n"
9388 " float k = 2;\n"
9389 " int ll = 10000;\n"
9390 "}",
9391 format("void SomeFunction(int parameter= 0) {\n"
9392 " int const i= 1;\n"
9393 " int *j=2;\n"
9394 " int big = 10000;\n"
9395 "\n"
9396 "unsigned oneTwoThree =123;\n"
9397 "int oneTwo = 12;\n"
9398 " method();\n"
9399 "float k= 2;\n"
9400 "int ll=10000;\n"
9401 "}",
9402 Alignment));
9403 Alignment.AlignConsecutiveAssignments = false;
9404 Alignment.AlignEscapedNewlinesLeft = true;
9405 verifyFormat("#define A \\\n"
9406 " int aaaa = 12; \\\n"
9407 " float b = 23; \\\n"
9408 " const int ccc = 234; \\\n"
9409 " unsigned dddddddddd = 2345;",
9410 Alignment);
9411 Alignment.AlignEscapedNewlinesLeft = false;
9412 Alignment.ColumnLimit = 30;
9413 verifyFormat("#define A \\\n"
9414 " int aaaa = 12; \\\n"
9415 " float b = 23; \\\n"
9416 " const int ccc = 234; \\\n"
9417 " int dddddddddd = 2345;",
9418 Alignment);
9419 Alignment.ColumnLimit = 80;
9420 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9421 "k = 4, int l = 5,\n"
9422 " int m = 6) {\n"
9423 " const int j = 10;\n"
9424 " otherThing = 1;\n"
9425 "}",
9426 Alignment);
9427 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9428 " int const i = 1;\n"
9429 " int * j = 2;\n"
9430 " int big = 10000;\n"
9431 "}",
9432 Alignment);
9433 verifyFormat("class C {\n"
9434 "public:\n"
9435 " int i = 1;\n"
9436 " virtual void f() = 0;\n"
9437 "};",
9438 Alignment);
9439 verifyFormat("float i = 1;\n"
9440 "if (SomeType t = getSomething()) {\n"
9441 "}\n"
9442 "const unsigned j = 2;\n"
9443 "int big = 10000;",
9444 Alignment);
9445 verifyFormat("float j = 7;\n"
9446 "for (int k = 0; k < N; ++k) {\n"
9447 "}\n"
9448 "unsigned j = 2;\n"
9449 "int big = 10000;\n"
9450 "}",
9451 Alignment);
9452 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9453 verifyFormat("float i = 1;\n"
9454 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9455 " = someLooooooooooooooooongFunction();\n"
9456 "int j = 2;",
9457 Alignment);
9458 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9459 verifyFormat("int i = 1;\n"
9460 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9461 " someLooooooooooooooooongFunction();\n"
9462 "int j = 2;",
9463 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009464
9465 Alignment.AlignConsecutiveAssignments = true;
9466 verifyFormat("auto lambda = []() {\n"
9467 " auto ii = 0;\n"
9468 " float j = 0;\n"
9469 " return 0;\n"
9470 "};\n"
9471 "int i = 0;\n"
9472 "float i2 = 0;\n"
9473 "auto v = type{\n"
9474 " i = 1, //\n"
9475 " (i = 2), //\n"
9476 " i = 3 //\n"
9477 "};",
9478 Alignment);
9479 Alignment.AlignConsecutiveAssignments = false;
9480
Daniel Jaspere12597c2015-10-01 10:06:54 +00009481 // FIXME: Should align all three declarations
9482 verifyFormat(
9483 "int i = 1;\n"
9484 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9485 " loooooooooooooooooooooongParameterB);\n"
9486 "int j = 2;",
9487 Alignment);
9488
9489 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9490 // We expect declarations and assignments to align, as long as it doesn't
9491 // exceed the column limit, starting a new alignemnt sequence whenever it
9492 // happens.
9493 Alignment.AlignConsecutiveAssignments = true;
9494 Alignment.ColumnLimit = 30;
9495 verifyFormat("float ii = 1;\n"
9496 "unsigned j = 2;\n"
9497 "int someVerylongVariable = 1;\n"
9498 "AnotherLongType ll = 123456;\n"
9499 "VeryVeryLongType k = 2;\n"
9500 "int myvar = 1;",
9501 Alignment);
9502 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009503 Alignment.AlignConsecutiveAssignments = false;
9504
9505 verifyFormat(
9506 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9507 " typename LongType, typename B>\n"
9508 "auto foo() {}\n",
9509 Alignment);
9510 verifyFormat("float a, b = 1;\n"
9511 "int c = 2;\n"
9512 "int dd = 3;\n",
9513 Alignment);
9514 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9515 "float b[1][] = {{3.f}};\n",
9516 Alignment);
9517 Alignment.AlignConsecutiveAssignments = true;
9518 verifyFormat("float a, b = 1;\n"
9519 "int c = 2;\n"
9520 "int dd = 3;\n",
9521 Alignment);
9522 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9523 "float b[1][] = {{3.f}};\n",
9524 Alignment);
9525 Alignment.AlignConsecutiveAssignments = false;
9526
9527 Alignment.ColumnLimit = 30;
9528 Alignment.BinPackParameters = false;
9529 verifyFormat("void foo(float a,\n"
9530 " float b,\n"
9531 " int c,\n"
9532 " uint32_t *d) {\n"
9533 " int * e = 0;\n"
9534 " float f = 0;\n"
9535 " double g = 0;\n"
9536 "}\n"
9537 "void bar(ino_t a,\n"
9538 " int b,\n"
9539 " uint32_t *c,\n"
9540 " bool d) {}\n",
9541 Alignment);
9542 Alignment.BinPackParameters = true;
9543 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009544}
9545
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009546TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009547 FormatStyle LinuxBraceStyle = getLLVMStyle();
9548 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009549 verifyFormat("namespace a\n"
9550 "{\n"
9551 "class A\n"
9552 "{\n"
9553 " void f()\n"
9554 " {\n"
9555 " if (true) {\n"
9556 " a();\n"
9557 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009558 " } else {\n"
9559 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009560 " }\n"
9561 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009562 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009563 "};\n"
9564 "struct B {\n"
9565 " int x;\n"
9566 "};\n"
9567 "}\n",
9568 LinuxBraceStyle);
9569 verifyFormat("enum X {\n"
9570 " Y = 0,\n"
9571 "}\n",
9572 LinuxBraceStyle);
9573 verifyFormat("struct S {\n"
9574 " int Type;\n"
9575 " union {\n"
9576 " int x;\n"
9577 " double y;\n"
9578 " } Value;\n"
9579 " class C\n"
9580 " {\n"
9581 " MyFavoriteType Value;\n"
9582 " } Class;\n"
9583 "}\n",
9584 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009585}
9586
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009587TEST_F(FormatTest, MozillaBraceBreaking) {
9588 FormatStyle MozillaBraceStyle = getLLVMStyle();
9589 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9590 verifyFormat("namespace a {\n"
9591 "class A\n"
9592 "{\n"
9593 " void f()\n"
9594 " {\n"
9595 " if (true) {\n"
9596 " a();\n"
9597 " b();\n"
9598 " }\n"
9599 " }\n"
9600 " void g() { return; }\n"
9601 "};\n"
9602 "enum E\n"
9603 "{\n"
9604 " A,\n"
9605 " // foo\n"
9606 " B,\n"
9607 " C\n"
9608 "};\n"
9609 "struct B\n"
9610 "{\n"
9611 " int x;\n"
9612 "};\n"
9613 "}\n",
9614 MozillaBraceStyle);
9615 verifyFormat("struct S\n"
9616 "{\n"
9617 " int Type;\n"
9618 " union\n"
9619 " {\n"
9620 " int x;\n"
9621 " double y;\n"
9622 " } Value;\n"
9623 " class C\n"
9624 " {\n"
9625 " MyFavoriteType Value;\n"
9626 " } Class;\n"
9627 "}\n",
9628 MozillaBraceStyle);
9629}
9630
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009631TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009632 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9633 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009634 verifyFormat("namespace a {\n"
9635 "class A {\n"
9636 " void f()\n"
9637 " {\n"
9638 " if (true) {\n"
9639 " a();\n"
9640 " b();\n"
9641 " }\n"
9642 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009643 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009644 "};\n"
9645 "struct B {\n"
9646 " int x;\n"
9647 "};\n"
9648 "}\n",
9649 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009650
Daniel Jasperd9670872014-08-05 12:06:20 +00009651 verifyFormat("void foo()\n"
9652 "{\n"
9653 " if (a) {\n"
9654 " a();\n"
9655 " }\n"
9656 " else {\n"
9657 " b();\n"
9658 " }\n"
9659 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009660 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009661
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009662 verifyFormat("#ifdef _DEBUG\n"
9663 "int foo(int i = 0)\n"
9664 "#else\n"
9665 "int foo(int i = 5)\n"
9666 "#endif\n"
9667 "{\n"
9668 " return i;\n"
9669 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009670 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009671
9672 verifyFormat("void foo() {}\n"
9673 "void bar()\n"
9674 "#ifdef _DEBUG\n"
9675 "{\n"
9676 " foo();\n"
9677 "}\n"
9678 "#else\n"
9679 "{\n"
9680 "}\n"
9681 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009682 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009683
9684 verifyFormat("void foobar() { int i = 5; }\n"
9685 "#ifdef _DEBUG\n"
9686 "void bar() {}\n"
9687 "#else\n"
9688 "void bar() { foobar(); }\n"
9689 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009690 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009691}
9692
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009693TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009694 FormatStyle AllmanBraceStyle = getLLVMStyle();
9695 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009696 verifyFormat("namespace a\n"
9697 "{\n"
9698 "class A\n"
9699 "{\n"
9700 " void f()\n"
9701 " {\n"
9702 " if (true)\n"
9703 " {\n"
9704 " a();\n"
9705 " b();\n"
9706 " }\n"
9707 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009708 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009709 "};\n"
9710 "struct B\n"
9711 "{\n"
9712 " int x;\n"
9713 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009714 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009715 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009716
9717 verifyFormat("void f()\n"
9718 "{\n"
9719 " if (true)\n"
9720 " {\n"
9721 " a();\n"
9722 " }\n"
9723 " else if (false)\n"
9724 " {\n"
9725 " b();\n"
9726 " }\n"
9727 " else\n"
9728 " {\n"
9729 " c();\n"
9730 " }\n"
9731 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009732 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009733
9734 verifyFormat("void f()\n"
9735 "{\n"
9736 " for (int i = 0; i < 10; ++i)\n"
9737 " {\n"
9738 " a();\n"
9739 " }\n"
9740 " while (false)\n"
9741 " {\n"
9742 " b();\n"
9743 " }\n"
9744 " do\n"
9745 " {\n"
9746 " c();\n"
9747 " } while (false)\n"
9748 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009749 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009750
9751 verifyFormat("void f(int a)\n"
9752 "{\n"
9753 " switch (a)\n"
9754 " {\n"
9755 " case 0:\n"
9756 " break;\n"
9757 " case 1:\n"
9758 " {\n"
9759 " break;\n"
9760 " }\n"
9761 " case 2:\n"
9762 " {\n"
9763 " }\n"
9764 " break;\n"
9765 " default:\n"
9766 " break;\n"
9767 " }\n"
9768 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009769 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009770
9771 verifyFormat("enum X\n"
9772 "{\n"
9773 " Y = 0,\n"
9774 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009775 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009776 verifyFormat("enum X\n"
9777 "{\n"
9778 " Y = 0\n"
9779 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009780 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009781
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009782 verifyFormat("@interface BSApplicationController ()\n"
9783 "{\n"
9784 "@private\n"
9785 " id _extraIvar;\n"
9786 "}\n"
9787 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009788 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009789
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009790 verifyFormat("#ifdef _DEBUG\n"
9791 "int foo(int i = 0)\n"
9792 "#else\n"
9793 "int foo(int i = 5)\n"
9794 "#endif\n"
9795 "{\n"
9796 " return i;\n"
9797 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009798 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009799
9800 verifyFormat("void foo() {}\n"
9801 "void bar()\n"
9802 "#ifdef _DEBUG\n"
9803 "{\n"
9804 " foo();\n"
9805 "}\n"
9806 "#else\n"
9807 "{\n"
9808 "}\n"
9809 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009810 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009811
9812 verifyFormat("void foobar() { int i = 5; }\n"
9813 "#ifdef _DEBUG\n"
9814 "void bar() {}\n"
9815 "#else\n"
9816 "void bar() { foobar(); }\n"
9817 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009818 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009819
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009820 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009821 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009822 " // ...\n"
9823 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009824 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009825 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009826 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009827 " // ...\n"
9828 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009829 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009830 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009831 // .. or dict literals.
9832 verifyFormat("void f()\n"
9833 "{\n"
9834 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9835 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009836 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009837 verifyFormat("int f()\n"
9838 "{ // comment\n"
9839 " return 42;\n"
9840 "}",
9841 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009842
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009843 AllmanBraceStyle.ColumnLimit = 19;
9844 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9845 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009846 verifyFormat("void f()\n"
9847 "{\n"
9848 " int i;\n"
9849 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009850 AllmanBraceStyle);
9851 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009852
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009853 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009854 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9855 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9856 verifyFormat("void f(bool b)\n"
9857 "{\n"
9858 " if (b)\n"
9859 " {\n"
9860 " return;\n"
9861 " }\n"
9862 "}\n",
9863 BreakBeforeBraceShortIfs);
9864 verifyFormat("void f(bool b)\n"
9865 "{\n"
9866 " if (b) return;\n"
9867 "}\n",
9868 BreakBeforeBraceShortIfs);
9869 verifyFormat("void f(bool b)\n"
9870 "{\n"
9871 " while (b)\n"
9872 " {\n"
9873 " return;\n"
9874 " }\n"
9875 "}\n",
9876 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009877}
9878
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009879TEST_F(FormatTest, GNUBraceBreaking) {
9880 FormatStyle GNUBraceStyle = getLLVMStyle();
9881 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9882 verifyFormat("namespace a\n"
9883 "{\n"
9884 "class A\n"
9885 "{\n"
9886 " void f()\n"
9887 " {\n"
9888 " int a;\n"
9889 " {\n"
9890 " int b;\n"
9891 " }\n"
9892 " if (true)\n"
9893 " {\n"
9894 " a();\n"
9895 " b();\n"
9896 " }\n"
9897 " }\n"
9898 " void g() { return; }\n"
9899 "}\n"
9900 "}",
9901 GNUBraceStyle);
9902
9903 verifyFormat("void f()\n"
9904 "{\n"
9905 " if (true)\n"
9906 " {\n"
9907 " a();\n"
9908 " }\n"
9909 " else if (false)\n"
9910 " {\n"
9911 " b();\n"
9912 " }\n"
9913 " else\n"
9914 " {\n"
9915 " c();\n"
9916 " }\n"
9917 "}\n",
9918 GNUBraceStyle);
9919
9920 verifyFormat("void f()\n"
9921 "{\n"
9922 " for (int i = 0; i < 10; ++i)\n"
9923 " {\n"
9924 " a();\n"
9925 " }\n"
9926 " while (false)\n"
9927 " {\n"
9928 " b();\n"
9929 " }\n"
9930 " do\n"
9931 " {\n"
9932 " c();\n"
9933 " }\n"
9934 " while (false);\n"
9935 "}\n",
9936 GNUBraceStyle);
9937
9938 verifyFormat("void f(int a)\n"
9939 "{\n"
9940 " switch (a)\n"
9941 " {\n"
9942 " case 0:\n"
9943 " break;\n"
9944 " case 1:\n"
9945 " {\n"
9946 " break;\n"
9947 " }\n"
9948 " case 2:\n"
9949 " {\n"
9950 " }\n"
9951 " break;\n"
9952 " default:\n"
9953 " break;\n"
9954 " }\n"
9955 "}\n",
9956 GNUBraceStyle);
9957
9958 verifyFormat("enum X\n"
9959 "{\n"
9960 " Y = 0,\n"
9961 "}\n",
9962 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009963
9964 verifyFormat("@interface BSApplicationController ()\n"
9965 "{\n"
9966 "@private\n"
9967 " id _extraIvar;\n"
9968 "}\n"
9969 "@end\n",
9970 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009971
9972 verifyFormat("#ifdef _DEBUG\n"
9973 "int foo(int i = 0)\n"
9974 "#else\n"
9975 "int foo(int i = 5)\n"
9976 "#endif\n"
9977 "{\n"
9978 " return i;\n"
9979 "}",
9980 GNUBraceStyle);
9981
9982 verifyFormat("void foo() {}\n"
9983 "void bar()\n"
9984 "#ifdef _DEBUG\n"
9985 "{\n"
9986 " foo();\n"
9987 "}\n"
9988 "#else\n"
9989 "{\n"
9990 "}\n"
9991 "#endif",
9992 GNUBraceStyle);
9993
9994 verifyFormat("void foobar() { int i = 5; }\n"
9995 "#ifdef _DEBUG\n"
9996 "void bar() {}\n"
9997 "#else\n"
9998 "void bar() { foobar(); }\n"
9999 "#endif",
10000 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010001}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010002
10003TEST_F(FormatTest, WebKitBraceBreaking) {
10004 FormatStyle WebKitBraceStyle = getLLVMStyle();
10005 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
10006 verifyFormat("namespace a {\n"
10007 "class A {\n"
10008 " void f()\n"
10009 " {\n"
10010 " if (true) {\n"
10011 " a();\n"
10012 " b();\n"
10013 " }\n"
10014 " }\n"
10015 " void g() { return; }\n"
10016 "};\n"
10017 "enum E {\n"
10018 " A,\n"
10019 " // foo\n"
10020 " B,\n"
10021 " C\n"
10022 "};\n"
10023 "struct B {\n"
10024 " int x;\n"
10025 "};\n"
10026 "}\n",
10027 WebKitBraceStyle);
10028 verifyFormat("struct S {\n"
10029 " int Type;\n"
10030 " union {\n"
10031 " int x;\n"
10032 " double y;\n"
10033 " } Value;\n"
10034 " class C {\n"
10035 " MyFavoriteType Value;\n"
10036 " } Class;\n"
10037 "};\n",
10038 WebKitBraceStyle);
10039}
10040
Manuel Klimekd5735502013-08-12 03:51:17 +000010041TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10042 verifyFormat("void f() {\n"
10043 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010044 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010045 " }\n"
10046 "}\n",
10047 getLLVMStyle());
10048}
10049
Daniel Jasper9613c812013-08-07 16:29:23 +000010050TEST_F(FormatTest, UnderstandsPragmas) {
10051 verifyFormat("#pragma omp reduction(| : var)");
10052 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010053
10054 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10055 "(including parentheses).",
10056 format("#pragma mark Any non-hyphenated or hyphenated string "
10057 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010058}
10059
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010060TEST_F(FormatTest, UnderstandPragmaOption) {
10061 verifyFormat("#pragma option -C -A");
10062
10063 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10064}
10065
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010066#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10067 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010068 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10069 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010070
10071TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010072 SmallVector<FormatStyle, 3> Styles;
10073 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010074
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010075 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010076 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10077 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10078 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010079
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010080 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010081 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10082 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10083 EXPECT_ALL_STYLES_EQUAL(Styles);
10084
Nico Weber514ecc82014-02-02 20:50:45 +000010085 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010086 EXPECT_TRUE(
10087 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10088 EXPECT_TRUE(
10089 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10090 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010091
Nico Weber514ecc82014-02-02 20:50:45 +000010092 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010093 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10094 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10095 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010096
10097 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010098 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10099 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10100 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010101
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010102 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010103 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10104 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10105 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010106
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010107 Styles[0] = getGNUStyle();
10108 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10109 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10110 EXPECT_ALL_STYLES_EQUAL(Styles);
10111
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010112 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10113}
10114
10115TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10116 SmallVector<FormatStyle, 8> Styles;
10117 Styles.resize(2);
10118
10119 Styles[0] = getGoogleStyle();
10120 Styles[1] = getLLVMStyle();
10121 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10122 EXPECT_ALL_STYLES_EQUAL(Styles);
10123
10124 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010125 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010126 Styles[1] = getLLVMStyle();
10127 Styles[1].Language = FormatStyle::LK_JavaScript;
10128 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10129
10130 Styles[2] = getLLVMStyle();
10131 Styles[2].Language = FormatStyle::LK_JavaScript;
10132 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10133 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010134 &Styles[2])
10135 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010136
10137 Styles[3] = getLLVMStyle();
10138 Styles[3].Language = FormatStyle::LK_JavaScript;
10139 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10140 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010141 &Styles[3])
10142 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010143
10144 Styles[4] = getLLVMStyle();
10145 Styles[4].Language = FormatStyle::LK_JavaScript;
10146 EXPECT_EQ(0, parseConfiguration("---\n"
10147 "BasedOnStyle: LLVM\n"
10148 "IndentWidth: 123\n"
10149 "---\n"
10150 "BasedOnStyle: Google\n"
10151 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010152 &Styles[4])
10153 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010154 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010155}
10156
Daniel Jasper91881d92014-09-29 08:07:46 +000010157#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010158 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010159 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010160 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010161 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010162 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010163
Daniel Jasper91881d92014-09-29 08:07:46 +000010164#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10165
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010166#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10167 Style.STRUCT.FIELD = false; \
10168 EXPECT_EQ(0, \
10169 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10170 .value()); \
10171 EXPECT_TRUE(Style.STRUCT.FIELD); \
10172 EXPECT_EQ(0, \
10173 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10174 .value()); \
10175 EXPECT_FALSE(Style.STRUCT.FIELD);
10176
10177#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10178 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10179
Daniel Jasper00853002014-09-16 16:22:30 +000010180#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10181 EXPECT_NE(VALUE, Style.FIELD); \
10182 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10183 EXPECT_EQ(VALUE, Style.FIELD)
10184
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010185TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010186 FormatStyle Style = {};
10187 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010188 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +000010189 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010190 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010191 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010192 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010193 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010194 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010195 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010196 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010197 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010198 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010199 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010200 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010201 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010202 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +000010203 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010204 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010205 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010206 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010207 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010208 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010209 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010210 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010211 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010212 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010213 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010214 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010215 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010216 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010217 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010218 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010219 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010220 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010221 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010222 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010223 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010224 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010225 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010226
10227 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10228 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10229 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10230 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10231 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10232 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10233 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10234 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
10235 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10236 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10237 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010238}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010239
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010240#undef CHECK_PARSE_BOOL
10241
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010242TEST_F(FormatTest, ParsesConfiguration) {
10243 FormatStyle Style = {};
10244 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010245 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010246 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10247 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010248 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010249 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10250 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010251 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10252 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010253 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10254 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10255 PenaltyReturnTypeOnItsOwnLine, 1234u);
10256 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10257 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010258 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010259 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010260 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010261
Daniel Jasper553d4872014-06-17 12:40:34 +000010262 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010263 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10264 FormatStyle::PAS_Left);
10265 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10266 FormatStyle::PAS_Right);
10267 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10268 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010269 // For backward compatibility:
10270 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10271 FormatStyle::PAS_Left);
10272 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10273 FormatStyle::PAS_Right);
10274 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10275 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010276
Alexander Kornienkod6538332013-05-07 15:32:14 +000010277 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010278 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10279 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010280 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10281 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10282 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10283
Daniel Jasperac043c92014-09-15 11:11:00 +000010284 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010285 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10286 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010287 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10288 FormatStyle::BOS_None);
10289 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10290 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010291 // For backward compatibility:
10292 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10293 FormatStyle::BOS_None);
10294 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10295 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010296
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010297 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10298 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10299 FormatStyle::BAS_Align);
10300 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10301 FormatStyle::BAS_DontAlign);
10302 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10303 FormatStyle::BAS_AlwaysBreak);
10304 // For backward compatibility:
10305 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10306 FormatStyle::BAS_DontAlign);
10307 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10308 FormatStyle::BAS_Align);
10309
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010310 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010311 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10312 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10313 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010314 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10315 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010316 // For backward compatibility:
10317 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10318 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010319
Daniel Jasperd74cf402014-04-08 12:46:38 +000010320 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010321 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10322 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10323 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10324 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010325 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10326 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010327 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10328 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010329 // For backward compatibility:
10330 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10331 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10332 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10333 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010334
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010335 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10336 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10337 FormatStyle::SBPO_Never);
10338 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10339 FormatStyle::SBPO_Always);
10340 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10341 FormatStyle::SBPO_ControlStatements);
10342 // For backward compatibility:
10343 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10344 FormatStyle::SBPO_Never);
10345 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10346 FormatStyle::SBPO_ControlStatements);
10347
Alexander Kornienkod6538332013-05-07 15:32:14 +000010348 Style.ColumnLimit = 123;
10349 FormatStyle BaseStyle = getLLVMStyle();
10350 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10351 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10352
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010353 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10354 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10355 FormatStyle::BS_Attach);
10356 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10357 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010358 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10359 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010360 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10361 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010362 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10363 FormatStyle::BS_Allman);
10364 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010365 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10366 FormatStyle::BS_WebKit);
10367 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10368 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010369
Zachary Turner448592e2015-12-18 22:20:15 +000010370 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10371 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10372 FormatStyle::RTBS_None);
10373 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10374 FormatStyle::RTBS_All);
10375 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010376 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010377 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10378 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10379 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10380 AlwaysBreakAfterReturnType,
10381 FormatStyle::RTBS_TopLevelDefinitions);
10382
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010383 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10384 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10385 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10386 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10387 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10388 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10389 AlwaysBreakAfterDefinitionReturnType,
10390 FormatStyle::DRTBS_TopLevel);
10391
Daniel Jasper65ee3472013-07-31 23:16:02 +000010392 Style.NamespaceIndentation = FormatStyle::NI_All;
10393 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10394 FormatStyle::NI_None);
10395 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10396 FormatStyle::NI_Inner);
10397 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10398 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010399
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010400 // FIXME: This is required because parsing a configuration simply overwrites
10401 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010402 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010403 std::vector<std::string> BoostForeach;
10404 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010405 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010406 std::vector<std::string> BoostAndQForeach;
10407 BoostAndQForeach.push_back("BOOST_FOREACH");
10408 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010409 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10410 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010411
10412 Style.IncludeCategories.clear();
10413 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10414 {".*", 1}};
10415 CHECK_PARSE("IncludeCategories:\n"
10416 " - Regex: abc/.*\n"
10417 " Priority: 2\n"
10418 " - Regex: .*\n"
10419 " Priority: 1",
10420 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010421 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010422}
10423
10424TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10425 FormatStyle Style = {};
10426 Style.Language = FormatStyle::LK_Cpp;
10427 CHECK_PARSE("Language: Cpp\n"
10428 "IndentWidth: 12",
10429 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010430 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10431 "IndentWidth: 34",
10432 &Style),
10433 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010434 EXPECT_EQ(12u, Style.IndentWidth);
10435 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10436 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10437
10438 Style.Language = FormatStyle::LK_JavaScript;
10439 CHECK_PARSE("Language: JavaScript\n"
10440 "IndentWidth: 12",
10441 IndentWidth, 12u);
10442 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010443 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10444 "IndentWidth: 34",
10445 &Style),
10446 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010447 EXPECT_EQ(23u, Style.IndentWidth);
10448 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10449 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10450
10451 CHECK_PARSE("BasedOnStyle: LLVM\n"
10452 "IndentWidth: 67",
10453 IndentWidth, 67u);
10454
10455 CHECK_PARSE("---\n"
10456 "Language: JavaScript\n"
10457 "IndentWidth: 12\n"
10458 "---\n"
10459 "Language: Cpp\n"
10460 "IndentWidth: 34\n"
10461 "...\n",
10462 IndentWidth, 12u);
10463
10464 Style.Language = FormatStyle::LK_Cpp;
10465 CHECK_PARSE("---\n"
10466 "Language: JavaScript\n"
10467 "IndentWidth: 12\n"
10468 "---\n"
10469 "Language: Cpp\n"
10470 "IndentWidth: 34\n"
10471 "...\n",
10472 IndentWidth, 34u);
10473 CHECK_PARSE("---\n"
10474 "IndentWidth: 78\n"
10475 "---\n"
10476 "Language: JavaScript\n"
10477 "IndentWidth: 56\n"
10478 "...\n",
10479 IndentWidth, 78u);
10480
10481 Style.ColumnLimit = 123;
10482 Style.IndentWidth = 234;
10483 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10484 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010485 EXPECT_FALSE(parseConfiguration("---\n"
10486 "IndentWidth: 456\n"
10487 "BreakBeforeBraces: Allman\n"
10488 "---\n"
10489 "Language: JavaScript\n"
10490 "IndentWidth: 111\n"
10491 "TabWidth: 111\n"
10492 "---\n"
10493 "Language: Cpp\n"
10494 "BreakBeforeBraces: Stroustrup\n"
10495 "TabWidth: 789\n"
10496 "...\n",
10497 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010498 EXPECT_EQ(123u, Style.ColumnLimit);
10499 EXPECT_EQ(456u, Style.IndentWidth);
10500 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10501 EXPECT_EQ(789u, Style.TabWidth);
10502
Rafael Espindola1f243172014-06-12 11:35:17 +000010503 EXPECT_EQ(parseConfiguration("---\n"
10504 "Language: JavaScript\n"
10505 "IndentWidth: 56\n"
10506 "---\n"
10507 "IndentWidth: 78\n"
10508 "...\n",
10509 &Style),
10510 ParseError::Error);
10511 EXPECT_EQ(parseConfiguration("---\n"
10512 "Language: JavaScript\n"
10513 "IndentWidth: 56\n"
10514 "---\n"
10515 "Language: JavaScript\n"
10516 "IndentWidth: 78\n"
10517 "...\n",
10518 &Style),
10519 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010520
10521 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10522}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010523
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010524#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010525
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010526TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10527 FormatStyle Style = {};
10528 Style.Language = FormatStyle::LK_JavaScript;
10529 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010530 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010531 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010532
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010533 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010534 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010535 "BasedOnStyle: Google\n"
10536 "---\n"
10537 "Language: JavaScript\n"
10538 "IndentWidth: 76\n"
10539 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010540 &Style)
10541 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010542 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010543 EXPECT_EQ(76u, Style.IndentWidth);
10544 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10545}
10546
Alexander Kornienkod6538332013-05-07 15:32:14 +000010547TEST_F(FormatTest, ConfigurationRoundTripTest) {
10548 FormatStyle Style = getLLVMStyle();
10549 std::string YAML = configurationAsText(Style);
10550 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010551 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010552 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10553 EXPECT_EQ(Style, ParsedStyle);
10554}
10555
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010556TEST_F(FormatTest, WorksFor8bitEncodings) {
10557 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10558 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10559 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10560 "\"\xef\xee\xf0\xf3...\"",
10561 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10562 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10563 "\xef\xee\xf0\xf3...\"",
10564 getLLVMStyleWithColumns(12)));
10565}
10566
Alexander Kornienko393e3082013-11-13 14:04:17 +000010567TEST_F(FormatTest, HandlesUTF8BOM) {
10568 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10569 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10570 format("\xef\xbb\xbf#include <iostream>"));
10571 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10572 format("\xef\xbb\xbf\n#include <iostream>"));
10573}
10574
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010575// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10576#if !defined(_MSC_VER)
10577
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010578TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10579 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10580 getLLVMStyleWithColumns(35));
10581 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010582 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010583 verifyFormat("// Однажды в студёную зимнюю пору...",
10584 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010585 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010586 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10587 getLLVMStyleWithColumns(39));
10588 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010589 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010590}
10591
10592TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010593 // Non-printable characters' width is currently considered to be the length in
10594 // bytes in UTF8. The characters can be displayed in very different manner
10595 // (zero-width, single width with a substitution glyph, expanded to their code
10596 // (e.g. "<8d>"), so there's no single correct way to handle them.
10597 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010598 "\"\xc2\x8d\";",
10599 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010600 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010601 "\"\xc2\x8d\";",
10602 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010603 EXPECT_EQ("\"Однажды, в \"\n"
10604 "\"студёную \"\n"
10605 "\"зимнюю \"\n"
10606 "\"пору,\"",
10607 format("\"Однажды, в студёную зимнюю пору,\"",
10608 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010609 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010610 "\"一 二 三 \"\n"
10611 "\"四 五六 \"\n"
10612 "\"七 八 九 \"\n"
10613 "\"十\"",
10614 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010615 EXPECT_EQ("\"一\t二 \"\n"
10616 "\"\t三 \"\n"
10617 "\"四 五\t六 \"\n"
10618 "\"\t七 \"\n"
10619 "\"八九十\tqq\"",
10620 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10621 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010622
10623 // UTF8 character in an escape sequence.
10624 EXPECT_EQ("\"aaaaaa\"\n"
10625 "\"\\\xC2\x8D\"",
10626 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010627}
10628
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010629TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10630 EXPECT_EQ("const char *sssss =\n"
10631 " \"一二三四五六七八\\\n"
10632 " 九 十\";",
10633 format("const char *sssss = \"一二三四五六七八\\\n"
10634 " 九 十\";",
10635 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010636}
10637
10638TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010639 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10640 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010641 EXPECT_EQ("// Я из лесу\n"
10642 "// вышел; был\n"
10643 "// сильный\n"
10644 "// мороз.",
10645 format("// Я из лесу вышел; был сильный мороз.",
10646 getLLVMStyleWithColumns(13)));
10647 EXPECT_EQ("// 一二三\n"
10648 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010649 "// 八 九\n"
10650 "// 十",
10651 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010652}
10653
10654TEST_F(FormatTest, SplitsUTF8BlockComments) {
10655 EXPECT_EQ("/* Гляжу,\n"
10656 " * поднимается\n"
10657 " * медленно в\n"
10658 " * гору\n"
10659 " * Лошадка,\n"
10660 " * везущая\n"
10661 " * хворосту\n"
10662 " * воз. */",
10663 format("/* Гляжу, поднимается медленно в гору\n"
10664 " * Лошадка, везущая хворосту воз. */",
10665 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010666 EXPECT_EQ(
10667 "/* 一二三\n"
10668 " * 四五六七\n"
10669 " * 八 九\n"
10670 " * 十 */",
10671 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010672 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10673 " * 𝕓𝕪𝕥𝕖\n"
10674 " * 𝖀𝕿𝕱-𝟠 */",
10675 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010676}
10677
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010678#endif // _MSC_VER
10679
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010680TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10681 FormatStyle Style = getLLVMStyle();
10682
10683 Style.ConstructorInitializerIndentWidth = 4;
10684 verifyFormat(
10685 "SomeClass::Constructor()\n"
10686 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10687 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10688 Style);
10689
10690 Style.ConstructorInitializerIndentWidth = 2;
10691 verifyFormat(
10692 "SomeClass::Constructor()\n"
10693 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10694 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10695 Style);
10696
10697 Style.ConstructorInitializerIndentWidth = 0;
10698 verifyFormat(
10699 "SomeClass::Constructor()\n"
10700 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10701 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10702 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010703 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10704 verifyFormat(
10705 "SomeLongTemplateVariableName<\n"
10706 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10707 Style);
10708 verifyFormat(
10709 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10710 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10711 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010712}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010713
Daniel Jasper00853002014-09-16 16:22:30 +000010714TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10715 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010716 Style.BreakConstructorInitializersBeforeComma = true;
10717 Style.ConstructorInitializerIndentWidth = 4;
10718 verifyFormat("SomeClass::Constructor()\n"
10719 " : a(a)\n"
10720 " , b(b)\n"
10721 " , c(c) {}",
10722 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010723 verifyFormat("SomeClass::Constructor()\n"
10724 " : a(a) {}",
10725 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010726
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010727 Style.ColumnLimit = 0;
10728 verifyFormat("SomeClass::Constructor()\n"
10729 " : a(a) {}",
10730 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010731 verifyFormat("SomeClass::Constructor() noexcept\n"
10732 " : a(a) {}",
10733 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010734 verifyFormat("SomeClass::Constructor()\n"
10735 " : a(a)\n"
10736 " , b(b)\n"
10737 " , c(c) {}",
10738 Style);
10739 verifyFormat("SomeClass::Constructor()\n"
10740 " : a(a) {\n"
10741 " foo();\n"
10742 " bar();\n"
10743 "}",
10744 Style);
10745
Daniel Jasperd74cf402014-04-08 12:46:38 +000010746 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010747 verifyFormat("SomeClass::Constructor()\n"
10748 " : a(a)\n"
10749 " , b(b)\n"
10750 " , c(c) {\n}",
10751 Style);
10752 verifyFormat("SomeClass::Constructor()\n"
10753 " : a(a) {\n}",
10754 Style);
10755
10756 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010757 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010758 Style.ConstructorInitializerIndentWidth = 2;
10759 verifyFormat("SomeClass::Constructor()\n"
10760 " : a(a)\n"
10761 " , b(b)\n"
10762 " , c(c) {}",
10763 Style);
10764
10765 Style.ConstructorInitializerIndentWidth = 0;
10766 verifyFormat("SomeClass::Constructor()\n"
10767 ": a(a)\n"
10768 ", b(b)\n"
10769 ", c(c) {}",
10770 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010771
10772 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10773 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010774 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10775 verifyFormat(
10776 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10777 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010778 verifyFormat(
10779 "SomeClass::Constructor()\n"
10780 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10781 Style);
10782 Style.ConstructorInitializerIndentWidth = 4;
10783 Style.ColumnLimit = 60;
10784 verifyFormat("SomeClass::Constructor()\n"
10785 " : aaaaaaaa(aaaaaaaa)\n"
10786 " , aaaaaaaa(aaaaaaaa)\n"
10787 " , aaaaaaaa(aaaaaaaa) {}",
10788 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010789}
10790
Daniel Jasper38efc132014-10-21 07:51:54 +000010791TEST_F(FormatTest, Destructors) {
10792 verifyFormat("void F(int &i) { i.~int(); }");
10793 verifyFormat("void F(int &i) { i->~int(); }");
10794}
10795
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010796TEST_F(FormatTest, FormatsWithWebKitStyle) {
10797 FormatStyle Style = getWebKitStyle();
10798
10799 // Don't indent in outer namespaces.
10800 verifyFormat("namespace outer {\n"
10801 "int i;\n"
10802 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010803 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010804 "} // namespace inner\n"
10805 "} // namespace outer\n"
10806 "namespace other_outer {\n"
10807 "int i;\n"
10808 "}",
10809 Style);
10810
10811 // Don't indent case labels.
10812 verifyFormat("switch (variable) {\n"
10813 "case 1:\n"
10814 "case 2:\n"
10815 " doSomething();\n"
10816 " break;\n"
10817 "default:\n"
10818 " ++variable;\n"
10819 "}",
10820 Style);
10821
10822 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010823 EXPECT_EQ("void f()\n"
10824 "{\n"
10825 " if (aaaaaaaaaaaaaaaa\n"
10826 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10827 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10828 " return;\n"
10829 "}",
10830 format("void f() {\n"
10831 "if (aaaaaaaaaaaaaaaa\n"
10832 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10833 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10834 "return;\n"
10835 "}",
10836 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010837
Daniel Jasper35995672014-04-29 14:05:20 +000010838 // Allow functions on a single line.
10839 verifyFormat("void f() { return; }", Style);
10840
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010841 // Constructor initializers are formatted one per line with the "," on the
10842 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010843 verifyFormat("Constructor()\n"
10844 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10845 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010846 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010847 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10848 "{\n"
10849 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010850 Style);
10851 verifyFormat("SomeClass::Constructor()\n"
10852 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010853 "{\n"
10854 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010855 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010856 EXPECT_EQ("SomeClass::Constructor()\n"
10857 " : a(a)\n"
10858 "{\n"
10859 "}",
10860 format("SomeClass::Constructor():a(a){}", Style));
10861 verifyFormat("SomeClass::Constructor()\n"
10862 " : a(a)\n"
10863 " , b(b)\n"
10864 " , c(c)\n"
10865 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010866 "}",
10867 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010868 verifyFormat("SomeClass::Constructor()\n"
10869 " : a(a)\n"
10870 "{\n"
10871 " foo();\n"
10872 " bar();\n"
10873 "}",
10874 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010875
Daniel Jasper65ee3472013-07-31 23:16:02 +000010876 // Access specifiers should be aligned left.
10877 verifyFormat("class C {\n"
10878 "public:\n"
10879 " int i;\n"
10880 "};",
10881 Style);
10882
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010883 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010884 verifyFormat("int a; // Do not\n"
10885 "double b; // align comments.",
10886 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010887
Daniel Jasper3219e432014-12-02 13:24:51 +000010888 // Do not align operands.
10889 EXPECT_EQ("ASSERT(aaaa\n"
10890 " || bbbb);",
10891 format("ASSERT ( aaaa\n||bbbb);", Style));
10892
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010893 // Accept input's line breaks.
10894 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10895 " || bbbbbbbbbbbbbbb) {\n"
10896 " i++;\n"
10897 "}",
10898 format("if (aaaaaaaaaaaaaaa\n"
10899 "|| bbbbbbbbbbbbbbb) { i++; }",
10900 Style));
10901 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10902 " i++;\n"
10903 "}",
10904 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010905
10906 // Don't automatically break all macro definitions (llvm.org/PR17842).
10907 verifyFormat("#define aNumber 10", Style);
10908 // However, generally keep the line breaks that the user authored.
10909 EXPECT_EQ("#define aNumber \\\n"
10910 " 10",
10911 format("#define aNumber \\\n"
10912 " 10",
10913 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010914
10915 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010916 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10917 " copyItems:YES];",
10918 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10919 "copyItems:YES];",
10920 Style));
10921 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10922 " copyItems:YES];",
10923 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10924 " copyItems:YES];",
10925 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010926 // FIXME: This does not seem right, there should be more indentation before
10927 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010928 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010929 " @\"a\",\n"
10930 " @\"a\"\n"
10931 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010932 " copyItems:YES];",
10933 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10934 " @\"a\",\n"
10935 " @\"a\"\n"
10936 " ]\n"
10937 " copyItems:YES];",
10938 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010939 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010940 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10941 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010942 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10943 " copyItems:YES];",
10944 Style));
10945
10946 verifyFormat("[self.a b:c c:d];", Style);
10947 EXPECT_EQ("[self.a b:c\n"
10948 " c:d];",
10949 format("[self.a b:c\n"
10950 "c:d];",
10951 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010952}
10953
Manuel Klimekffdeb592013-09-03 15:10:01 +000010954TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010955 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10956 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10957 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10958 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10959 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010960 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010961 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010962 verifyFormat("void f() {\n"
10963 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10964 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010965 verifyFormat("void f() {\n"
10966 " other(x.begin(), //\n"
10967 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010968 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010969 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010970 verifyFormat("SomeFunction([]() { // A cool function...\n"
10971 " return 43;\n"
10972 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010973 EXPECT_EQ("SomeFunction([]() {\n"
10974 "#define A a\n"
10975 " return 43;\n"
10976 "});",
10977 format("SomeFunction([](){\n"
10978 "#define A a\n"
10979 "return 43;\n"
10980 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010981 verifyFormat("void f() {\n"
10982 " SomeFunction([](decltype(x), A *a) {});\n"
10983 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010984 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10985 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010986 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10987 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10988 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010989 verifyFormat("Constructor()\n"
10990 " : Field([] { // comment\n"
10991 " int i;\n"
10992 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010993 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10994 " return some_parameter.size();\n"
10995 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010996 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10997 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010998 verifyFormat("int i = aaaaaa ? 1 //\n"
10999 " : [] {\n"
11000 " return 2; //\n"
11001 " }();");
11002 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11003 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11004 " return x == 2; // force break\n"
11005 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011006 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
11007 " int iiiiiiiiiiii) {\n"
11008 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
11009 "});",
11010 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011011 verifyFormat("SomeFunction({[&] {\n"
11012 " // comment\n"
11013 " },\n"
11014 " [&] {\n"
11015 " // comment\n"
11016 " }});");
11017 verifyFormat("SomeFunction({[&] {\n"
11018 " // comment\n"
11019 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011020 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11021 " [&]() { return true; },\n"
11022 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011023
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011024 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011025 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011026 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011027 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11028 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011029 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011030 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011031 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11032 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011033 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011034 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11035 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011036 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011037 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011038 verifyFormat(
11039 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11040 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11041 " return aaaaaaaaaaaaaaaaa;\n"
11042 " });",
11043 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011044 verifyFormat("[]() //\n"
11045 " -> int {\n"
11046 " return 1; //\n"
11047 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011048
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011049 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011050 verifyFormat("SomeFunction(\n"
11051 " []() {\n"
11052 " int i = 42;\n"
11053 " return i;\n"
11054 " },\n"
11055 " []() {\n"
11056 " int j = 43;\n"
11057 " return j;\n"
11058 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011059
Daniel Jasperda18fd82014-06-10 06:39:03 +000011060 // More complex introducers.
11061 verifyFormat("return [i, args...] {};");
11062
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011063 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011064 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011065 verifyFormat("double &operator[](int i) { return 0; }\n"
11066 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011067 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011068 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011069 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011070
11071 // Other corner cases.
11072 verifyFormat("void f() {\n"
11073 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
11074 " );\n"
11075 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011076
11077 // Lambdas created through weird macros.
11078 verifyFormat("void f() {\n"
11079 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011080 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011081 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011082
11083 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11084 " doo_dah();\n"
11085 " doo_dah();\n"
11086 " })) {\n"
11087 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011088 verifyFormat("auto lambda = []() {\n"
11089 " int a = 2\n"
11090 "#if A\n"
11091 " + 2\n"
11092 "#endif\n"
11093 " ;\n"
11094 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011095}
11096
Manuel Klimek516e0542013-09-04 13:25:30 +000011097TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011098 FormatStyle ShortBlocks = getLLVMStyle();
11099 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11100 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11101 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11102 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11103 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11104 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11105 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011106
Daniel Jasper76284682014-10-22 09:12:44 +000011107 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11108 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11109 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011110
Daniel Jasper76284682014-10-22 09:12:44 +000011111 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011112 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011113 "}];");
11114 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011115 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011116 "}]};");
11117 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011118 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011119 "}];");
11120 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011121 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011122 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011123 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011124 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011125 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011126 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011127 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011128
11129 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011130 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011131 "}];",
11132 getLLVMStyleWithColumns(60));
11133 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011134 " NSString *path = [self sessionFilePath];\n"
11135 " if (path) {\n"
11136 " // ...\n"
11137 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011138 "});");
11139 verifyFormat("[[SessionService sharedService]\n"
11140 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011141 " if (window) {\n"
11142 " [self windowDidLoad:window];\n"
11143 " } else {\n"
11144 " [self errorLoadingWindow];\n"
11145 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011146 " }];");
11147 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011148 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011149 "};\n",
11150 getLLVMStyleWithColumns(40));
11151 verifyFormat("[[SessionService sharedService]\n"
11152 " loadWindowWithCompletionBlock: //\n"
11153 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011154 " if (window) {\n"
11155 " [self windowDidLoad:window];\n"
11156 " } else {\n"
11157 " [self errorLoadingWindow];\n"
11158 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011159 " }];",
11160 getLLVMStyleWithColumns(60));
11161 verifyFormat("[myObject doSomethingWith:arg1\n"
11162 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011163 " // ...\n"
11164 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011165 " }\n"
11166 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011167 " // ...\n"
11168 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011169 " }\n"
11170 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011171 " // ...\n"
11172 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011173 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011174 verifyFormat("[myObject doSomethingWith:arg1\n"
11175 " firstBlock:-1\n"
11176 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011177 " // ...\n"
11178 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011179 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011180
11181 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011182 " @autoreleasepool {\n"
11183 " if (a) {\n"
11184 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011185 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011186 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011187 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011188 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011189 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11190 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011191
11192 FormatStyle FourIndent = getLLVMStyle();
11193 FourIndent.ObjCBlockIndentWidth = 4;
11194 verifyFormat("[operation setCompletionBlock:^{\n"
11195 " [self onOperationDone];\n"
11196 "}];",
11197 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011198}
11199
Daniel Jasper289afc02015-04-23 09:23:17 +000011200TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11201 FormatStyle ZeroColumn = getLLVMStyle();
11202 ZeroColumn.ColumnLimit = 0;
11203
11204 verifyFormat("[[SessionService sharedService] "
11205 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11206 " if (window) {\n"
11207 " [self windowDidLoad:window];\n"
11208 " } else {\n"
11209 " [self errorLoadingWindow];\n"
11210 " }\n"
11211 "}];",
11212 ZeroColumn);
11213 EXPECT_EQ("[[SessionService sharedService]\n"
11214 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11215 " if (window) {\n"
11216 " [self windowDidLoad:window];\n"
11217 " } else {\n"
11218 " [self errorLoadingWindow];\n"
11219 " }\n"
11220 " }];",
11221 format("[[SessionService sharedService]\n"
11222 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11223 " if (window) {\n"
11224 " [self windowDidLoad:window];\n"
11225 " } else {\n"
11226 " [self errorLoadingWindow];\n"
11227 " }\n"
11228 "}];",
11229 ZeroColumn));
11230 verifyFormat("[myObject doSomethingWith:arg1\n"
11231 " firstBlock:^(Foo *a) {\n"
11232 " // ...\n"
11233 " int i;\n"
11234 " }\n"
11235 " secondBlock:^(Bar *b) {\n"
11236 " // ...\n"
11237 " int i;\n"
11238 " }\n"
11239 " thirdBlock:^Foo(Bar *b) {\n"
11240 " // ...\n"
11241 " int i;\n"
11242 " }];",
11243 ZeroColumn);
11244 verifyFormat("f(^{\n"
11245 " @autoreleasepool {\n"
11246 " if (a) {\n"
11247 " g();\n"
11248 " }\n"
11249 " }\n"
11250 "});",
11251 ZeroColumn);
11252 verifyFormat("void (^largeBlock)(void) = ^{\n"
11253 " // ...\n"
11254 "};",
11255 ZeroColumn);
11256
11257 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11258 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011259 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011260 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11261 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11262 " int i;\n"
11263 "};",
11264 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11265}
11266
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011267TEST_F(FormatTest, SupportsCRLF) {
11268 EXPECT_EQ("int a;\r\n"
11269 "int b;\r\n"
11270 "int c;\r\n",
11271 format("int a;\r\n"
11272 " int b;\r\n"
11273 " int c;\r\n",
11274 getLLVMStyle()));
11275 EXPECT_EQ("int a;\r\n"
11276 "int b;\r\n"
11277 "int c;\r\n",
11278 format("int a;\r\n"
11279 " int b;\n"
11280 " int c;\r\n",
11281 getLLVMStyle()));
11282 EXPECT_EQ("int a;\n"
11283 "int b;\n"
11284 "int c;\n",
11285 format("int a;\r\n"
11286 " int b;\n"
11287 " int c;\n",
11288 getLLVMStyle()));
11289 EXPECT_EQ("\"aaaaaaa \"\r\n"
11290 "\"bbbbbbb\";\r\n",
11291 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11292 EXPECT_EQ("#define A \\\r\n"
11293 " b; \\\r\n"
11294 " c; \\\r\n"
11295 " d;\r\n",
11296 format("#define A \\\r\n"
11297 " b; \\\r\n"
11298 " c; d; \r\n",
11299 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011300
11301 EXPECT_EQ("/*\r\n"
11302 "multi line block comments\r\n"
11303 "should not introduce\r\n"
11304 "an extra carriage return\r\n"
11305 "*/\r\n",
11306 format("/*\r\n"
11307 "multi line block comments\r\n"
11308 "should not introduce\r\n"
11309 "an extra carriage return\r\n"
11310 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011311}
11312
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011313TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11314 verifyFormat("MY_CLASS(C) {\n"
11315 " int i;\n"
11316 " int j;\n"
11317 "};");
11318}
11319
Daniel Jasper6633ab82013-10-18 10:38:14 +000011320TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11321 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11322 TwoIndent.ContinuationIndentWidth = 2;
11323
11324 EXPECT_EQ("int i =\n"
11325 " longFunction(\n"
11326 " arg);",
11327 format("int i = longFunction(arg);", TwoIndent));
11328
11329 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11330 SixIndent.ContinuationIndentWidth = 6;
11331
11332 EXPECT_EQ("int i =\n"
11333 " longFunction(\n"
11334 " arg);",
11335 format("int i = longFunction(arg);", SixIndent));
11336}
11337
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011338TEST_F(FormatTest, SpacesInAngles) {
11339 FormatStyle Spaces = getLLVMStyle();
11340 Spaces.SpacesInAngles = true;
11341
11342 verifyFormat("static_cast< int >(arg);", Spaces);
11343 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11344 verifyFormat("f< int, float >();", Spaces);
11345 verifyFormat("template <> g() {}", Spaces);
11346 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011347 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11348 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11349 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011350
11351 Spaces.Standard = FormatStyle::LS_Cpp03;
11352 Spaces.SpacesInAngles = true;
11353 verifyFormat("A< A< int > >();", Spaces);
11354
11355 Spaces.SpacesInAngles = false;
11356 verifyFormat("A<A<int> >();", Spaces);
11357
11358 Spaces.Standard = FormatStyle::LS_Cpp11;
11359 Spaces.SpacesInAngles = true;
11360 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011361
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011362 Spaces.SpacesInAngles = false;
11363 verifyFormat("A<A<int>>();", Spaces);
11364}
11365
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011366TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11367 FormatStyle Style = getLLVMStyle();
11368 Style.SpaceAfterTemplateKeyword = false;
11369 verifyFormat("template<int> void foo();", Style);
11370}
11371
Jacques Pienaarfc275112015-02-18 23:48:37 +000011372TEST_F(FormatTest, TripleAngleBrackets) {
11373 verifyFormat("f<<<1, 1>>>();");
11374 verifyFormat("f<<<1, 1, 1, s>>>();");
11375 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011376 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011377 verifyFormat("f<param><<<1, 1>>>();");
11378 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011379 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011380 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11381 "aaaaaaaaaaa<<<\n 1, 1>>>();");
11382}
11383
11384TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011385 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011386 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011387 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11388 "aaallvm::outs() <<");
11389 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11390 "aaaallvm::outs()\n <<");
11391}
11392
Manuel Klimek819788d2014-03-18 11:22:45 +000011393TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11394 std::string code = "#if A\n"
11395 "#if B\n"
11396 "a.\n"
11397 "#endif\n"
11398 " a = 1;\n"
11399 "#else\n"
11400 "#endif\n"
11401 "#if C\n"
11402 "#else\n"
11403 "#endif\n";
11404 EXPECT_EQ(code, format(code));
11405}
11406
Manuel Klimek68b03042014-04-14 09:14:11 +000011407TEST_F(FormatTest, HandleConflictMarkers) {
11408 // Git/SVN conflict markers.
11409 EXPECT_EQ("int a;\n"
11410 "void f() {\n"
11411 " callme(some(parameter1,\n"
11412 "<<<<<<< text by the vcs\n"
11413 " parameter2),\n"
11414 "||||||| text by the vcs\n"
11415 " parameter2),\n"
11416 " parameter3,\n"
11417 "======= text by the vcs\n"
11418 " parameter2, parameter3),\n"
11419 ">>>>>>> text by the vcs\n"
11420 " otherparameter);\n",
11421 format("int a;\n"
11422 "void f() {\n"
11423 " callme(some(parameter1,\n"
11424 "<<<<<<< text by the vcs\n"
11425 " parameter2),\n"
11426 "||||||| text by the vcs\n"
11427 " parameter2),\n"
11428 " parameter3,\n"
11429 "======= text by the vcs\n"
11430 " parameter2,\n"
11431 " parameter3),\n"
11432 ">>>>>>> text by the vcs\n"
11433 " otherparameter);\n"));
11434
11435 // Perforce markers.
11436 EXPECT_EQ("void f() {\n"
11437 " function(\n"
11438 ">>>> text by the vcs\n"
11439 " parameter,\n"
11440 "==== text by the vcs\n"
11441 " parameter,\n"
11442 "==== text by the vcs\n"
11443 " parameter,\n"
11444 "<<<< text by the vcs\n"
11445 " parameter);\n",
11446 format("void f() {\n"
11447 " function(\n"
11448 ">>>> text by the vcs\n"
11449 " parameter,\n"
11450 "==== text by the vcs\n"
11451 " parameter,\n"
11452 "==== text by the vcs\n"
11453 " parameter,\n"
11454 "<<<< text by the vcs\n"
11455 " parameter);\n"));
11456
11457 EXPECT_EQ("<<<<<<<\n"
11458 "|||||||\n"
11459 "=======\n"
11460 ">>>>>>>",
11461 format("<<<<<<<\n"
11462 "|||||||\n"
11463 "=======\n"
11464 ">>>>>>>"));
11465
11466 EXPECT_EQ("<<<<<<<\n"
11467 "|||||||\n"
11468 "int i;\n"
11469 "=======\n"
11470 ">>>>>>>",
11471 format("<<<<<<<\n"
11472 "|||||||\n"
11473 "int i;\n"
11474 "=======\n"
11475 ">>>>>>>"));
11476
11477 // FIXME: Handle parsing of macros around conflict markers correctly:
11478 EXPECT_EQ("#define Macro \\\n"
11479 "<<<<<<<\n"
11480 "Something \\\n"
11481 "|||||||\n"
11482 "Else \\\n"
11483 "=======\n"
11484 "Other \\\n"
11485 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011486 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011487 format("#define Macro \\\n"
11488 "<<<<<<<\n"
11489 " Something \\\n"
11490 "|||||||\n"
11491 " Else \\\n"
11492 "=======\n"
11493 " Other \\\n"
11494 ">>>>>>>\n"
11495 " End\n"
11496 "int i;\n"));
11497}
11498
Daniel Jasper471894432014-08-06 13:40:26 +000011499TEST_F(FormatTest, DisableRegions) {
11500 EXPECT_EQ("int i;\n"
11501 "// clang-format off\n"
11502 " int j;\n"
11503 "// clang-format on\n"
11504 "int k;",
11505 format(" int i;\n"
11506 " // clang-format off\n"
11507 " int j;\n"
11508 " // clang-format on\n"
11509 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011510 EXPECT_EQ("int i;\n"
11511 "/* clang-format off */\n"
11512 " int j;\n"
11513 "/* clang-format on */\n"
11514 "int k;",
11515 format(" int i;\n"
11516 " /* clang-format off */\n"
11517 " int j;\n"
11518 " /* clang-format on */\n"
11519 " int k;"));
Daniel Jasper471894432014-08-06 13:40:26 +000011520}
11521
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011522TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11523 format("? ) =");
11524 verifyNoCrash("#define a\\\n /**/}");
11525}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011526
Daniel Jasper498f5582015-12-25 08:53:31 +000011527TEST_F(FormatTest, FormatsTableGenCode) {
11528 FormatStyle Style = getLLVMStyle();
11529 Style.Language = FormatStyle::LK_TableGen;
11530 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11531}
11532
Eric Liu547d8792016-03-24 13:22:42 +000011533// Since this test case uses UNIX-style file path. We disable it for MS
11534// compiler.
Eric Liuc13ca6a2016-03-24 14:59:39 +000011535#if !defined(_MSC_VER) && !defined(__MINGW32__)
Eric Liu547d8792016-03-24 13:22:42 +000011536
11537TEST(FormatStyle, GetStyleOfFile) {
11538 vfs::InMemoryFileSystem FS;
11539 // Test 1: format file in the same directory.
11540 ASSERT_TRUE(
11541 FS.addFile("/a/.clang-format", 0,
11542 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11543 ASSERT_TRUE(
11544 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11545 auto Style1 = getStyle("file", "/a/.clang-format", "Google", &FS);
11546 ASSERT_EQ(Style1, getLLVMStyle());
11547
11548 // Test 2: fallback to default.
11549 ASSERT_TRUE(
11550 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11551 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", &FS);
11552 ASSERT_EQ(Style2, getMozillaStyle());
11553
11554 // Test 3: format file in parent directory.
11555 ASSERT_TRUE(
11556 FS.addFile("/c/.clang-format", 0,
11557 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11558 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11559 llvm::MemoryBuffer::getMemBuffer("int i;")));
11560 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", &FS);
11561 ASSERT_EQ(Style3, getGoogleStyle());
11562}
11563
11564#endif // _MSC_VER
11565
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011566TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11567 // Column limit is 20.
11568 std::string Code = "Type *a =\n"
11569 " new Type();\n"
11570 "g(iiiii, 0, jjjjj,\n"
11571 " 0, kkkkk, 0, mm);\n"
11572 "int bad = format ;";
11573 std::string Expected = "auto a = new Type();\n"
11574 "g(iiiii, nullptr,\n"
11575 " jjjjj, nullptr,\n"
11576 " kkkkk, nullptr,\n"
11577 " mm);\n"
11578 "int bad = format ;";
11579 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011580 tooling::Replacements Replaces = toReplacements(
11581 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11582 "auto "),
11583 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11584 "nullptr"),
11585 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11586 "nullptr"),
11587 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11588 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011589
11590 format::FormatStyle Style = format::getLLVMStyle();
11591 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011592 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11593 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11594 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11595 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11596 EXPECT_TRUE(static_cast<bool>(Result));
11597 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011598}
11599
Eric Liubaf58c22016-05-18 13:43:48 +000011600TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11601 std::string Code = "#include \"a.h\"\n"
11602 "#include \"c.h\"\n"
11603 "\n"
11604 "int main() {\n"
11605 " return 0;\n"
11606 "}";
11607 std::string Expected = "#include \"a.h\"\n"
11608 "#include \"b.h\"\n"
11609 "#include \"c.h\"\n"
11610 "\n"
11611 "int main() {\n"
11612 " return 0;\n"
11613 "}";
11614 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011615 tooling::Replacements Replaces = toReplacements(
11616 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11617 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011618
11619 format::FormatStyle Style = format::getLLVMStyle();
11620 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011621 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11622 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11623 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11624 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11625 EXPECT_TRUE(static_cast<bool>(Result));
11626 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011627}
11628
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011629TEST_F(FormatTest, AllignTrailingComments) {
11630 EXPECT_EQ("#define MACRO(V) \\\n"
11631 " V(Rt2) /* one more char */ \\\n"
11632 " V(Rs) /* than here */ \\\n"
11633 "/* comment 3 */\n",
11634 format("#define MACRO(V)\\\n"
11635 "V(Rt2) /* one more char */ \\\n"
11636 "V(Rs) /* than here */ \\\n"
11637 "/* comment 3 */ \\\n",
11638 getLLVMStyleWithColumns(40)));
11639}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011640} // end namespace
11641} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011642} // end namespace clang