blob: 8fe835e5793e1c40d2c10c09c214e6f850e92cd2 [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 Jasper1c220482015-02-25 10:30:06 +00005640
Daniel Jasperaf642c62015-08-25 13:40:51 +00005641 FormatStyle AlignLeft = getLLVMStyle();
5642 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005643 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005644 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5645 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5646 AlignLeft);
5647 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5648 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005649 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5650 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5651 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5652 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005653 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005654
5655 FormatStyle Spaces = getLLVMStyle();
5656 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005657 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5658 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5659 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5660 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005661
5662 Spaces.SpacesInCStyleCastParentheses = false;
5663 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005664 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5665 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5666 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5667 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005668}
5669
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005670TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005671 verifyFormat("void f() {\n"
5672 " A *a = new A;\n"
5673 " A *a = new (placement) A;\n"
5674 " delete a;\n"
5675 " delete (A *)a;\n"
5676 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005677 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5678 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005679 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5680 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5681 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005682 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005683}
5684
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005685TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005686 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005687 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005688 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005689 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005690 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005691 verifyIndependentOfContext("int a = b * 10;");
5692 verifyIndependentOfContext("int a = 10 * b;");
5693 verifyIndependentOfContext("int a = b * c;");
5694 verifyIndependentOfContext("int a += b * c;");
5695 verifyIndependentOfContext("int a -= b * c;");
5696 verifyIndependentOfContext("int a *= b * c;");
5697 verifyIndependentOfContext("int a /= b * c;");
5698 verifyIndependentOfContext("int a = *b;");
5699 verifyIndependentOfContext("int a = *b * c;");
5700 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005701 verifyIndependentOfContext("int a = b * (10);");
5702 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005703 verifyIndependentOfContext("return 10 * b;");
5704 verifyIndependentOfContext("return *b * *c;");
5705 verifyIndependentOfContext("return a & ~b;");
5706 verifyIndependentOfContext("f(b ? *c : *d);");
5707 verifyIndependentOfContext("int a = b ? *c : *d;");
5708 verifyIndependentOfContext("*b = a;");
5709 verifyIndependentOfContext("a * ~b;");
5710 verifyIndependentOfContext("a * !b;");
5711 verifyIndependentOfContext("a * +b;");
5712 verifyIndependentOfContext("a * -b;");
5713 verifyIndependentOfContext("a * ++b;");
5714 verifyIndependentOfContext("a * --b;");
5715 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005716 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005717 verifyIndependentOfContext("f() * b;");
5718 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005719 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005720 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005721 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005722 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005723 verifyIndependentOfContext("return sizeof(int **);");
5724 verifyIndependentOfContext("return sizeof(int ******);");
5725 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005726 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005727 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005728 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005729 verifyGoogleFormat("return sizeof(int**);");
5730 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5731 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005732 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005733 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005734 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005735 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005736 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005737 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005738 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005739 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005740 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005741 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005742 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005743 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005744 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005745 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005746 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005747 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasper27234032012-12-07 09:52:15 +00005748
Daniel Jasper5b49f472013-01-23 12:10:53 +00005749 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005750
Daniel Jasper5b49f472013-01-23 12:10:53 +00005751 verifyIndependentOfContext("A<int *> a;");
5752 verifyIndependentOfContext("A<int **> a;");
5753 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005754 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005755 verifyIndependentOfContext(
5756 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005757 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005758 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005759 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005760 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005761 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005762
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005763 verifyFormat(
5764 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5765 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5766
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005767 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005768 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005769 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005770 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005771 verifyGoogleFormat("A<int*> a;");
5772 verifyGoogleFormat("A<int**> a;");
5773 verifyGoogleFormat("A<int*, int*> a;");
5774 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005775 verifyGoogleFormat("f(b ? *c : *d);");
5776 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005777 verifyGoogleFormat("Type* t = **x;");
5778 verifyGoogleFormat("Type* t = *++*x;");
5779 verifyGoogleFormat("*++*x;");
5780 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5781 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005782 verifyGoogleFormat(
5783 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005784 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005785 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5786 verifyGoogleFormat("template <typename T>\n"
5787 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005788
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005789 FormatStyle Left = getLLVMStyle();
5790 Left.PointerAlignment = FormatStyle::PAS_Left;
5791 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasperbcad0662015-07-21 22:51:00 +00005792 verifyFormat("for (;; * = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005793 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005794
Daniel Jasper5b49f472013-01-23 12:10:53 +00005795 verifyIndependentOfContext("a = *(x + y);");
5796 verifyIndependentOfContext("a = &(x + y);");
5797 verifyIndependentOfContext("*(x + y).call();");
5798 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005799 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005800
Daniel Jasper5b49f472013-01-23 12:10:53 +00005801 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005802 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005803 "int *MyValues = {\n"
5804 " *A, // Operator detection might be confused by the '{'\n"
5805 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005806 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005807
Daniel Jasper5b49f472013-01-23 12:10:53 +00005808 verifyIndependentOfContext("if (int *a = &b)");
5809 verifyIndependentOfContext("if (int &a = *b)");
5810 verifyIndependentOfContext("if (a & b[i])");
5811 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5812 verifyIndependentOfContext("if (*b[i])");
5813 verifyIndependentOfContext("if (int *a = (&b))");
5814 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005815 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005816 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005817 verifyFormat("void f() {\n"
5818 " for (const int &v : Values) {\n"
5819 " }\n"
5820 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005821 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5822 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005823 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005824
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005825 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005826 verifyFormat("#define MACRO \\\n"
5827 " int *i = a * b; \\\n"
5828 " void f(a *b);",
5829 getLLVMStyleWithColumns(19));
5830
Daniel Jasper97b89482013-03-13 07:49:51 +00005831 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005832 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005833 verifyIndependentOfContext("T **t = new T *;");
5834 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005835 verifyGoogleFormat("A = new SomeType*[Length]();");
5836 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005837 verifyGoogleFormat("T** t = new T*;");
5838 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005839
Daniel Jasper990ff972013-05-07 14:17:18 +00005840 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005841 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00005842 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00005843 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5844 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005845 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005846 "typename t::if<x && y>::type f() {}");
5847 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005848 verifyFormat("vector<int *> v;");
5849 verifyFormat("vector<int *const> v;");
5850 verifyFormat("vector<int *const **const *> v;");
5851 verifyFormat("vector<int *volatile> v;");
5852 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005853 verifyFormat("foo<b && false>();");
5854 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005855 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005856 verifyFormat(
5857 "template <class T, class = typename std::enable_if<\n"
5858 " std::is_integral<T>::value &&\n"
5859 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005860 "void F();",
5861 getLLVMStyleWithColumns(76));
5862 verifyFormat(
5863 "template <class T,\n"
5864 " class = typename ::std::enable_if<\n"
5865 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5866 "void F();",
5867 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005868
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005869 verifyIndependentOfContext("MACRO(int *i);");
5870 verifyIndependentOfContext("MACRO(auto *a);");
5871 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00005872 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005873 // FIXME: Is there a way to make this work?
5874 // verifyIndependentOfContext("MACRO(A *a);");
5875
Daniel Jasper32ccb032014-06-23 07:36:18 +00005876 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005877 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005878
Daniel Jasper866468a2014-04-14 13:15:29 +00005879 EXPECT_EQ("#define OP(x) \\\n"
5880 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5881 " return s << a.DebugString(); \\\n"
5882 " }",
5883 format("#define OP(x) \\\n"
5884 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5885 " return s << a.DebugString(); \\\n"
5886 " }",
5887 getLLVMStyleWithColumns(50)));
5888
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005889 // FIXME: We cannot handle this case yet; we might be able to figure out that
5890 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005891 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005892
5893 FormatStyle PointerMiddle = getLLVMStyle();
5894 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5895 verifyFormat("delete *x;", PointerMiddle);
5896 verifyFormat("int * x;", PointerMiddle);
5897 verifyFormat("template <int * y> f() {}", PointerMiddle);
5898 verifyFormat("int * f(int * a) {}", PointerMiddle);
5899 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5900 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5901 verifyFormat("A<int *> a;", PointerMiddle);
5902 verifyFormat("A<int **> a;", PointerMiddle);
5903 verifyFormat("A<int *, int *> a;", PointerMiddle);
5904 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005905 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5906 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005907 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005908
5909 // Member function reference qualifiers aren't binary operators.
5910 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005911 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005912 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005913 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005914 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005915 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005916}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005917
Daniel Jasperee6d6502013-07-17 20:25:02 +00005918TEST_F(FormatTest, UnderstandsAttributes) {
5919 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005920 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5921 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005922 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005923 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005924 verifyFormat("__attribute__((nodebug)) void\n"
5925 "foo() {}\n",
5926 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005927}
5928
Daniel Jasper10cd5812013-05-06 06:35:44 +00005929TEST_F(FormatTest, UnderstandsEllipsis) {
5930 verifyFormat("int printf(const char *fmt, ...);");
5931 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005932 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5933
5934 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005935 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005936 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005937}
5938
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005939TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005940 EXPECT_EQ("int *a;\n"
5941 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005942 "int *a;",
5943 format("int *a;\n"
5944 "int* a;\n"
5945 "int *a;",
5946 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005947 EXPECT_EQ("int* a;\n"
5948 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005949 "int* a;",
5950 format("int* a;\n"
5951 "int* a;\n"
5952 "int *a;",
5953 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005954 EXPECT_EQ("int *a;\n"
5955 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005956 "int *a;",
5957 format("int *a;\n"
5958 "int * a;\n"
5959 "int * a;",
5960 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005961 EXPECT_EQ("auto x = [] {\n"
5962 " int *a;\n"
5963 " int *a;\n"
5964 " int *a;\n"
5965 "};",
5966 format("auto x=[]{int *a;\n"
5967 "int * a;\n"
5968 "int * a;};",
5969 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005970}
5971
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005972TEST_F(FormatTest, UnderstandsRvalueReferences) {
5973 verifyFormat("int f(int &&a) {}");
5974 verifyFormat("int f(int a, char &&b) {}");
5975 verifyFormat("void f() { int &&a = b; }");
5976 verifyGoogleFormat("int f(int a, char&& b) {}");
5977 verifyGoogleFormat("void f() { int&& a = b; }");
5978
Daniel Jasper1eff9082013-05-27 16:36:33 +00005979 verifyIndependentOfContext("A<int &&> a;");
5980 verifyIndependentOfContext("A<int &&, int &&> a;");
5981 verifyGoogleFormat("A<int&&> a;");
5982 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00005983
5984 // Not rvalue references:
5985 verifyFormat("template <bool B, bool C> class A {\n"
5986 " static_assert(B && C, \"Something is wrong\");\n"
5987 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00005988 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
5989 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00005990 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005991}
5992
Manuel Klimekc1237a82013-01-23 14:08:21 +00005993TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
5994 verifyFormat("void f() {\n"
5995 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005996 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005997 "}",
5998 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00005999}
6000
Daniel Jasperef906a92013-01-13 08:01:36 +00006001TEST_F(FormatTest, FormatsCasts) {
6002 verifyFormat("Type *A = static_cast<Type *>(P);");
6003 verifyFormat("Type *A = (Type *)P;");
6004 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6005 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006006 verifyFormat("int a = (int)2.0f;");
6007 verifyFormat("x[(int32)y];");
6008 verifyFormat("x = (int32)y;");
6009 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6010 verifyFormat("int a = (int)*b;");
6011 verifyFormat("int a = (int)2.0f;");
6012 verifyFormat("int a = (int)~0;");
6013 verifyFormat("int a = (int)++a;");
6014 verifyFormat("int a = (int)sizeof(int);");
6015 verifyFormat("int a = (int)+2;");
6016 verifyFormat("my_int a = (my_int)2.0f;");
6017 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006018 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006019 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006020 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006021 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006022 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006023
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006024 verifyFormat("void f() { my_int a = (my_int)*b; }");
6025 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6026 verifyFormat("my_int a = (my_int)~0;");
6027 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006028 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006029 verifyFormat("my_int a = (my_int)1;");
6030 verifyFormat("my_int a = (my_int *)1;");
6031 verifyFormat("my_int a = (const my_int)-1;");
6032 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006033 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006034 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006035 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006036 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006037
6038 // FIXME: single value wrapped with paren will be treated as cast.
6039 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006040
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006041 verifyFormat("{ (void)F; }");
6042
Daniel Jasper998cabc2013-07-18 14:46:07 +00006043 // Don't break after a cast's
6044 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6045 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6046 " bbbbbbbbbbbbbbbbbbbbbb);");
6047
Daniel Jasperef906a92013-01-13 08:01:36 +00006048 // These are not casts.
6049 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006050 verifyFormat("f(foo)->b;");
6051 verifyFormat("f(foo).b;");
6052 verifyFormat("f(foo)(b);");
6053 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006054 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006055 verifyFormat("(*funptr)(foo)[4];");
6056 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006057 verifyFormat("void f(int *);");
6058 verifyFormat("void f(int *) = 0;");
6059 verifyFormat("void f(SmallVector<int>) {}");
6060 verifyFormat("void f(SmallVector<int>);");
6061 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006062 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006063 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006064 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006065 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6066 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006067 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006068
Daniel Jasperba0bda92013-02-23 08:07:18 +00006069 // These are not casts, but at some point were confused with casts.
6070 verifyFormat("virtual void foo(int *) override;");
6071 verifyFormat("virtual void foo(char &) const;");
6072 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006073 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006074 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006075 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006076 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006077
6078 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6079 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006080 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006081 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006082 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6083 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6084 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006085}
6086
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006087TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006088 verifyFormat("A<bool()> a;");
6089 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006090 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006091 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006092 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006093 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006094 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006095 verifyFormat("template <class CallbackClass>\n"
6096 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006097
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006098 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6099 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006100 verifyGoogleFormat(
6101 "template <class CallbackClass>\n"
6102 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006103
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006104 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006105 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006106 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006107 verifyFormat("some_var = function(*some_pointer_var)[0];");
6108 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006109 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006110 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006111}
6112
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006113TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6114 verifyFormat("A (*foo_)[6];");
6115 verifyFormat("vector<int> (*foo_)[6];");
6116}
6117
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006118TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6119 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6120 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6121 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6122 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006123 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6124 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006125
6126 // Different ways of ()-initializiation.
6127 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6128 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6129 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6130 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6131 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6132 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006133 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6134 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006135}
6136
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006137TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006138 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006139 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006140 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006141 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006142 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006143 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006144 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6145 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006146 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6147 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006148 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6149 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006150 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6151 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006152 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6153 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006154 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6155 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6156 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6157 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006158 FormatStyle Indented = getLLVMStyle();
6159 Indented.IndentWrappedFunctionNames = true;
6160 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6161 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6162 Indented);
6163 verifyFormat(
6164 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6165 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6166 Indented);
6167 verifyFormat(
6168 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6169 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6170 Indented);
6171 verifyFormat(
6172 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6173 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6174 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006175
6176 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006177 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6178 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6179 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006180
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006181 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006182 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006183 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006184 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6185 " SourceLocation L, IdentifierIn *II,\n"
6186 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006187 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006188 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006189 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006190 " const SomeType<string, SomeOtherTemplateParameter>\n"
6191 " &ReallyReallyLongParameterName,\n"
6192 " const SomeType<string, SomeOtherTemplateParameter>\n"
6193 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006194 verifyFormat("template <typename A>\n"
6195 "SomeLoooooooooooooooooooooongType<\n"
6196 " typename some_namespace::SomeOtherType<A>::Type>\n"
6197 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006198
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006199 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006200 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6201 " aaaaaaaaaaaaaaaaaaaaaaa;");
6202 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006203 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6204 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006205 verifyGoogleFormat(
6206 "some_namespace::LongReturnType\n"
6207 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006208 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006209
6210 verifyGoogleFormat("template <typename T>\n"
6211 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006212 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006213 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6214 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006215
6216 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006217 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6218 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006219 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6220 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6221 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6222 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6223 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6224 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6225 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006226}
6227
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006228TEST_F(FormatTest, FormatsArrays) {
6229 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6230 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006231 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6232 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006233 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6234 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006235 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6236 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6237 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6238 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6239 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6240 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6241 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6242 verifyFormat(
6243 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6244 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6245 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006246 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6247 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006248
6249 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6250 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006251 verifyFormat(
6252 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6253 " .aaaaaaa[0]\n"
6254 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006255 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006256
6257 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006258
6259 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6260 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006261}
6262
Daniel Jaspere9de2602012-12-06 09:56:08 +00006263TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6264 verifyFormat("(a)->b();");
6265 verifyFormat("--a;");
6266}
6267
Daniel Jasper8b529712012-12-04 13:02:32 +00006268TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006269 verifyFormat("#include <string>\n"
6270 "#include <a/b/c.h>\n"
6271 "#include \"a/b/string\"\n"
6272 "#include \"string.h\"\n"
6273 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006274 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006275 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006276 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006277 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006278 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006279 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6280 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006281 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6282 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006283
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006284 verifyFormat("#import <string>");
6285 verifyFormat("#import <a/b/c.h>");
6286 verifyFormat("#import \"a/b/string\"");
6287 verifyFormat("#import \"string.h\"");
6288 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006289 verifyFormat("#if __has_include(<strstream>)\n"
6290 "#include <strstream>\n"
6291 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006292
Daniel Jasper343643b2014-08-13 08:29:18 +00006293 verifyFormat("#define MY_IMPORT <a/b>");
6294
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006295 // Protocol buffer definition or missing "#".
6296 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6297 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006298
6299 FormatStyle Style = getLLVMStyle();
6300 Style.AlwaysBreakBeforeMultilineStrings = true;
6301 Style.ColumnLimit = 0;
6302 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006303
6304 // But 'import' might also be a regular C++ namespace.
6305 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6306 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006307}
6308
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006309//===----------------------------------------------------------------------===//
6310// Error recovery tests.
6311//===----------------------------------------------------------------------===//
6312
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006313TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006314 FormatStyle NoBinPacking = getLLVMStyle();
6315 NoBinPacking.BinPackParameters = false;
6316 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6317 " double *min_x,\n"
6318 " double *max_x,\n"
6319 " double *min_y,\n"
6320 " double *max_y,\n"
6321 " double *min_z,\n"
6322 " double *max_z, ) {}",
6323 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006324}
6325
Daniel Jasper83a54d22013-01-10 09:26:47 +00006326TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006327 verifyFormat("void f() { return; }\n42");
6328 verifyFormat("void f() {\n"
6329 " if (0)\n"
6330 " return;\n"
6331 "}\n"
6332 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006333 verifyFormat("void f() { return }\n42");
6334 verifyFormat("void f() {\n"
6335 " if (0)\n"
6336 " return\n"
6337 "}\n"
6338 "42");
6339}
6340
6341TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6342 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6343 EXPECT_EQ("void f() {\n"
6344 " if (a)\n"
6345 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006346 "}",
6347 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006348 EXPECT_EQ("namespace N {\n"
6349 "void f()\n"
6350 "}",
6351 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006352 EXPECT_EQ("namespace N {\n"
6353 "void f() {}\n"
6354 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006355 "}",
6356 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006357}
6358
Daniel Jasper2df93312013-01-09 10:16:05 +00006359TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6360 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006361 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006362 " b;",
6363 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006364 verifyFormat("function(\n"
6365 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006366 " LoooooooooooongArgument);\n",
6367 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006368}
6369
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006370TEST_F(FormatTest, IncorrectAccessSpecifier) {
6371 verifyFormat("public:");
6372 verifyFormat("class A {\n"
6373 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006374 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006375 "};");
6376 verifyFormat("public\n"
6377 "int qwerty;");
6378 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006379 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006380 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006381 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006382 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006383 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006384}
Daniel Jasperf7935112012-12-03 18:12:45 +00006385
Daniel Jasper291f9362013-03-20 15:58:10 +00006386TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6387 verifyFormat("{");
6388 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006389 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006390}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006391
6392TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006393 verifyFormat("do {\n}");
6394 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006395 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006396 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006397 "wheeee(fun);");
6398 verifyFormat("do {\n"
6399 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006400 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006401}
6402
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006403TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006404 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006405 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006406 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006407 verifyFormat("while {\n foo;\n foo();\n}");
6408 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006409}
6410
Daniel Jasperc0880a92013-01-04 18:52:56 +00006411TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006412 verifyIncompleteFormat("namespace {\n"
6413 "class Foo { Foo (\n"
6414 "};\n"
6415 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006416}
6417
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006418TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006419 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006420 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6421 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006422 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006423
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006424 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006425 " {\n"
6426 " breakme(\n"
6427 " qwe);\n"
6428 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006429 format("{\n"
6430 " {\n"
6431 " breakme(qwe);\n"
6432 "}\n",
6433 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006434}
6435
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006436TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006437 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006438 " avariable,\n"
6439 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006440 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006441}
6442
Manuel Klimek762dd182013-01-21 10:07:49 +00006443TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006444 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006445}
6446
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006447TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006448 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006449 verifyFormat("vector<int> x{\n"
6450 " 1, 2, 3, 4,\n"
6451 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006452 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6453 verifyFormat("f({1, 2});");
6454 verifyFormat("auto v = Foo{-1};");
6455 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6456 verifyFormat("Class::Class : member{1, 2, 3} {}");
6457 verifyFormat("new vector<int>{1, 2, 3};");
6458 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006459 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006460 verifyFormat("return {arg1, arg2};");
6461 verifyFormat("return {arg1, SomeType{parameter}};");
6462 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6463 verifyFormat("new T{arg1, arg2};");
6464 verifyFormat("f(MyMap[{composite, key}]);");
6465 verifyFormat("class Class {\n"
6466 " T member = {arg1, arg2};\n"
6467 "};");
6468 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006469 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6470 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006471
Daniel Jasper438059e2014-05-22 12:11:13 +00006472 verifyFormat("int foo(int i) { return fo1{}(i); }");
6473 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006474 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006475 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006476 verifyFormat("Node n{1, Node{1000}, //\n"
6477 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006478 verifyFormat("Aaaa aaaaaaa{\n"
6479 " {\n"
6480 " aaaa,\n"
6481 " },\n"
6482 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006483 verifyFormat("class C : public D {\n"
6484 " SomeClass SC{2};\n"
6485 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006486 verifyFormat("class C : public A {\n"
6487 " class D : public B {\n"
6488 " void f() { int i{2}; }\n"
6489 " };\n"
6490 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006491 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006492
Daniel Jasper08434342015-05-26 07:26:26 +00006493 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006494 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006495 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006496 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6497 " bbbbb,\n"
6498 " ccccc,\n"
6499 " ddddd,\n"
6500 " eeeee,\n"
6501 " ffffff,\n"
6502 " ggggg,\n"
6503 " hhhhhh,\n"
6504 " iiiiii,\n"
6505 " jjjjjj,\n"
6506 " kkkkkk};",
6507 NoBinPacking);
6508 verifyFormat("const Aaaaaa aaaaa = {\n"
6509 " aaaaa,\n"
6510 " bbbbb,\n"
6511 " ccccc,\n"
6512 " ddddd,\n"
6513 " eeeee,\n"
6514 " ffffff,\n"
6515 " ggggg,\n"
6516 " hhhhhh,\n"
6517 " iiiiii,\n"
6518 " jjjjjj,\n"
6519 " kkkkkk,\n"
6520 "};",
6521 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006522 verifyFormat(
6523 "const Aaaaaa aaaaa = {\n"
6524 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6525 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6526 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6527 "};",
6528 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006529
Chandler Carruthf8b72662014-03-02 12:37:31 +00006530 // FIXME: The alignment of these trailing comments might be bad. Then again,
6531 // this might be utterly useless in real code.
6532 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006533 " : some_value{ //\n"
6534 " aaaaaaa, //\n"
6535 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006536
Chandler Carruthf8b72662014-03-02 12:37:31 +00006537 // In braced lists, the first comment is always assumed to belong to the
6538 // first element. Thus, it can be moved to the next or previous line as
6539 // appropriate.
6540 EXPECT_EQ("function({// First element:\n"
6541 " 1,\n"
6542 " // Second element:\n"
6543 " 2});",
6544 format("function({\n"
6545 " // First element:\n"
6546 " 1,\n"
6547 " // Second element:\n"
6548 " 2});"));
6549 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6550 " // First element:\n"
6551 " 1,\n"
6552 " // Second element:\n"
6553 " 2};",
6554 format("std::vector<int> MyNumbers{// First element:\n"
6555 " 1,\n"
6556 " // Second element:\n"
6557 " 2};",
6558 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00006559 // A trailing comma should still lead to an enforced line break.
6560 EXPECT_EQ("vector<int> SomeVector = {\n"
6561 " // aaa\n"
6562 " 1, 2,\n"
6563 "};",
6564 format("vector<int> SomeVector = { // aaa\n"
6565 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006566
Chandler Carruthf8b72662014-03-02 12:37:31 +00006567 FormatStyle ExtraSpaces = getLLVMStyle();
6568 ExtraSpaces.Cpp11BracedListStyle = false;
6569 ExtraSpaces.ColumnLimit = 75;
6570 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6571 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6572 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6573 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6574 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6575 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6576 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6577 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6578 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6579 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6580 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6581 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6582 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6583 verifyFormat("class Class {\n"
6584 " T member = { arg1, arg2 };\n"
6585 "};",
6586 ExtraSpaces);
6587 verifyFormat(
6588 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6589 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6590 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6591 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6592 ExtraSpaces);
6593 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006594 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006595 ExtraSpaces);
6596 verifyFormat(
6597 "someFunction(OtherParam,\n"
6598 " BracedList{ // comment 1 (Forcing interesting break)\n"
6599 " param1, param2,\n"
6600 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006601 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006602 ExtraSpaces);
6603 verifyFormat(
6604 "std::this_thread::sleep_for(\n"
6605 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6606 ExtraSpaces);
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006607 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaa{\n"
6608 " aaaaaaa,\n"
6609 " aaaaaaaaaa,\n"
6610 " aaaaa,\n"
6611 " aaaaaaaaaaaaaaa,\n"
6612 " aaa,\n"
6613 " aaaaaaaaaa,\n"
6614 " a,\n"
6615 " aaaaaaaaaaaaaaaaaaaaa,\n"
6616 " aaaaaaaaaaaa,\n"
6617 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6618 " aaaaaaa,\n"
6619 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006620 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006621}
6622
Daniel Jasper33b909c2013-10-25 14:29:37 +00006623TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006624 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6625 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6626 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6627 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6628 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6629 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006630 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006631 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006632 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006633 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6634 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006635 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006636 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6637 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6638 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6639 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6640 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6641 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6642 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006643 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006644 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6645 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006646 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6647 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6648 " // Separating comment.\n"
6649 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6650 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6651 " // Leading comment\n"
6652 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6653 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006654 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6655 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006656 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006657 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6658 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006659 getLLVMStyleWithColumns(38));
6660 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006661 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6662 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006663 verifyFormat(
6664 "static unsigned SomeValues[10][3] = {\n"
6665 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6666 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6667 verifyFormat("static auto fields = new vector<string>{\n"
6668 " \"aaaaaaaaaaaaa\",\n"
6669 " \"aaaaaaaaaaaaa\",\n"
6670 " \"aaaaaaaaaaaa\",\n"
6671 " \"aaaaaaaaaaaaaa\",\n"
6672 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6673 " \"aaaaaaaaaaaa\",\n"
6674 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6675 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006676 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6677 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6678 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6679 " 3, cccccccccccccccccccccc};",
6680 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006681
6682 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006683 verifyFormat("vector<int> x = {\n"
6684 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6685 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006686 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006687 verifyFormat("vector<int> x = {\n"
6688 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006689 "};",
6690 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006691 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6692 " 1, 1, 1, 1,\n"
6693 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006694 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006695
Daniel Jasper60c27072015-05-13 08:16:00 +00006696 // Trailing comment in the first line.
6697 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6698 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6699 " 111111111, 222222222, 3333333333, 444444444, //\n"
6700 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006701 // Trailing comment in the last line.
6702 verifyFormat("int aaaaa[] = {\n"
6703 " 1, 2, 3, // comment\n"
6704 " 4, 5, 6 // comment\n"
6705 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006706
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006707 // With nested lists, we should either format one item per line or all nested
6708 // lists one on line.
6709 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006710 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6711 " {aaaaaaaaaaaaaaaaaaa},\n"
6712 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6713 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006714 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006715 verifyFormat(
6716 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006717 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6718 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6719 " {aaa, aaa},\n"
6720 " {aaa, aaa},\n"
6721 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6722 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6723 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006724
6725 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006726 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
6727 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006728
6729 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006730
Daniel Jaspereb65e912015-12-21 18:31:15 +00006731 // No braced initializer here.
6732 verifyFormat("void f() {\n"
6733 " struct Dummy {};\n"
6734 " f(v);\n"
6735 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006736
6737 // Long lists should be formatted in columns even if they are nested.
6738 verifyFormat(
6739 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6740 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6741 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6742 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6743 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6744 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006745}
6746
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006747TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006748 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006749 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006750
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006751 verifyFormat("void f() { return 42; }");
6752 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006753 " return 42;\n"
6754 "}",
6755 DoNotMerge);
6756 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006757 " // Comment\n"
6758 "}");
6759 verifyFormat("{\n"
6760 "#error {\n"
6761 " int a;\n"
6762 "}");
6763 verifyFormat("{\n"
6764 " int a;\n"
6765 "#error {\n"
6766 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006767 verifyFormat("void f() {} // comment");
6768 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006769 verifyFormat("void f() {\n"
6770 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006771 DoNotMerge);
6772 verifyFormat("void f() {\n"
6773 " int a;\n"
6774 "} // comment",
6775 DoNotMerge);
6776 verifyFormat("void f() {\n"
6777 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006778 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006779
6780 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6781 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6782
6783 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6784 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006785 verifyFormat("class C {\n"
6786 " C()\n"
6787 " : iiiiiiii(nullptr),\n"
6788 " kkkkkkk(nullptr),\n"
6789 " mmmmmmm(nullptr),\n"
6790 " nnnnnnn(nullptr) {}\n"
6791 "};",
6792 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006793
6794 FormatStyle NoColumnLimit = getLLVMStyle();
6795 NoColumnLimit.ColumnLimit = 0;
6796 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6797 EXPECT_EQ("class C {\n"
6798 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006799 "};",
6800 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006801 EXPECT_EQ("A()\n"
6802 " : b(0) {\n"
6803 "}",
6804 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6805
6806 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006807 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6808 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006809 EXPECT_EQ("A()\n"
6810 " : b(0) {\n"
6811 "}",
6812 format("A():b(0){}", DoNotMergeNoColumnLimit));
6813 EXPECT_EQ("A()\n"
6814 " : b(0) {\n"
6815 "}",
6816 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006817
6818 verifyFormat("#define A \\\n"
6819 " void f() { \\\n"
6820 " int i; \\\n"
6821 " }",
6822 getLLVMStyleWithColumns(20));
6823 verifyFormat("#define A \\\n"
6824 " void f() { int i; }",
6825 getLLVMStyleWithColumns(21));
6826 verifyFormat("#define A \\\n"
6827 " void f() { \\\n"
6828 " int i; \\\n"
6829 " } \\\n"
6830 " int j;",
6831 getLLVMStyleWithColumns(22));
6832 verifyFormat("#define A \\\n"
6833 " void f() { int i; } \\\n"
6834 " int j;",
6835 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006836}
6837
Daniel Jasperd74cf402014-04-08 12:46:38 +00006838TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6839 FormatStyle MergeInlineOnly = getLLVMStyle();
6840 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6841 verifyFormat("class C {\n"
6842 " int f() { return 42; }\n"
6843 "};",
6844 MergeInlineOnly);
6845 verifyFormat("int f() {\n"
6846 " return 42;\n"
6847 "}",
6848 MergeInlineOnly);
6849}
6850
Manuel Klimeke01bab52013-01-15 13:38:33 +00006851TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6852 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006853 verifyFormat("struct foo a = {bar};\nint n;");
6854 verifyFormat("class foo a = {bar};\nint n;");
6855 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006856
6857 // Elaborate types inside function definitions.
6858 verifyFormat("struct foo f() {}\nint n;");
6859 verifyFormat("class foo f() {}\nint n;");
6860 verifyFormat("union foo f() {}\nint n;");
6861
6862 // Templates.
6863 verifyFormat("template <class X> void f() {}\nint n;");
6864 verifyFormat("template <struct X> void f() {}\nint n;");
6865 verifyFormat("template <union X> void f() {}\nint n;");
6866
6867 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006868 verifyFormat("struct {\n} n;");
6869 verifyFormat(
6870 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006871 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006872 verifyFormat("class MACRO Z {\n} n;");
6873 verifyFormat("class MACRO(X) Z {\n} n;");
6874 verifyFormat("class __attribute__(X) Z {\n} n;");
6875 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006876 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006877 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006878 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6879 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006880
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006881 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006882 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006883
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006884 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006885 verifyFormat(
6886 "template <typename F>\n"
6887 "Matcher(const Matcher<F> &Other,\n"
6888 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6889 " !is_same<F, T>::value>::type * = 0)\n"
6890 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6891
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006892 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006893 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006894 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006895
6896 // FIXME:
6897 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006898 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006899
Manuel Klimeke01bab52013-01-15 13:38:33 +00006900 // Elaborate types where incorrectly parsing the structural element would
6901 // break the indent.
6902 verifyFormat("if (true)\n"
6903 " class X x;\n"
6904 "else\n"
6905 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006906
6907 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006908 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006909}
6910
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006911TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00006912 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
6913 format("#error Leave all white!!!!! space* alone!\n"));
6914 EXPECT_EQ(
6915 "#warning Leave all white!!!!! space* alone!\n",
6916 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006917 EXPECT_EQ("#error 1", format(" # error 1"));
6918 EXPECT_EQ("#warning 1", format(" # warning 1"));
6919}
6920
Daniel Jasper4431aa92013-04-23 13:54:04 +00006921TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00006922 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00006923 verifyFormat("#if (AAAA && BBBB)");
6924 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00006925 // FIXME: Come up with a better indentation for #elif.
6926 verifyFormat(
6927 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
6928 " defined(BBBBBBBB)\n"
6929 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
6930 " defined(BBBBBBBB)\n"
6931 "#endif",
6932 getLLVMStyleWithColumns(65));
6933}
6934
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006935TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
6936 FormatStyle AllowsMergedIf = getGoogleStyle();
6937 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
6938 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
6939 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00006940 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
6941 EXPECT_EQ("if (true) return 42;",
6942 format("if (true)\nreturn 42;", AllowsMergedIf));
6943 FormatStyle ShortMergedIf = AllowsMergedIf;
6944 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006945 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006946 " if (true) return 42;",
6947 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006948 verifyFormat("#define A \\\n"
6949 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006950 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006951 "#define B",
6952 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006953 verifyFormat("#define A \\\n"
6954 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006955 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006956 "g();",
6957 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00006958 verifyFormat("{\n"
6959 "#ifdef A\n"
6960 " // Comment\n"
6961 " if (true) continue;\n"
6962 "#endif\n"
6963 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00006964 " if (true) continue;\n"
6965 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006966 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00006967 ShortMergedIf.ColumnLimit = 29;
6968 verifyFormat("#define A \\\n"
6969 " if (aaaaaaaaaa) return 1; \\\n"
6970 " return 2;",
6971 ShortMergedIf);
6972 ShortMergedIf.ColumnLimit = 28;
6973 verifyFormat("#define A \\\n"
6974 " if (aaaaaaaaaa) \\\n"
6975 " return 1; \\\n"
6976 " return 2;",
6977 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006978}
6979
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00006980TEST_F(FormatTest, BlockCommentsInControlLoops) {
6981 verifyFormat("if (0) /* a comment in a strange place */ {\n"
6982 " f();\n"
6983 "}");
6984 verifyFormat("if (0) /* a comment in a strange place */ {\n"
6985 " f();\n"
6986 "} /* another comment */ else /* comment #3 */ {\n"
6987 " g();\n"
6988 "}");
6989 verifyFormat("while (0) /* a comment in a strange place */ {\n"
6990 " f();\n"
6991 "}");
6992 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
6993 " f();\n"
6994 "}");
6995 verifyFormat("do /* a comment in a strange place */ {\n"
6996 " f();\n"
6997 "} /* another comment */ while (0);");
6998}
6999
7000TEST_F(FormatTest, BlockComments) {
7001 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7002 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007003 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007004 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007005 " b\n"
7006 "/* */\n"
7007 "someCall(\n"
7008 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007009 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007010 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007011 "someCall(parameter);",
7012 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007013
7014 EXPECT_EQ("#define A\n"
7015 "/* */ someCall(\n"
7016 " parameter);",
7017 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007018 "/* */someCall(parameter);",
7019 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007020 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007021 EXPECT_EQ("/*\n"
7022 "*\n"
7023 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007024 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007025 "*/",
7026 format("/*\n"
7027 "*\n"
7028 " * aaaaaa aaaaaa\n"
7029 "*/",
7030 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007031 EXPECT_EQ("/*\n"
7032 "**\n"
7033 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007034 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007035 "*/",
7036 format("/*\n"
7037 "**\n"
7038 "* aaaaaa aaaaaa\n"
7039 "*/",
7040 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007041 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7042 " /* line 1\n"
7043 " bbbbbbbbbbbb */\n"
7044 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7045 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7046 " /* line 1\n"
7047 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7048 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007049
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007050 FormatStyle NoBinPacking = getLLVMStyle();
7051 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007052 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7053 " 2, /* comment 2 */\n"
7054 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007055 " aaaa,\n"
7056 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007057 format("someFunction (1, /* comment 1 */\n"
7058 " 2, /* comment 2 */ \n"
7059 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007060 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007061 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007062 verifyFormat(
7063 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7064 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7065 EXPECT_EQ(
7066 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7067 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7068 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7069 format(
7070 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7071 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7072 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007073 EXPECT_EQ(
7074 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7075 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7076 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7077 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7078 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7079 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007080
7081 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007082
7083 EXPECT_EQ("/*\n"
7084 " **\n"
7085 " */",
7086 format("/*\n"
7087 " **\n"
7088 " */"));
7089 EXPECT_EQ("/*\n"
7090 " *q\n"
7091 " */",
7092 format("/*\n"
7093 " *q\n"
7094 " */"));
7095 EXPECT_EQ("/*\n"
7096 " * q\n"
7097 " */",
7098 format("/*\n"
7099 " * q\n"
7100 " */"));
7101 EXPECT_EQ("/*\n"
7102 " **/",
7103 format("/*\n"
7104 " **/"));
7105 EXPECT_EQ("/*\n"
7106 " ***/",
7107 format("/*\n"
7108 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007109}
7110
Manuel Klimek82b836a2013-02-06 16:40:56 +00007111TEST_F(FormatTest, BlockCommentsInMacros) {
7112 EXPECT_EQ("#define A \\\n"
7113 " { \\\n"
7114 " /* one line */ \\\n"
7115 " someCall();",
7116 format("#define A { \\\n"
7117 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007118 " someCall();",
7119 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007120 EXPECT_EQ("#define A \\\n"
7121 " { \\\n"
7122 " /* previous */ \\\n"
7123 " /* one line */ \\\n"
7124 " someCall();",
7125 format("#define A { \\\n"
7126 " /* previous */ \\\n"
7127 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007128 " someCall();",
7129 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007130}
7131
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007132TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7133 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007134 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007135 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007136 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007137 "};",
7138 getLLVMStyleWithColumns(15)));
7139 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007140 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007141 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007142 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007143 "};",
7144 getLLVMStyleWithColumns(15)));
7145
7146 // FIXME: The formatting is still wrong here.
7147 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007148 " 1111 /* a\n"
7149 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007150 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007151 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007152 "};",
7153 getLLVMStyleWithColumns(15)));
7154}
7155
Manuel Klimek82b836a2013-02-06 16:40:56 +00007156TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007157 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007158 " // a\n"
7159 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007160}
7161
Manuel Klimekd33516e2013-01-23 10:09:28 +00007162TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007163 verifyFormat("void f(int *a);");
7164 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007165 verifyFormat("class A {\n void f(int *a);\n};");
7166 verifyFormat("class A {\n int *a;\n};");
7167 verifyFormat("namespace a {\n"
7168 "namespace b {\n"
7169 "class A {\n"
7170 " void f() {}\n"
7171 " int *a;\n"
7172 "};\n"
7173 "}\n"
7174 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007175}
7176
Manuel Klimekd33516e2013-01-23 10:09:28 +00007177TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7178 verifyFormat("while");
7179 verifyFormat("operator");
7180}
7181
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007182TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7183 // This code would be painfully slow to format if we didn't skip it.
7184 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
7185 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7186 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7187 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7188 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7189 "A(1, 1)\n"
7190 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7191 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7192 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7193 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7194 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
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 // Deeply nested part is untouched, rest is formatted.
7201 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7202 format(std::string("int i;\n") + Code + "int j;\n",
7203 getLLVMStyle(), IC_ExpectIncomplete));
7204}
7205
Nico Weber7e6a7a12013-01-08 17:56:31 +00007206//===----------------------------------------------------------------------===//
7207// Objective-C tests.
7208//===----------------------------------------------------------------------===//
7209
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007210TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7211 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7212 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7213 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007214 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007215 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7216 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7217 format("-(NSInteger)Method3:(id)anObject;"));
7218 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7219 format("-(NSInteger)Method4:(id)anObject;"));
7220 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7221 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7222 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7223 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007224 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7225 "forAllCells:(BOOL)flag;",
7226 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7227 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007228
7229 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007230 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7231 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007232 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7233 " inRange:(NSRange)range\n"
7234 " outRange:(NSRange)out_range\n"
7235 " outRange1:(NSRange)out_range1\n"
7236 " outRange2:(NSRange)out_range2\n"
7237 " outRange3:(NSRange)out_range3\n"
7238 " outRange4:(NSRange)out_range4\n"
7239 " outRange5:(NSRange)out_range5\n"
7240 " outRange6:(NSRange)out_range6\n"
7241 " outRange7:(NSRange)out_range7\n"
7242 " outRange8:(NSRange)out_range8\n"
7243 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007244
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007245 // When the function name has to be wrapped.
7246 FormatStyle Style = getLLVMStyle();
7247 Style.IndentWrappedFunctionNames = false;
7248 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7249 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7250 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7251 "}",
7252 Style);
7253 Style.IndentWrappedFunctionNames = true;
7254 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7255 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7256 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7257 "}",
7258 Style);
7259
Nico Weberd6f962f2013-01-10 20:18:33 +00007260 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007261 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007262 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7263 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007264 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007265
Daniel Jasper37194282013-05-28 08:33:00 +00007266 verifyFormat("- (int (*)())foo:(int (*)())f;");
7267 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007268
7269 // If there's no return type (very rare in practice!), LLVM and Google style
7270 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007271 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007272 verifyFormat("- foo:(int)f;");
7273 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007274}
7275
Nico Weber7eecf4b2013-01-09 20:25:35 +00007276TEST_F(FormatTest, FormatObjCInterface) {
Nico Webera6087752013-01-10 20:12:55 +00007277 verifyFormat("@interface Foo : NSObject <NSSomeDelegate> {\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007278 "@public\n"
7279 " int field1;\n"
7280 "@protected\n"
7281 " int field2;\n"
7282 "@private\n"
7283 " int field3;\n"
7284 "@package\n"
7285 " int field4;\n"
7286 "}\n"
7287 "+ (id)init;\n"
7288 "@end");
7289
Nico Weber7eecf4b2013-01-09 20:25:35 +00007290 verifyGoogleFormat("@interface Foo : NSObject<NSSomeDelegate> {\n"
7291 " @public\n"
7292 " int field1;\n"
7293 " @protected\n"
7294 " int field2;\n"
7295 " @private\n"
7296 " int field3;\n"
7297 " @package\n"
7298 " int field4;\n"
7299 "}\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007300 "+ (id)init;\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007301 "@end");
7302
Nico Weber6029d4f2013-01-22 16:53:59 +00007303 verifyFormat("@interface /* wait for it */ Foo\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007304 "+ (id)init;\n"
7305 "// Look, a comment!\n"
7306 "- (int)answerWith:(int)i;\n"
7307 "@end");
7308
7309 verifyFormat("@interface Foo\n"
Nico Weberd8ffe752013-01-09 21:42:32 +00007310 "@end\n"
7311 "@interface Bar\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007312 "@end");
7313
7314 verifyFormat("@interface Foo : Bar\n"
7315 "+ (id)init;\n"
7316 "@end");
7317
Nico Weber6029d4f2013-01-22 16:53:59 +00007318 verifyFormat("@interface Foo : /**/ Bar /**/ <Baz, /**/ Quux>\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007319 "+ (id)init;\n"
7320 "@end");
7321
Nico Webera6087752013-01-10 20:12:55 +00007322 verifyGoogleFormat("@interface Foo : Bar<Baz, Quux>\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007323 "+ (id)init;\n"
Nico Webera6087752013-01-10 20:12:55 +00007324 "@end");
7325
Nico Weber2bb00742013-01-10 19:19:14 +00007326 verifyFormat("@interface Foo (HackStuff)\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007327 "+ (id)init;\n"
7328 "@end");
7329
Nico Weber2bb00742013-01-10 19:19:14 +00007330 verifyFormat("@interface Foo ()\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007331 "+ (id)init;\n"
7332 "@end");
7333
Nico Webera6087752013-01-10 20:12:55 +00007334 verifyFormat("@interface Foo (HackStuff) <MyProtocol>\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007335 "+ (id)init;\n"
7336 "@end");
7337
Daniel Jasper20e15562015-04-16 07:02:19 +00007338 verifyGoogleFormat("@interface Foo (HackStuff)<MyProtocol>\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007339 "+ (id)init;\n"
Nico Webera6087752013-01-10 20:12:55 +00007340 "@end");
7341
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007342 verifyFormat("@interface Foo {\n"
7343 " int _i;\n"
7344 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007345 "+ (id)init;\n"
7346 "@end");
7347
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007348 verifyFormat("@interface Foo : Bar {\n"
7349 " int _i;\n"
7350 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007351 "+ (id)init;\n"
7352 "@end");
7353
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007354 verifyFormat("@interface Foo : Bar <Baz, Quux> {\n"
7355 " int _i;\n"
7356 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007357 "+ (id)init;\n"
7358 "@end");
7359
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007360 verifyFormat("@interface Foo (HackStuff) {\n"
7361 " int _i;\n"
7362 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007363 "+ (id)init;\n"
7364 "@end");
7365
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007366 verifyFormat("@interface Foo () {\n"
7367 " int _i;\n"
7368 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007369 "+ (id)init;\n"
7370 "@end");
7371
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007372 verifyFormat("@interface Foo (HackStuff) <MyProtocol> {\n"
7373 " int _i;\n"
7374 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007375 "+ (id)init;\n"
7376 "@end");
Daniel Jasper437c3f52014-04-28 07:34:48 +00007377
7378 FormatStyle OnePerLine = getGoogleStyle();
7379 OnePerLine.BinPackParameters = false;
Daniel Jasper20e15562015-04-16 07:02:19 +00007380 verifyFormat("@interface aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ()<\n"
Daniel Jasper437c3f52014-04-28 07:34:48 +00007381 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7382 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7383 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7384 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
7385 "}",
7386 OnePerLine);
Nico Weber7eecf4b2013-01-09 20:25:35 +00007387}
7388
Nico Weber2ce0ac52013-01-09 23:25:37 +00007389TEST_F(FormatTest, FormatObjCImplementation) {
7390 verifyFormat("@implementation Foo : NSObject {\n"
7391 "@public\n"
7392 " int field1;\n"
7393 "@protected\n"
7394 " int field2;\n"
7395 "@private\n"
7396 " int field3;\n"
7397 "@package\n"
7398 " int field4;\n"
7399 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007400 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007401 "@end");
7402
7403 verifyGoogleFormat("@implementation Foo : NSObject {\n"
7404 " @public\n"
7405 " int field1;\n"
7406 " @protected\n"
7407 " int field2;\n"
7408 " @private\n"
7409 " int field3;\n"
7410 " @package\n"
7411 " int field4;\n"
7412 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007413 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007414 "@end");
7415
7416 verifyFormat("@implementation Foo\n"
7417 "+ (id)init {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +00007418 " if (true)\n"
7419 " return nil;\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007420 "}\n"
7421 "// Look, a comment!\n"
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007422 "- (int)answerWith:(int)i {\n"
7423 " return i;\n"
7424 "}\n"
Nico Webera21aaae2013-01-11 21:14:08 +00007425 "+ (int)answerWith:(int)i {\n"
7426 " return i;\n"
7427 "}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007428 "@end");
7429
7430 verifyFormat("@implementation Foo\n"
7431 "@end\n"
7432 "@implementation Bar\n"
7433 "@end");
7434
Daniel Jasper91b032a2014-05-22 12:46:38 +00007435 EXPECT_EQ("@implementation Foo : Bar\n"
7436 "+ (id)init {\n}\n"
7437 "- (void)foo {\n}\n"
7438 "@end",
7439 format("@implementation Foo : Bar\n"
7440 "+(id)init{}\n"
7441 "-(void)foo{}\n"
7442 "@end"));
Nico Weber2ce0ac52013-01-09 23:25:37 +00007443
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007444 verifyFormat("@implementation Foo {\n"
7445 " int _i;\n"
7446 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007447 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007448 "@end");
7449
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007450 verifyFormat("@implementation Foo : Bar {\n"
7451 " int _i;\n"
7452 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007453 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007454 "@end");
7455
Nico Weber2bb00742013-01-10 19:19:14 +00007456 verifyFormat("@implementation Foo (HackStuff)\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007457 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007458 "@end");
Daniel Jaspera15da302013-08-28 08:04:23 +00007459 verifyFormat("@implementation ObjcClass\n"
7460 "- (void)method;\n"
7461 "{}\n"
7462 "@end");
Nico Weber2ce0ac52013-01-09 23:25:37 +00007463}
7464
Nico Weber8696a8d2013-01-09 21:15:03 +00007465TEST_F(FormatTest, FormatObjCProtocol) {
7466 verifyFormat("@protocol Foo\n"
7467 "@property(weak) id delegate;\n"
7468 "- (NSUInteger)numberOfThings;\n"
7469 "@end");
7470
Nico Webera6087752013-01-10 20:12:55 +00007471 verifyFormat("@protocol MyProtocol <NSObject>\n"
Nico Weber8696a8d2013-01-09 21:15:03 +00007472 "- (NSUInteger)numberOfThings;\n"
7473 "@end");
7474
Nico Webera6087752013-01-10 20:12:55 +00007475 verifyGoogleFormat("@protocol MyProtocol<NSObject>\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007476 "- (NSUInteger)numberOfThings;\n"
Nico Webera6087752013-01-10 20:12:55 +00007477 "@end");
7478
Nico Weber8696a8d2013-01-09 21:15:03 +00007479 verifyFormat("@protocol Foo;\n"
7480 "@protocol Bar;\n");
Nico Weberd8ffe752013-01-09 21:42:32 +00007481
7482 verifyFormat("@protocol Foo\n"
7483 "@end\n"
7484 "@protocol Bar\n"
7485 "@end");
Nico Weber51306d22013-01-10 00:25:19 +00007486
7487 verifyFormat("@protocol myProtocol\n"
7488 "- (void)mandatoryWithInt:(int)i;\n"
7489 "@optional\n"
7490 "- (void)optional;\n"
7491 "@required\n"
7492 "- (void)required;\n"
Nico Weberbbe28b32013-01-10 00:42:07 +00007493 "@optional\n"
7494 "@property(assign) int madProp;\n"
Nico Weber51306d22013-01-10 00:25:19 +00007495 "@end\n");
Daniel Jasper9688ff12013-08-01 13:46:58 +00007496
7497 verifyFormat("@property(nonatomic, assign, readonly)\n"
7498 " int *looooooooooooooooooooooooooooongNumber;\n"
7499 "@property(nonatomic, assign, readonly)\n"
7500 " NSString *looooooooooooooooooooooooooooongName;");
Benjamin Kramere21cb742014-01-08 15:59:42 +00007501
7502 verifyFormat("@implementation PR18406\n"
7503 "}\n"
7504 "@end");
Nico Weber8696a8d2013-01-09 21:15:03 +00007505}
7506
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007507TEST_F(FormatTest, FormatObjCMethodDeclarations) {
7508 verifyFormat("- (void)doSomethingWith:(GTMFoo *)theFoo\n"
7509 " rect:(NSRect)theRect\n"
7510 " interval:(float)theInterval {\n"
7511 "}");
7512 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
Daniel Jasper06a26952016-01-04 07:29:07 +00007513 " longKeyword:(NSRect)theRect\n"
7514 " longerKeyword:(float)theInterval\n"
7515 " error:(NSError **)theError {\n"
7516 "}");
7517 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007518 " longKeyword:(NSRect)theRect\n"
7519 " evenLongerKeyword:(float)theInterval\n"
7520 " error:(NSError **)theError {\n"
7521 "}");
Daniel Jasperec8e8382014-10-11 08:24:56 +00007522 verifyFormat("- (instancetype)initXxxxxx:(id<x>)x\n"
7523 " y:(id<yyyyyyyyyyyyyyyyyyyy>)y\n"
7524 " NS_DESIGNATED_INITIALIZER;",
7525 getLLVMStyleWithColumns(60));
Daniel Jasper3c44c222015-07-16 22:58:24 +00007526
7527 // Continuation indent width should win over aligning colons if the function
7528 // name is long.
7529 FormatStyle continuationStyle = getGoogleStyle();
7530 continuationStyle.ColumnLimit = 40;
7531 continuationStyle.IndentWrappedFunctionNames = true;
7532 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
7533 " dontAlignNamef:(NSRect)theRect {\n"
7534 "}",
7535 continuationStyle);
7536
7537 // Make sure we don't break aligning for short parameter names.
7538 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
7539 " aShortf:(NSRect)theRect {\n"
7540 "}",
7541 continuationStyle);
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007542}
7543
Nico Webera7252d82013-01-12 06:18:40 +00007544TEST_F(FormatTest, FormatObjCMethodExpr) {
7545 verifyFormat("[foo bar:baz];");
7546 verifyFormat("return [foo bar:baz];");
Daniel Jasperea772b4d2014-10-16 08:38:51 +00007547 verifyFormat("return (a)[foo bar:baz];");
Nico Webera7252d82013-01-12 06:18:40 +00007548 verifyFormat("f([foo bar:baz]);");
7549 verifyFormat("f(2, [foo bar:baz]);");
7550 verifyFormat("f(2, a ? b : c);");
7551 verifyFormat("[[self initWithInt:4] bar:[baz quux:arrrr]];");
7552
Nico Weberb76de882013-02-05 16:21:00 +00007553 // Unary operators.
7554 verifyFormat("int a = +[foo bar:baz];");
7555 verifyFormat("int a = -[foo bar:baz];");
7556 verifyFormat("int a = ![foo bar:baz];");
7557 verifyFormat("int a = ~[foo bar:baz];");
7558 verifyFormat("int a = ++[foo bar:baz];");
7559 verifyFormat("int a = --[foo bar:baz];");
7560 verifyFormat("int a = sizeof [foo bar:baz];");
Alexander Kornienko1e808872013-06-28 12:51:24 +00007561 verifyFormat("int a = alignof [foo bar:baz];", getGoogleStyle());
Nico Weber5d2624e2013-02-06 06:20:11 +00007562 verifyFormat("int a = &[foo bar:baz];");
7563 verifyFormat("int a = *[foo bar:baz];");
Nico Weberb76de882013-02-05 16:21:00 +00007564 // FIXME: Make casts work, without breaking f()[4].
Daniel Jaspera44991332015-04-29 13:06:49 +00007565 // verifyFormat("int a = (int)[foo bar:baz];");
7566 // verifyFormat("return (int)[foo bar:baz];");
7567 // verifyFormat("(void)[foo bar:baz];");
Nico Webera7892392013-02-13 03:48:27 +00007568 verifyFormat("return (MyType *)[self.tableView cellForRowAtIndexPath:cell];");
Nico Weberb76de882013-02-05 16:21:00 +00007569
7570 // Binary operators.
Nico Webera7252d82013-01-12 06:18:40 +00007571 verifyFormat("[foo bar:baz], [foo bar:baz];");
7572 verifyFormat("[foo bar:baz] = [foo bar:baz];");
7573 verifyFormat("[foo bar:baz] *= [foo bar:baz];");
7574 verifyFormat("[foo bar:baz] /= [foo bar:baz];");
7575 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] : [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];");
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 // Whew!
7603
Nico Weber29f9dea2013-02-11 15:32:15 +00007604 verifyFormat("return in[42];");
Daniel Jasper3a623db2014-12-18 12:11:01 +00007605 verifyFormat("for (auto v : in[1]) {\n}");
Daniel Jasper2b1865c2015-04-15 07:26:18 +00007606 verifyFormat("for (int i = 0; i < in[a]; ++i) {\n}");
7607 verifyFormat("for (int i = 0; in[a] < i; ++i) {\n}");
7608 verifyFormat("for (int i = 0; i < n; ++i, ++in[a]) {\n}");
7609 verifyFormat("for (int i = 0; i < n; ++i, in[a]++) {\n}");
7610 verifyFormat("for (int i = 0; i < f(in[a]); ++i, in[a]++) {\n}");
Nico Weber29f9dea2013-02-11 15:32:15 +00007611 verifyFormat("for (id foo in [self getStuffFor:bla]) {\n"
7612 "}");
Daniel Jasper78580792014-10-20 12:01:45 +00007613 verifyFormat("[self aaaaa:MACRO(a, b:, c:)];");
Daniel Jaspercdb58b22015-05-15 09:05:31 +00007614 verifyFormat("[self aaaaa:(1 + 2) bbbbb:3];");
7615 verifyFormat("[self aaaaa:(Type)a bbbbb:3];");
Nico Weber29f9dea2013-02-11 15:32:15 +00007616
Nico Webera7252d82013-01-12 06:18:40 +00007617 verifyFormat("[self stuffWithInt:(4 + 2) float:4.5];");
7618 verifyFormat("[self stuffWithInt:a ? b : c float:4.5];");
7619 verifyFormat("[self stuffWithInt:a ? [self foo:bar] : c];");
7620 verifyFormat("[self stuffWithInt:a ? (e ? f : g) : c];");
7621 verifyFormat("[cond ? obj1 : obj2 methodWithParam:param]");
Nico Weber5c8709b2013-01-12 23:41:33 +00007622 verifyFormat("[button setAction:@selector(zoomOut:)];");
Nico Weber2827a7e2013-01-12 23:48:49 +00007623 verifyFormat("[color getRed:&r green:&g blue:&b alpha:&a];");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007624
Nico Webera7252d82013-01-12 06:18:40 +00007625 verifyFormat("arr[[self indexForFoo:a]];");
7626 verifyFormat("throw [self errorFor:a];");
7627 verifyFormat("@throw [self errorFor:a];");
7628
Nico Weberec9e4102013-06-25 00:55:57 +00007629 verifyFormat("[(id)foo bar:(id)baz quux:(id)snorf];");
7630 verifyFormat("[(id)foo bar:(id) ? baz : quux];");
7631 verifyFormat("4 > 4 ? (id)a : (id)baz;");
7632
Nico Weberc9d73612013-01-12 22:48:47 +00007633 // This tests that the formatter doesn't break after "backing" but before ":",
7634 // which would be at 80 columns.
Nico Webera7252d82013-01-12 06:18:40 +00007635 verifyFormat(
7636 "void f() {\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007637 " if ((self = [super initWithContentRect:contentRect\n"
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007638 " styleMask:styleMask ?: otherMask\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007639 " backing:NSBackingStoreBuffered\n"
7640 " defer:YES]))");
7641
Daniel Jasperc697ad22013-02-06 10:05:46 +00007642 verifyFormat(
7643 "[foo checkThatBreakingAfterColonWorksOk:\n"
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007644 " [bar ifItDoes:reduceOverallLineLengthLikeInThisCase]];");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007645
7646 verifyFormat("[myObj short:arg1 // Force line break\n"
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007647 " longKeyword:arg2 != nil ? arg2 : @\"longKeyword\"\n"
7648 " evenLongerKeyword:arg3 ?: @\"evenLongerKeyword\"\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007649 " error:arg4];");
7650 verifyFormat(
7651 "void f() {\n"
7652 " popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
7653 " initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n"
7654 " pos.width(), pos.height())\n"
7655 " styleMask:NSBorderlessWindowMask\n"
7656 " backing:NSBackingStoreBuffered\n"
7657 " defer:NO]);\n"
7658 "}");
Daniel Jasper4478e522013-11-08 17:33:24 +00007659 verifyFormat(
7660 "void f() {\n"
7661 " popup_wdow_.reset([[RenderWidgetPopupWindow alloc]\n"
7662 " iniithContentRect:NSMakRet(origin_global.x, origin_global.y,\n"
7663 " pos.width(), pos.height())\n"
7664 " syeMask:NSBorderlessWindowMask\n"
7665 " bking:NSBackingStoreBuffered\n"
7666 " der:NO]);\n"
7667 "}",
7668 getLLVMStyleWithColumns(70));
Daniel Jasper18210d72014-10-09 09:52:05 +00007669 verifyFormat(
7670 "void f() {\n"
7671 " popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
7672 " initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n"
7673 " pos.width(), pos.height())\n"
7674 " styleMask:NSBorderlessWindowMask\n"
7675 " backing:NSBackingStoreBuffered\n"
7676 " defer:NO]);\n"
7677 "}",
7678 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasperc697ad22013-02-06 10:05:46 +00007679 verifyFormat("[contentsContainer replaceSubview:[subviews objectAtIndex:0]\n"
7680 " with:contentsNativeView];");
7681
7682 verifyFormat(
7683 "[pboard addTypes:[NSArray arrayWithObject:kBookmarkButtonDragType]\n"
7684 " owner:nillllll];");
7685
Daniel Jasperc697ad22013-02-06 10:05:46 +00007686 verifyFormat(
Daniel Jasperacc33662013-02-08 08:22:00 +00007687 "[pboard setData:[NSData dataWithBytes:&button length:sizeof(button)]\n"
Daniel Jasperc697ad22013-02-06 10:05:46 +00007688 " forType:kBookmarkButtonDragType];");
7689
7690 verifyFormat("[defaultCenter addObserver:self\n"
7691 " selector:@selector(willEnterFullscreen)\n"
7692 " name:kWillEnterFullscreenNotification\n"
7693 " object:nil];");
Daniel Jasperc485b4e2013-02-06 16:00:26 +00007694 verifyFormat("[image_rep drawInRect:drawRect\n"
7695 " fromRect:NSZeroRect\n"
7696 " operation:NSCompositeCopy\n"
7697 " fraction:1.0\n"
7698 " respectFlipped:NO\n"
7699 " hints:nil];");
Daniel Jaspereb536682015-05-06 12:48:06 +00007700 verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7701 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasper9c950132015-05-07 14:19:59 +00007702 verifyFormat("[aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
7703 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jaspera7b14262015-05-13 10:23:03 +00007704 verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaa[aaaaaaaaaaaaaaaaaaaaa]\n"
7705 " aaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasper00492f92016-01-05 13:03:50 +00007706 verifyFormat("[call aaaaaaaa.aaaaaa.aaaaaaaa.aaaaaaaa.aaaaaaaa.aaaaaaaa\n"
7707 " .aaaaaaaa];", // FIXME: Indentation seems off.
Daniel Jaspered41f772015-05-19 11:06:33 +00007708 getLLVMStyleWithColumns(60));
Nico Weberac9bde22013-02-06 16:54:35 +00007709
7710 verifyFormat(
7711 "scoped_nsobject<NSTextField> message(\n"
7712 " // The frame will be fixed up when |-setMessageText:| is called.\n"
7713 " [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 0, 0)]);");
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007714 verifyFormat("[self aaaaaa:bbbbbbbbbbbbb\n"
7715 " aaaaaaaaaa:bbbbbbbbbbbbbbbbb\n"
7716 " aaaaa:bbbbbbbbbbb + bbbbbbbbbbbb\n"
7717 " aaaa:bbb];");
Daniel Jasper4478e522013-11-08 17:33:24 +00007718 verifyFormat("[self param:function( //\n"
7719 " parameter)]");
Daniel Jasperf48b5ab2013-11-07 19:23:49 +00007720 verifyFormat(
7721 "[self aaaaaaaaaa:aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |\n"
7722 " aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |\n"
7723 " aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa];");
Daniel Jaspera1ea4cb2013-10-26 17:00:22 +00007724
Daniel Jasper2746a302015-05-06 13:13:03 +00007725 // FIXME: This violates the column limit.
7726 verifyFormat(
7727 "[aaaaaaaaaaaaaaaaaaaaaaaaa\n"
7728 " aaaaaaaaaaaaaaaaa:aaaaaaaa\n"
7729 " aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];",
7730 getLLVMStyleWithColumns(60));
7731
Daniel Jaspera1ea4cb2013-10-26 17:00:22 +00007732 // Variadic parameters.
7733 verifyFormat(
7734 "NSArray *myStrings = [NSArray stringarray:@\"a\", @\"b\", nil];");
Daniel Jasperf48b5ab2013-11-07 19:23:49 +00007735 verifyFormat(
7736 "[self aaaaaaaaaaaaa:aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
7737 " aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
7738 " aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa];");
Daniel Jasperb302f9a2013-11-08 02:08:01 +00007739 verifyFormat("[self // break\n"
7740 " a:a\n"
7741 " aaa:aaa];");
Daniel Jasper3460b252013-12-18 07:08:51 +00007742 verifyFormat("bool a = ([aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaa ||\n"
7743 " [aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaaaaa);");
Nico Webera7252d82013-01-12 06:18:40 +00007744}
7745
Nico Weber12d5bab2013-01-07 15:56:25 +00007746TEST_F(FormatTest, ObjCAt) {
Nico Weber803d61d2013-01-07 16:07:07 +00007747 verifyFormat("@autoreleasepool");
Nico Webere89c42f2013-01-07 16:14:28 +00007748 verifyFormat("@catch");
7749 verifyFormat("@class");
Nico Weber803d61d2013-01-07 16:07:07 +00007750 verifyFormat("@compatibility_alias");
7751 verifyFormat("@defs");
Nico Webera8876502013-01-07 15:17:23 +00007752 verifyFormat("@dynamic");
Nico Weber803d61d2013-01-07 16:07:07 +00007753 verifyFormat("@encode");
7754 verifyFormat("@end");
7755 verifyFormat("@finally");
7756 verifyFormat("@implementation");
7757 verifyFormat("@import");
7758 verifyFormat("@interface");
7759 verifyFormat("@optional");
7760 verifyFormat("@package");
Nico Webere89c42f2013-01-07 16:14:28 +00007761 verifyFormat("@private");
Nico Weber803d61d2013-01-07 16:07:07 +00007762 verifyFormat("@property");
Nico Webere89c42f2013-01-07 16:14:28 +00007763 verifyFormat("@protected");
Nico Weber803d61d2013-01-07 16:07:07 +00007764 verifyFormat("@protocol");
Nico Webere89c42f2013-01-07 16:14:28 +00007765 verifyFormat("@public");
Nico Weber803d61d2013-01-07 16:07:07 +00007766 verifyFormat("@required");
7767 verifyFormat("@selector");
7768 verifyFormat("@synchronized");
7769 verifyFormat("@synthesize");
Nico Webere89c42f2013-01-07 16:14:28 +00007770 verifyFormat("@throw");
7771 verifyFormat("@try");
Nico Weber803d61d2013-01-07 16:07:07 +00007772
Nico Weber12d5bab2013-01-07 15:56:25 +00007773 EXPECT_EQ("@interface", format("@ interface"));
7774
7775 // The precise formatting of this doesn't matter, nobody writes code like
7776 // this.
7777 verifyFormat("@ /*foo*/ interface");
Nico Webera8876502013-01-07 15:17:23 +00007778}
7779
Nico Weberd8cdb532013-01-08 19:15:23 +00007780TEST_F(FormatTest, ObjCSnippets) {
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007781 verifyFormat("@autoreleasepool {\n"
7782 " foo();\n"
7783 "}");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007784 verifyFormat("@class Foo, Bar;");
Nico Weberd8cdb532013-01-08 19:15:23 +00007785 verifyFormat("@compatibility_alias AliasName ExistingClass;");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007786 verifyFormat("@dynamic textColor;");
Nico Webere3025672013-01-18 05:11:47 +00007787 verifyFormat("char *buf1 = @encode(int *);");
7788 verifyFormat("char *buf1 = @encode(typeof(4 * 5));");
Nico Weber44449172013-02-12 16:17:07 +00007789 verifyFormat("char *buf1 = @encode(int **);");
Nico Weber4cc98742013-01-08 20:16:23 +00007790 verifyFormat("Protocol *proto = @protocol(p1);");
Nico Weber250fe712013-01-18 02:43:57 +00007791 verifyFormat("SEL s = @selector(foo:);");
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007792 verifyFormat("@synchronized(self) {\n"
7793 " f();\n"
7794 "}");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007795
Nico Webera2a84952013-01-10 21:30:42 +00007796 verifyFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
7797 verifyGoogleFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
7798
Nico Weber7e6a7a12013-01-08 17:56:31 +00007799 verifyFormat("@property(assign, nonatomic) CGFloat hoverAlpha;");
Nico Webera2a84952013-01-10 21:30:42 +00007800 verifyFormat("@property(assign, getter=isEditable) BOOL editable;");
7801 verifyGoogleFormat("@property(assign, getter=isEditable) BOOL editable;");
Daniel Jaspere9beea22014-01-28 15:20:33 +00007802 verifyFormat("@property (assign, getter=isEditable) BOOL editable;",
7803 getMozillaStyle());
7804 verifyFormat("@property BOOL editable;", getMozillaStyle());
7805 verifyFormat("@property (assign, getter=isEditable) BOOL editable;",
7806 getWebKitStyle());
7807 verifyFormat("@property BOOL editable;", getWebKitStyle());
Nico Webere8d78242013-06-25 00:25:40 +00007808
7809 verifyFormat("@import foo.bar;\n"
7810 "@import baz;");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007811}
7812
Daniel Jasper9cb1ac282015-10-07 15:09:08 +00007813TEST_F(FormatTest, ObjCForIn) {
7814 verifyFormat("- (void)test {\n"
7815 " for (NSString *n in arrayOfStrings) {\n"
7816 " foo(n);\n"
7817 " }\n"
7818 "}");
7819 verifyFormat("- (void)test {\n"
7820 " for (NSString *n in (__bridge NSArray *)arrayOfStrings) {\n"
7821 " foo(n);\n"
7822 " }\n"
7823 "}");
7824}
7825
Nico Weber0588b502013-02-07 00:19:29 +00007826TEST_F(FormatTest, ObjCLiterals) {
7827 verifyFormat("@\"String\"");
7828 verifyFormat("@1");
7829 verifyFormat("@+4.8");
7830 verifyFormat("@-4");
7831 verifyFormat("@1LL");
7832 verifyFormat("@.5");
7833 verifyFormat("@'c'");
7834 verifyFormat("@true");
7835
7836 verifyFormat("NSNumber *smallestInt = @(-INT_MAX - 1);");
7837 verifyFormat("NSNumber *piOverTwo = @(M_PI / 2);");
7838 verifyFormat("NSNumber *favoriteColor = @(Green);");
7839 verifyFormat("NSString *path = @(getenv(\"PATH\"));");
Daniel Jasperb1c19f82014-01-10 07:44:53 +00007840
7841 verifyFormat("[dictionary setObject:@(1) forKey:@\"number\"];");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007842}
Nico Weber0588b502013-02-07 00:19:29 +00007843
Daniel Jasperb596fb22013-10-24 10:31:50 +00007844TEST_F(FormatTest, ObjCDictLiterals) {
Nico Weber0588b502013-02-07 00:19:29 +00007845 verifyFormat("@{");
Nico Weber372d8dc2013-02-10 20:35:35 +00007846 verifyFormat("@{}");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007847 verifyFormat("@{@\"one\" : @1}");
7848 verifyFormat("return @{@\"one\" : @1;");
Daniel Jaspera125d532014-03-21 12:38:57 +00007849 verifyFormat("@{@\"one\" : @1}");
Manuel Klimek1a18c402013-04-12 14:13:36 +00007850
Chandler Carruthf8b72662014-03-02 12:37:31 +00007851 verifyFormat("@{@\"one\" : @{@2 : @1}}");
Daniel Jaspera125d532014-03-21 12:38:57 +00007852 verifyFormat("@{\n"
7853 " @\"one\" : @{@2 : @1},\n"
7854 "}");
Manuel Klimek1a18c402013-04-12 14:13:36 +00007855
Chandler Carruthf8b72662014-03-02 12:37:31 +00007856 verifyFormat("@{1 > 2 ? @\"one\" : @\"two\" : 1 > 2 ? @1 : @2}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007857 verifyIncompleteFormat("[self setDict:@{}");
7858 verifyIncompleteFormat("[self setDict:@{@1 : @2}");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007859 verifyFormat("NSLog(@\"%@\", @{@1 : @2, @2 : @3}[@1]);");
Nico Weber372d8dc2013-02-10 20:35:35 +00007860 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007861 "NSDictionary *masses = @{@\"H\" : @1.0078, @\"He\" : @4.0026};");
Nico Weber33c68e92013-02-10 20:39:05 +00007862 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007863 "NSDictionary *settings = @{AVEncoderKey : @(AVAudioQualityMax)};");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007864
Daniel Jaspera44991332015-04-29 13:06:49 +00007865 verifyFormat("NSDictionary *d = @{\n"
7866 " @\"nam\" : NSUserNam(),\n"
7867 " @\"dte\" : [NSDate date],\n"
7868 " @\"processInfo\" : [NSProcessInfo processInfo]\n"
7869 "};");
Nico Weberced7d412013-05-26 05:39:26 +00007870 verifyFormat(
Daniel Jasperd489dd32013-10-20 16:45:46 +00007871 "@{\n"
7872 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee : "
7873 "regularFont,\n"
7874 "};");
Daniel Jasperb8f61682013-10-22 15:45:58 +00007875 verifyGoogleFormat(
7876 "@{\n"
7877 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee : "
7878 "regularFont,\n"
7879 "};");
Daniel Jasper1fd6f1f2014-03-17 14:32:47 +00007880 verifyFormat(
7881 "@{\n"
7882 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee :\n"
7883 " reeeeeeeeeeeeeeeeeeeeeeeegularFont,\n"
7884 "};");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007885
7886 // We should try to be robust in case someone forgets the "@".
Daniel Jaspera44991332015-04-29 13:06:49 +00007887 verifyFormat("NSDictionary *d = {\n"
7888 " @\"nam\" : NSUserNam(),\n"
7889 " @\"dte\" : [NSDate date],\n"
7890 " @\"processInfo\" : [NSProcessInfo processInfo]\n"
7891 "};");
Daniel Jasper335ff262014-05-28 09:11:53 +00007892 verifyFormat("NSMutableDictionary *dictionary =\n"
7893 " [NSMutableDictionary dictionaryWithDictionary:@{\n"
7894 " aaaaaaaaaaaaaaaaaaaaa : aaaaaaaaaaaaa,\n"
7895 " bbbbbbbbbbbbbbbbbb : bbbbb,\n"
7896 " cccccccccccccccc : ccccccccccccccc\n"
7897 " }];");
Daniel Jasper4d724492015-10-12 03:19:07 +00007898
7899 // Ensure that casts before the key are kept on the same line as the key.
7900 verifyFormat(
7901 "NSDictionary *d = @{\n"
7902 " (aaaaaaaa id)aaaaaaaaa : (aaaaaaaa id)aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7903 " (aaaaaaaa id)aaaaaaaaaaaaaa : (aaaaaaaa id)aaaaaaaaaaaaaa,\n"
7904 "};");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007905}
7906
7907TEST_F(FormatTest, ObjCArrayLiterals) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007908 verifyIncompleteFormat("@[");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007909 verifyFormat("@[]");
7910 verifyFormat(
7911 "NSArray *array = @[ @\" Hey \", NSApp, [NSNumber numberWithInt:42] ];");
7912 verifyFormat("return @[ @3, @[], @[ @4, @5 ] ];");
7913 verifyFormat("NSArray *array = @[ [foo description] ];");
7914
7915 verifyFormat(
7916 "NSArray *some_variable = @[\n"
7917 " aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" : @\"aaaaaaaaaaaaaa\",\n"
7918 " @\"aaaaaaaaaaaaaaaaa\",\n"
7919 " @\"aaaaaaaaaaaaaaaaa\",\n"
Daniel Jasper50780ce2016-01-13 16:41:34 +00007920 " @\"aaaaaaaaaaaaaaaaa\",\n"
7921 "];");
7922 verifyFormat(
7923 "NSArray *some_variable = @[\n"
7924 " aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" : @\"aaaaaaaaaaaaaa\",\n"
7925 " @\"aaaaaaaaaaaaaaaa\", @\"aaaaaaaaaaaaaaaa\", @\"aaaaaaaaaaaaaaaa\"\n"
Daniel Jasperb8f61682013-10-22 15:45:58 +00007926 "];");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007927 verifyFormat("NSArray *some_variable = @[\n"
7928 " @\"aaaaaaaaaaaaaaaaa\",\n"
7929 " @\"aaaaaaaaaaaaaaaaa\",\n"
7930 " @\"aaaaaaaaaaaaaaaaa\",\n"
7931 " @\"aaaaaaaaaaaaaaaaa\",\n"
7932 "];");
Daniel Jasper308062b2015-02-27 08:41:05 +00007933 verifyFormat("NSArray *array = @[\n"
7934 " @\"a\",\n"
7935 " @\"a\",\n" // Trailing comma -> one per line.
7936 "];");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007937
7938 // We should try to be robust in case someone forgets the "@".
7939 verifyFormat("NSArray *some_variable = [\n"
7940 " @\"aaaaaaaaaaaaaaaaa\",\n"
7941 " @\"aaaaaaaaaaaaaaaaa\",\n"
7942 " @\"aaaaaaaaaaaaaaaaa\",\n"
7943 " @\"aaaaaaaaaaaaaaaaa\",\n"
7944 "];");
Daniel Jasper4bf0d802013-11-23 14:27:27 +00007945 verifyFormat(
7946 "- (NSAttributedString *)attributedStringForSegment:(NSUInteger)segment\n"
7947 " index:(NSUInteger)index\n"
7948 " nonDigitAttributes:\n"
7949 " (NSDictionary *)noDigitAttributes;");
Daniel Jasperf841d3a2015-05-28 07:21:50 +00007950 verifyFormat("[someFunction someLooooooooooooongParameter:@[\n"
7951 " NSBundle.mainBundle.infoDictionary[@\"a\"]\n"
7952 "]];");
Nico Weber0588b502013-02-07 00:19:29 +00007953}
7954
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007955TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007956 EXPECT_EQ("\"some text \"\n"
7957 "\"other\";",
7958 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007959 EXPECT_EQ("\"some text \"\n"
7960 "\"other\";",
7961 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007962 EXPECT_EQ(
7963 "#define A \\\n"
7964 " \"some \" \\\n"
7965 " \"text \" \\\n"
7966 " \"other\";",
7967 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7968 EXPECT_EQ(
7969 "#define A \\\n"
7970 " \"so \" \\\n"
7971 " \"text \" \\\n"
7972 " \"other\";",
7973 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7974
7975 EXPECT_EQ("\"some text\"",
7976 format("\"some text\"", getLLVMStyleWithColumns(1)));
7977 EXPECT_EQ("\"some text\"",
7978 format("\"some text\"", getLLVMStyleWithColumns(11)));
7979 EXPECT_EQ("\"some \"\n"
7980 "\"text\"",
7981 format("\"some text\"", getLLVMStyleWithColumns(10)));
7982 EXPECT_EQ("\"some \"\n"
7983 "\"text\"",
7984 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007985 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007986 "\" tex\"\n"
7987 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007988 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007989 EXPECT_EQ("\"some\"\n"
7990 "\" tex\"\n"
7991 "\" and\"",
7992 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7993 EXPECT_EQ("\"some\"\n"
7994 "\"/tex\"\n"
7995 "\"/and\"",
7996 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007997
7998 EXPECT_EQ("variable =\n"
7999 " \"long string \"\n"
8000 " \"literal\";",
8001 format("variable = \"long string literal\";",
8002 getLLVMStyleWithColumns(20)));
8003
8004 EXPECT_EQ("variable = f(\n"
8005 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00008006 " \"literal\",\n"
8007 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00008008 " loooooooooooooooooooong);",
8009 format("variable = f(\"long string literal\", short, "
8010 "loooooooooooooooooooong);",
8011 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008012
Daniel Jaspera44991332015-04-29 13:06:49 +00008013 EXPECT_EQ(
8014 "f(g(\"long string \"\n"
8015 " \"literal\"),\n"
8016 " b);",
8017 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008018 EXPECT_EQ("f(g(\"long string \"\n"
8019 " \"literal\",\n"
8020 " a),\n"
8021 " b);",
8022 format("f(g(\"long string literal\", a), b);",
8023 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008024 EXPECT_EQ(
8025 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00008026 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008027 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8028 EXPECT_EQ("f(\"one two three four five six \"\n"
8029 " \"seven\".split(\n"
8030 " really_looooong_variable));",
8031 format("f(\"one two three four five six seven\"."
8032 "split(really_looooong_variable));",
8033 getLLVMStyleWithColumns(33)));
8034
8035 EXPECT_EQ("f(\"some \"\n"
8036 " \"text\",\n"
8037 " other);",
8038 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008039
8040 // Only break as a last resort.
8041 verifyFormat(
8042 "aaaaaaaaaaaaaaaaaaaa(\n"
8043 " aaaaaaaaaaaaaaaaaaaa,\n"
8044 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008045
Daniel Jaspera44991332015-04-29 13:06:49 +00008046 EXPECT_EQ("\"splitmea\"\n"
8047 "\"trandomp\"\n"
8048 "\"oint\"",
8049 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008050
Daniel Jaspera44991332015-04-29 13:06:49 +00008051 EXPECT_EQ("\"split/\"\n"
8052 "\"pathat/\"\n"
8053 "\"slashes\"",
8054 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008055
Daniel Jaspera44991332015-04-29 13:06:49 +00008056 EXPECT_EQ("\"split/\"\n"
8057 "\"pathat/\"\n"
8058 "\"slashes\"",
8059 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008060 EXPECT_EQ("\"split at \"\n"
8061 "\"spaces/at/\"\n"
8062 "\"slashes.at.any$\"\n"
8063 "\"non-alphanumeric%\"\n"
8064 "\"1111111111characte\"\n"
8065 "\"rs\"",
8066 format("\"split at "
8067 "spaces/at/"
8068 "slashes.at."
8069 "any$non-"
8070 "alphanumeric%"
8071 "1111111111characte"
8072 "rs\"",
8073 getLLVMStyleWithColumns(20)));
8074
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008075 // Verify that splitting the strings understands
8076 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008077 EXPECT_EQ(
8078 "aaaaaaaaaaaa(\n"
8079 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8080 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8081 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8082 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8083 "aaaaaaaaaaaaaaaaaaaaaa\");",
8084 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008085 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8086 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8087 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8088 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8089 "aaaaaaaaaaaaaaaaaaaaaa\";",
8090 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008091 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8092 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8093 format("llvm::outs() << "
8094 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8095 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008096 EXPECT_EQ("ffff(\n"
8097 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8098 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8099 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8100 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8101 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008102
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008103 FormatStyle Style = getLLVMStyleWithColumns(12);
8104 Style.BreakStringLiterals = false;
8105 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8106
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008107 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8108 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00008109 EXPECT_EQ("#define A \\\n"
8110 " \"some \" \\\n"
8111 " \"text \" \\\n"
8112 " \"other\";",
8113 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008114}
8115
Manuel Klimek9e321992015-07-28 15:50:24 +00008116TEST_F(FormatTest, FullyRemoveEmptyLines) {
8117 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8118 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8119 EXPECT_EQ("int i = a(b());",
8120 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8121}
8122
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008123TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8124 EXPECT_EQ(
8125 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8126 "(\n"
8127 " \"x\t\");",
8128 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8129 "aaaaaaa("
8130 "\"x\t\");"));
8131}
8132
Daniel Jasper174b0122014-01-09 14:18:12 +00008133TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008134 EXPECT_EQ(
8135 "u8\"utf8 string \"\n"
8136 "u8\"literal\";",
8137 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8138 EXPECT_EQ(
8139 "u\"utf16 string \"\n"
8140 "u\"literal\";",
8141 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8142 EXPECT_EQ(
8143 "U\"utf32 string \"\n"
8144 "U\"literal\";",
8145 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8146 EXPECT_EQ("L\"wide string \"\n"
8147 "L\"literal\";",
8148 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008149 EXPECT_EQ("@\"NSString \"\n"
8150 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008151 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008152
8153 // This input makes clang-format try to split the incomplete unicode escape
8154 // sequence, which used to lead to a crasher.
8155 verifyNoCrash(
8156 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8157 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008158}
8159
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008160TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8161 FormatStyle Style = getGoogleStyleWithColumns(15);
8162 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8163 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8164 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8165 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8166 EXPECT_EQ("u8R\"x(raw literal)x\";",
8167 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008168}
8169
8170TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8171 FormatStyle Style = getLLVMStyleWithColumns(20);
8172 EXPECT_EQ(
8173 "_T(\"aaaaaaaaaaaaaa\")\n"
8174 "_T(\"aaaaaaaaaaaaaa\")\n"
8175 "_T(\"aaaaaaaaaaaa\")",
8176 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8177 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
8178 " _T(\"aaaaaa\"),\n"
8179 " z);",
8180 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8181
8182 // FIXME: Handle embedded spaces in one iteration.
8183 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8184 // "_T(\"aaaaaaaaaaaaa\")\n"
8185 // "_T(\"aaaaaaaaaaaaa\")\n"
8186 // "_T(\"a\")",
8187 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8188 // getLLVMStyleWithColumns(20)));
8189 EXPECT_EQ(
8190 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8191 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008192 EXPECT_EQ("f(\n"
8193 "#if !TEST\n"
8194 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8195 "#endif\n"
8196 " );",
8197 format("f(\n"
8198 "#if !TEST\n"
8199 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8200 "#endif\n"
8201 ");"));
8202 EXPECT_EQ("f(\n"
8203 "\n"
8204 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8205 format("f(\n"
8206 "\n"
8207 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008208}
8209
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008210TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008211 EXPECT_EQ(
8212 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8213 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8214 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8215 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8216 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8217 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8218}
8219
8220TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8221 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008222 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008223 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8224 "multiline raw string literal xxxxxxxxxxxxxx\n"
8225 ")x\",\n"
8226 " a),\n"
8227 " b);",
8228 format("fffffffffff(g(R\"x(\n"
8229 "multiline raw string literal xxxxxxxxxxxxxx\n"
8230 ")x\", a), b);",
8231 getGoogleStyleWithColumns(20)));
8232 EXPECT_EQ("fffffffffff(\n"
8233 " g(R\"x(qqq\n"
8234 "multiline raw string literal xxxxxxxxxxxxxx\n"
8235 ")x\",\n"
8236 " a),\n"
8237 " b);",
8238 format("fffffffffff(g(R\"x(qqq\n"
8239 "multiline raw string literal xxxxxxxxxxxxxx\n"
8240 ")x\", a), b);",
8241 getGoogleStyleWithColumns(20)));
8242
8243 EXPECT_EQ("fffffffffff(R\"x(\n"
8244 "multiline raw string literal xxxxxxxxxxxxxx\n"
8245 ")x\");",
8246 format("fffffffffff(R\"x(\n"
8247 "multiline raw string literal xxxxxxxxxxxxxx\n"
8248 ")x\");",
8249 getGoogleStyleWithColumns(20)));
8250 EXPECT_EQ("fffffffffff(R\"x(\n"
8251 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008252 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008253 format("fffffffffff(R\"x(\n"
8254 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008255 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008256 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008257 EXPECT_EQ("fffffffffff(\n"
8258 " R\"x(\n"
8259 "multiline raw string literal xxxxxxxxxxxxxx\n"
8260 ")x\" +\n"
8261 " bbbbbb);",
8262 format("fffffffffff(\n"
8263 " R\"x(\n"
8264 "multiline raw string literal xxxxxxxxxxxxxx\n"
8265 ")x\" + bbbbbb);",
8266 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008267}
8268
Alexander Kornienkobe633902013-06-14 11:46:10 +00008269TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008270 verifyFormat("string a = \"unterminated;");
8271 EXPECT_EQ("function(\"unterminated,\n"
8272 " OtherParameter);",
8273 format("function( \"unterminated,\n"
8274 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008275}
8276
8277TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008278 FormatStyle Style = getLLVMStyle();
8279 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008280 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008281 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008282}
8283
Daniel Jaspera44991332015-04-29 13:06:49 +00008284TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008285
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008286TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8287 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8288 " \"ddeeefff\");",
8289 format("someFunction(\"aaabbbcccdddeeefff\");",
8290 getLLVMStyleWithColumns(25)));
8291 EXPECT_EQ("someFunction1234567890(\n"
8292 " \"aaabbbcccdddeeefff\");",
8293 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8294 getLLVMStyleWithColumns(26)));
8295 EXPECT_EQ("someFunction1234567890(\n"
8296 " \"aaabbbcccdddeeeff\"\n"
8297 " \"f\");",
8298 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8299 getLLVMStyleWithColumns(25)));
8300 EXPECT_EQ("someFunction1234567890(\n"
8301 " \"aaabbbcccdddeeeff\"\n"
8302 " \"f\");",
8303 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8304 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008305 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8306 " \"ddde \"\n"
8307 " \"efff\");",
8308 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008309 getLLVMStyleWithColumns(25)));
8310 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8311 " \"ddeeefff\");",
8312 format("someFunction(\"aaabbbccc ddeeefff\");",
8313 getLLVMStyleWithColumns(25)));
8314 EXPECT_EQ("someFunction1234567890(\n"
8315 " \"aaabb \"\n"
8316 " \"cccdddeeefff\");",
8317 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8318 getLLVMStyleWithColumns(25)));
8319 EXPECT_EQ("#define A \\\n"
8320 " string s = \\\n"
8321 " \"123456789\" \\\n"
8322 " \"0\"; \\\n"
8323 " int i;",
8324 format("#define A string s = \"1234567890\"; int i;",
8325 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008326 // FIXME: Put additional penalties on breaking at non-whitespace locations.
8327 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8328 " \"dddeeeff\"\n"
8329 " \"f\");",
8330 format("someFunction(\"aaabbbcc dddeeefff\");",
8331 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008332}
8333
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008334TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008335 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8336 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008337 EXPECT_EQ("\"test\"\n"
8338 "\"\\n\"",
8339 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8340 EXPECT_EQ("\"tes\\\\\"\n"
8341 "\"n\"",
8342 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8343 EXPECT_EQ("\"\\\\\\\\\"\n"
8344 "\"\\n\"",
8345 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008346 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008347 EXPECT_EQ("\"\\uff01\"\n"
8348 "\"test\"",
8349 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8350 EXPECT_EQ("\"\\Uff01ff02\"",
8351 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8352 EXPECT_EQ("\"\\x000000000001\"\n"
8353 "\"next\"",
8354 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8355 EXPECT_EQ("\"\\x000000000001next\"",
8356 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8357 EXPECT_EQ("\"\\x000000000001\"",
8358 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8359 EXPECT_EQ("\"test\"\n"
8360 "\"\\000000\"\n"
8361 "\"000001\"",
8362 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8363 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008364 "\"00000000\"\n"
8365 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008366 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008367}
8368
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008369TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8370 verifyFormat("void f() {\n"
8371 " return g() {}\n"
8372 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008373 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008374 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008375 "}");
8376}
8377
Manuel Klimek421147e2014-01-24 09:25:23 +00008378TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8379 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008380 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008381}
8382
Manuel Klimek13b97d82013-05-13 08:42:42 +00008383TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8384 verifyFormat("class X {\n"
8385 " void f() {\n"
8386 " }\n"
8387 "};",
8388 getLLVMStyleWithColumns(12));
8389}
8390
8391TEST_F(FormatTest, ConfigurableIndentWidth) {
8392 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8393 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008394 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008395 verifyFormat("void f() {\n"
8396 " someFunction();\n"
8397 " if (true) {\n"
8398 " f();\n"
8399 " }\n"
8400 "}",
8401 EightIndent);
8402 verifyFormat("class X {\n"
8403 " void f() {\n"
8404 " }\n"
8405 "};",
8406 EightIndent);
8407 verifyFormat("int x[] = {\n"
8408 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008409 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008410 EightIndent);
8411}
8412
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008413TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008414 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008415 "f();",
8416 getLLVMStyleWithColumns(8));
8417}
8418
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008419TEST_F(FormatTest, ConfigurableUseOfTab) {
8420 FormatStyle Tab = getLLVMStyleWithColumns(42);
8421 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008422 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008423 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008424
8425 EXPECT_EQ("if (aaaaaaaa && // q\n"
8426 " bb)\t\t// w\n"
8427 "\t;",
8428 format("if (aaaaaaaa &&// q\n"
8429 "bb)// w\n"
8430 ";",
8431 Tab));
8432 EXPECT_EQ("if (aaa && bbb) // w\n"
8433 "\t;",
8434 format("if(aaa&&bbb)// w\n"
8435 ";",
8436 Tab));
8437
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008438 verifyFormat("class X {\n"
8439 "\tvoid f() {\n"
8440 "\t\tsomeFunction(parameter1,\n"
8441 "\t\t\t parameter2);\n"
8442 "\t}\n"
8443 "};",
8444 Tab);
8445 verifyFormat("#define A \\\n"
8446 "\tvoid f() { \\\n"
8447 "\t\tsomeFunction( \\\n"
8448 "\t\t parameter1, \\\n"
8449 "\t\t parameter2); \\\n"
8450 "\t}",
8451 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008452
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008453 Tab.TabWidth = 4;
8454 Tab.IndentWidth = 8;
8455 verifyFormat("class TabWidth4Indent8 {\n"
8456 "\t\tvoid f() {\n"
8457 "\t\t\t\tsomeFunction(parameter1,\n"
8458 "\t\t\t\t\t\t\t parameter2);\n"
8459 "\t\t}\n"
8460 "};",
8461 Tab);
8462
8463 Tab.TabWidth = 4;
8464 Tab.IndentWidth = 4;
8465 verifyFormat("class TabWidth4Indent4 {\n"
8466 "\tvoid f() {\n"
8467 "\t\tsomeFunction(parameter1,\n"
8468 "\t\t\t\t\t parameter2);\n"
8469 "\t}\n"
8470 "};",
8471 Tab);
8472
8473 Tab.TabWidth = 8;
8474 Tab.IndentWidth = 4;
8475 verifyFormat("class TabWidth8Indent4 {\n"
8476 " void f() {\n"
8477 "\tsomeFunction(parameter1,\n"
8478 "\t\t parameter2);\n"
8479 " }\n"
8480 "};",
8481 Tab);
8482
Alexander Kornienko39856b72013-09-10 09:38:25 +00008483 Tab.TabWidth = 8;
8484 Tab.IndentWidth = 8;
8485 EXPECT_EQ("/*\n"
8486 "\t a\t\tcomment\n"
8487 "\t in multiple lines\n"
8488 " */",
8489 format(" /*\t \t \n"
8490 " \t \t a\t\tcomment\t \t\n"
8491 " \t \t in multiple lines\t\n"
8492 " \t */",
8493 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008494
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008495 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008496 verifyFormat("{\n"
8497 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8498 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8499 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8500 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8501 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8502 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008503 "};",
8504 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008505 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008506 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008507 "\ta2,\n"
8508 "\ta3\n"
8509 "};",
8510 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008511 EXPECT_EQ("if (aaaaaaaa && // q\n"
8512 " bb) // w\n"
8513 "\t;",
8514 format("if (aaaaaaaa &&// q\n"
8515 "bb)// w\n"
8516 ";",
8517 Tab));
8518 verifyFormat("class X {\n"
8519 "\tvoid f() {\n"
8520 "\t\tsomeFunction(parameter1,\n"
8521 "\t\t parameter2);\n"
8522 "\t}\n"
8523 "};",
8524 Tab);
8525 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008526 "\tQ(\n"
8527 "\t {\n"
8528 "\t\t int a;\n"
8529 "\t\t someFunction(aaaaaaaa,\n"
8530 "\t\t bbbbbbb);\n"
8531 "\t },\n"
8532 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008533 "}",
8534 Tab);
8535 EXPECT_EQ("{\n"
8536 "\t/* aaaa\n"
8537 "\t bbbb */\n"
8538 "}",
8539 format("{\n"
8540 "/* aaaa\n"
8541 " bbbb */\n"
8542 "}",
8543 Tab));
8544 EXPECT_EQ("{\n"
8545 "\t/*\n"
8546 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8547 "\t bbbbbbbbbbbbb\n"
8548 "\t*/\n"
8549 "}",
8550 format("{\n"
8551 "/*\n"
8552 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8553 "*/\n"
8554 "}",
8555 Tab));
8556 EXPECT_EQ("{\n"
8557 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8558 "\t// bbbbbbbbbbbbb\n"
8559 "}",
8560 format("{\n"
8561 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8562 "}",
8563 Tab));
8564 EXPECT_EQ("{\n"
8565 "\t/*\n"
8566 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8567 "\t bbbbbbbbbbbbb\n"
8568 "\t*/\n"
8569 "}",
8570 format("{\n"
8571 "\t/*\n"
8572 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8573 "\t*/\n"
8574 "}",
8575 Tab));
8576 EXPECT_EQ("{\n"
8577 "\t/*\n"
8578 "\n"
8579 "\t*/\n"
8580 "}",
8581 format("{\n"
8582 "\t/*\n"
8583 "\n"
8584 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008585 "}",
8586 Tab));
8587 EXPECT_EQ("{\n"
8588 "\t/*\n"
8589 " asdf\n"
8590 "\t*/\n"
8591 "}",
8592 format("{\n"
8593 "\t/*\n"
8594 " asdf\n"
8595 "\t*/\n"
8596 "}",
8597 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008598
8599 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008600 EXPECT_EQ("/*\n"
8601 " a\t\tcomment\n"
8602 " in multiple lines\n"
8603 " */",
8604 format(" /*\t \t \n"
8605 " \t \t a\t\tcomment\t \t\n"
8606 " \t \t in multiple lines\t\n"
8607 " \t */",
8608 Tab));
8609 EXPECT_EQ("/* some\n"
8610 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008611 format(" \t \t /* some\n"
8612 " \t \t comment */",
8613 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008614 EXPECT_EQ("int a; /* some\n"
8615 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008616 format(" \t \t int a; /* some\n"
8617 " \t \t comment */",
8618 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008619
Alexander Kornienko39856b72013-09-10 09:38:25 +00008620 EXPECT_EQ("int a; /* some\n"
8621 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008622 format(" \t \t int\ta; /* some\n"
8623 " \t \t comment */",
8624 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008625 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8626 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008627 format(" \t \t f(\"\t\t\"); /* some\n"
8628 " \t \t comment */",
8629 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008630 EXPECT_EQ("{\n"
8631 " /*\n"
8632 " * Comment\n"
8633 " */\n"
8634 " int i;\n"
8635 "}",
8636 format("{\n"
8637 "\t/*\n"
8638 "\t * Comment\n"
8639 "\t */\n"
8640 "\t int i;\n"
8641 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008642
8643 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8644 Tab.TabWidth = 8;
8645 Tab.IndentWidth = 8;
8646 EXPECT_EQ("if (aaaaaaaa && // q\n"
8647 " bb) // w\n"
8648 "\t;",
8649 format("if (aaaaaaaa &&// q\n"
8650 "bb)// w\n"
8651 ";",
8652 Tab));
8653 EXPECT_EQ("if (aaa && bbb) // w\n"
8654 "\t;",
8655 format("if(aaa&&bbb)// w\n"
8656 ";",
8657 Tab));
8658 verifyFormat("class X {\n"
8659 "\tvoid f() {\n"
8660 "\t\tsomeFunction(parameter1,\n"
8661 "\t\t\t parameter2);\n"
8662 "\t}\n"
8663 "};",
8664 Tab);
8665 verifyFormat("#define A \\\n"
8666 "\tvoid f() { \\\n"
8667 "\t\tsomeFunction( \\\n"
8668 "\t\t parameter1, \\\n"
8669 "\t\t parameter2); \\\n"
8670 "\t}",
8671 Tab);
8672 Tab.TabWidth = 4;
8673 Tab.IndentWidth = 8;
8674 verifyFormat("class TabWidth4Indent8 {\n"
8675 "\t\tvoid f() {\n"
8676 "\t\t\t\tsomeFunction(parameter1,\n"
8677 "\t\t\t\t\t\t\t parameter2);\n"
8678 "\t\t}\n"
8679 "};",
8680 Tab);
8681 Tab.TabWidth = 4;
8682 Tab.IndentWidth = 4;
8683 verifyFormat("class TabWidth4Indent4 {\n"
8684 "\tvoid f() {\n"
8685 "\t\tsomeFunction(parameter1,\n"
8686 "\t\t\t\t\t parameter2);\n"
8687 "\t}\n"
8688 "};",
8689 Tab);
8690 Tab.TabWidth = 8;
8691 Tab.IndentWidth = 4;
8692 verifyFormat("class TabWidth8Indent4 {\n"
8693 " void f() {\n"
8694 "\tsomeFunction(parameter1,\n"
8695 "\t\t parameter2);\n"
8696 " }\n"
8697 "};",
8698 Tab);
8699 Tab.TabWidth = 8;
8700 Tab.IndentWidth = 8;
8701 EXPECT_EQ("/*\n"
8702 "\t a\t\tcomment\n"
8703 "\t in multiple lines\n"
8704 " */",
8705 format(" /*\t \t \n"
8706 " \t \t a\t\tcomment\t \t\n"
8707 " \t \t in multiple lines\t\n"
8708 " \t */",
8709 Tab));
8710 verifyFormat("{\n"
8711 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8712 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8713 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8714 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8715 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8716 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8717 "};",
8718 Tab);
8719 verifyFormat("enum AA {\n"
8720 "\ta1, // Force multiple lines\n"
8721 "\ta2,\n"
8722 "\ta3\n"
8723 "};",
8724 Tab);
8725 EXPECT_EQ("if (aaaaaaaa && // q\n"
8726 " bb) // w\n"
8727 "\t;",
8728 format("if (aaaaaaaa &&// q\n"
8729 "bb)// w\n"
8730 ";",
8731 Tab));
8732 verifyFormat("class X {\n"
8733 "\tvoid f() {\n"
8734 "\t\tsomeFunction(parameter1,\n"
8735 "\t\t\t parameter2);\n"
8736 "\t}\n"
8737 "};",
8738 Tab);
8739 verifyFormat("{\n"
8740 "\tQ(\n"
8741 "\t {\n"
8742 "\t\t int a;\n"
8743 "\t\t someFunction(aaaaaaaa,\n"
8744 "\t\t\t\t bbbbbbb);\n"
8745 "\t },\n"
8746 "\t p);\n"
8747 "}",
8748 Tab);
8749 EXPECT_EQ("{\n"
8750 "\t/* aaaa\n"
8751 "\t bbbb */\n"
8752 "}",
8753 format("{\n"
8754 "/* aaaa\n"
8755 " bbbb */\n"
8756 "}",
8757 Tab));
8758 EXPECT_EQ("{\n"
8759 "\t/*\n"
8760 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8761 "\t bbbbbbbbbbbbb\n"
8762 "\t*/\n"
8763 "}",
8764 format("{\n"
8765 "/*\n"
8766 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8767 "*/\n"
8768 "}",
8769 Tab));
8770 EXPECT_EQ("{\n"
8771 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8772 "\t// bbbbbbbbbbbbb\n"
8773 "}",
8774 format("{\n"
8775 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8776 "}",
8777 Tab));
8778 EXPECT_EQ("{\n"
8779 "\t/*\n"
8780 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8781 "\t bbbbbbbbbbbbb\n"
8782 "\t*/\n"
8783 "}",
8784 format("{\n"
8785 "\t/*\n"
8786 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8787 "\t*/\n"
8788 "}",
8789 Tab));
8790 EXPECT_EQ("{\n"
8791 "\t/*\n"
8792 "\n"
8793 "\t*/\n"
8794 "}",
8795 format("{\n"
8796 "\t/*\n"
8797 "\n"
8798 "\t*/\n"
8799 "}",
8800 Tab));
8801 EXPECT_EQ("{\n"
8802 "\t/*\n"
8803 " asdf\n"
8804 "\t*/\n"
8805 "}",
8806 format("{\n"
8807 "\t/*\n"
8808 " asdf\n"
8809 "\t*/\n"
8810 "}",
8811 Tab));
8812 EXPECT_EQ("/*\n"
8813 "\t a\t\tcomment\n"
8814 "\t in multiple lines\n"
8815 " */",
8816 format(" /*\t \t \n"
8817 " \t \t a\t\tcomment\t \t\n"
8818 " \t \t in multiple lines\t\n"
8819 " \t */",
8820 Tab));
8821 EXPECT_EQ("/* some\n"
8822 " comment */",
8823 format(" \t \t /* some\n"
8824 " \t \t comment */",
8825 Tab));
8826 EXPECT_EQ("int a; /* some\n"
8827 " comment */",
8828 format(" \t \t int a; /* some\n"
8829 " \t \t comment */",
8830 Tab));
8831 EXPECT_EQ("int a; /* some\n"
8832 "comment */",
8833 format(" \t \t int\ta; /* some\n"
8834 " \t \t comment */",
8835 Tab));
8836 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8837 " comment */",
8838 format(" \t \t f(\"\t\t\"); /* some\n"
8839 " \t \t comment */",
8840 Tab));
8841 EXPECT_EQ("{\n"
8842 " /*\n"
8843 " * Comment\n"
8844 " */\n"
8845 " int i;\n"
8846 "}",
8847 format("{\n"
8848 "\t/*\n"
8849 "\t * Comment\n"
8850 "\t */\n"
8851 "\t int i;\n"
8852 "}"));
8853 Tab.AlignConsecutiveAssignments = true;
8854 Tab.AlignConsecutiveDeclarations = true;
8855 Tab.TabWidth = 4;
8856 Tab.IndentWidth = 4;
8857 verifyFormat("class Assign {\n"
8858 "\tvoid f() {\n"
8859 "\t\tint x = 123;\n"
8860 "\t\tint random = 4;\n"
8861 "\t\tstd::string alphabet =\n"
8862 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8863 "\t}\n"
8864 "};",
8865 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008866}
8867
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008868TEST_F(FormatTest, CalculatesOriginalColumn) {
8869 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8870 "q\"; /* some\n"
8871 " comment */",
8872 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8873 "q\"; /* some\n"
8874 " comment */",
8875 getLLVMStyle()));
8876 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8877 "/* some\n"
8878 " comment */",
8879 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8880 " /* some\n"
8881 " comment */",
8882 getLLVMStyle()));
8883 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8884 "qqq\n"
8885 "/* some\n"
8886 " comment */",
8887 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8888 "qqq\n"
8889 " /* some\n"
8890 " comment */",
8891 getLLVMStyle()));
8892 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8893 "wwww; /* some\n"
8894 " comment */",
8895 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8896 "wwww; /* some\n"
8897 " comment */",
8898 getLLVMStyle()));
8899}
8900
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008901TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008902 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008903 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008904
8905 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008906 " continue;",
8907 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008908 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008909 " continue;",
8910 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008911 verifyFormat("if(true)\n"
8912 " f();\n"
8913 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008914 " f();",
8915 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008916 verifyFormat("do {\n"
8917 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008918 "} while(something());",
8919 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008920 verifyFormat("switch(x) {\n"
8921 "default:\n"
8922 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008923 "}",
8924 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008925 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008926 verifyFormat("size_t x = sizeof(x);", NoSpace);
8927 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8928 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8929 verifyFormat("alignas(128) char a[128];", NoSpace);
8930 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8931 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8932 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008933 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008934 verifyFormat("T A::operator()();", NoSpace);
8935 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008936
8937 FormatStyle Space = getLLVMStyle();
8938 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8939
8940 verifyFormat("int f ();", Space);
8941 verifyFormat("void f (int a, T b) {\n"
8942 " while (true)\n"
8943 " continue;\n"
8944 "}",
8945 Space);
8946 verifyFormat("if (true)\n"
8947 " f ();\n"
8948 "else if (true)\n"
8949 " f ();",
8950 Space);
8951 verifyFormat("do {\n"
8952 " do_something ();\n"
8953 "} while (something ());",
8954 Space);
8955 verifyFormat("switch (x) {\n"
8956 "default:\n"
8957 " break;\n"
8958 "}",
8959 Space);
8960 verifyFormat("A::A () : a (1) {}", Space);
8961 verifyFormat("void f () __attribute__ ((asdf));", Space);
8962 verifyFormat("*(&a + 1);\n"
8963 "&((&a)[1]);\n"
8964 "a[(b + c) * d];\n"
8965 "(((a + 1) * 2) + 3) * 4;",
8966 Space);
8967 verifyFormat("#define A(x) x", Space);
8968 verifyFormat("#define A (x) x", Space);
8969 verifyFormat("#if defined(x)\n"
8970 "#endif",
8971 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008972 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008973 verifyFormat("size_t x = sizeof (x);", Space);
8974 verifyFormat("auto f (int x) -> decltype (x);", Space);
8975 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8976 verifyFormat("alignas (128) char a[128];", Space);
8977 verifyFormat("size_t x = alignof (MyType);", Space);
8978 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8979 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008980 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008981 verifyFormat("T A::operator() ();", Space);
8982 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008983}
8984
8985TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8986 FormatStyle Spaces = getLLVMStyle();
8987
8988 Spaces.SpacesInParentheses = true;
8989 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008990 verifyFormat("call();", Spaces);
8991 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008992 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8993 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008994 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008995 " continue;",
8996 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008997 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008998 " continue;",
8999 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009000 verifyFormat("if ( true )\n"
9001 " f();\n"
9002 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009003 " f();",
9004 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009005 verifyFormat("do {\n"
9006 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009007 "} while ( something() );",
9008 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009009 verifyFormat("switch ( x ) {\n"
9010 "default:\n"
9011 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009012 "}",
9013 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009014
9015 Spaces.SpacesInParentheses = false;
9016 Spaces.SpacesInCStyleCastParentheses = true;
9017 verifyFormat("Type *A = ( Type * )P;", Spaces);
9018 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9019 verifyFormat("x = ( int32 )y;", Spaces);
9020 verifyFormat("int a = ( int )(2.0f);", Spaces);
9021 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9022 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9023 verifyFormat("#define x (( int )-1)", Spaces);
9024
Daniel Jasper92e09822015-03-18 12:59:19 +00009025 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00009026 Spaces.SpacesInParentheses = false;
9027 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009028 Spaces.SpacesInCStyleCastParentheses = true;
9029 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009030 verifyFormat("call( );", Spaces);
9031 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009032 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009033 " continue;",
9034 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009035 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009036 " continue;",
9037 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009038 verifyFormat("if (true)\n"
9039 " f( );\n"
9040 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009041 " f( );",
9042 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009043 verifyFormat("do {\n"
9044 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009045 "} while (something( ));",
9046 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009047 verifyFormat("switch (x) {\n"
9048 "default:\n"
9049 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009050 "}",
9051 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009052
Daniel Jasper92e09822015-03-18 12:59:19 +00009053 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009054 Spaces.SpaceAfterCStyleCast = true;
9055 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009056 verifyFormat("call( );", Spaces);
9057 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009058 verifyFormat("while (( bool ) 1)\n"
9059 " continue;",
9060 Spaces);
9061 verifyFormat("for (;;)\n"
9062 " continue;",
9063 Spaces);
9064 verifyFormat("if (true)\n"
9065 " f( );\n"
9066 "else if (true)\n"
9067 " f( );",
9068 Spaces);
9069 verifyFormat("do {\n"
9070 " do_something(( int ) i);\n"
9071 "} while (something( ));",
9072 Spaces);
9073 verifyFormat("switch (x) {\n"
9074 "default:\n"
9075 " break;\n"
9076 "}",
9077 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009078
9079 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009080 Spaces.SpacesInCStyleCastParentheses = false;
9081 Spaces.SpaceAfterCStyleCast = true;
9082 verifyFormat("while ((bool) 1)\n"
9083 " continue;",
9084 Spaces);
9085 verifyFormat("do {\n"
9086 " do_something((int) i);\n"
9087 "} while (something( ));",
9088 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009089}
9090
Daniel Jasperad981f82014-08-26 11:41:14 +00009091TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9092 verifyFormat("int a[5];");
9093 verifyFormat("a[3] += 42;");
9094
9095 FormatStyle Spaces = getLLVMStyle();
9096 Spaces.SpacesInSquareBrackets = true;
9097 // Lambdas unchanged.
9098 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9099 verifyFormat("return [i, args...] {};", Spaces);
9100
9101 // Not lambdas.
9102 verifyFormat("int a[ 5 ];", Spaces);
9103 verifyFormat("a[ 3 ] += 42;", Spaces);
9104 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9105 verifyFormat("double &operator[](int i) { return 0; }\n"
9106 "int i;",
9107 Spaces);
9108 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9109 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9110 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9111}
9112
Daniel Jasperd94bff32013-09-25 15:15:02 +00009113TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9114 verifyFormat("int a = 5;");
9115 verifyFormat("a += 42;");
9116 verifyFormat("a or_eq 8;");
9117
9118 FormatStyle Spaces = getLLVMStyle();
9119 Spaces.SpaceBeforeAssignmentOperators = false;
9120 verifyFormat("int a= 5;", Spaces);
9121 verifyFormat("a+= 42;", Spaces);
9122 verifyFormat("a or_eq 8;", Spaces);
9123}
9124
Daniel Jaspera44991332015-04-29 13:06:49 +00009125TEST_F(FormatTest, AlignConsecutiveAssignments) {
9126 FormatStyle Alignment = getLLVMStyle();
9127 Alignment.AlignConsecutiveAssignments = false;
9128 verifyFormat("int a = 5;\n"
9129 "int oneTwoThree = 123;",
9130 Alignment);
9131 verifyFormat("int a = 5;\n"
9132 "int oneTwoThree = 123;",
9133 Alignment);
9134
9135 Alignment.AlignConsecutiveAssignments = true;
9136 verifyFormat("int a = 5;\n"
9137 "int oneTwoThree = 123;",
9138 Alignment);
9139 verifyFormat("int a = method();\n"
9140 "int oneTwoThree = 133;",
9141 Alignment);
9142 verifyFormat("a &= 5;\n"
9143 "bcd *= 5;\n"
9144 "ghtyf += 5;\n"
9145 "dvfvdb -= 5;\n"
9146 "a /= 5;\n"
9147 "vdsvsv %= 5;\n"
9148 "sfdbddfbdfbb ^= 5;\n"
9149 "dvsdsv |= 5;\n"
9150 "int dsvvdvsdvvv = 123;",
9151 Alignment);
9152 verifyFormat("int i = 1, j = 10;\n"
9153 "something = 2000;",
9154 Alignment);
9155 verifyFormat("something = 2000;\n"
9156 "int i = 1, j = 10;\n",
9157 Alignment);
9158 verifyFormat("something = 2000;\n"
9159 "another = 911;\n"
9160 "int i = 1, j = 10;\n"
9161 "oneMore = 1;\n"
9162 "i = 2;",
9163 Alignment);
9164 verifyFormat("int a = 5;\n"
9165 "int one = 1;\n"
9166 "method();\n"
9167 "int oneTwoThree = 123;\n"
9168 "int oneTwo = 12;",
9169 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009170 verifyFormat("int oneTwoThree = 123;\n"
9171 "int oneTwo = 12;\n"
9172 "method();\n",
9173 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009174 verifyFormat("int oneTwoThree = 123; // comment\n"
9175 "int oneTwo = 12; // comment",
9176 Alignment);
9177 EXPECT_EQ("int a = 5;\n"
9178 "\n"
9179 "int oneTwoThree = 123;",
9180 format("int a = 5;\n"
9181 "\n"
9182 "int oneTwoThree= 123;",
9183 Alignment));
9184 EXPECT_EQ("int a = 5;\n"
9185 "int one = 1;\n"
9186 "\n"
9187 "int oneTwoThree = 123;",
9188 format("int a = 5;\n"
9189 "int one = 1;\n"
9190 "\n"
9191 "int oneTwoThree = 123;",
9192 Alignment));
9193 EXPECT_EQ("int a = 5;\n"
9194 "int one = 1;\n"
9195 "\n"
9196 "int oneTwoThree = 123;\n"
9197 "int oneTwo = 12;",
9198 format("int a = 5;\n"
9199 "int one = 1;\n"
9200 "\n"
9201 "int oneTwoThree = 123;\n"
9202 "int oneTwo = 12;",
9203 Alignment));
9204 Alignment.AlignEscapedNewlinesLeft = true;
9205 verifyFormat("#define A \\\n"
9206 " int aaaa = 12; \\\n"
9207 " int b = 23; \\\n"
9208 " int ccc = 234; \\\n"
9209 " int dddddddddd = 2345;",
9210 Alignment);
9211 Alignment.AlignEscapedNewlinesLeft = false;
9212 verifyFormat("#define A "
9213 " \\\n"
9214 " int aaaa = 12; "
9215 " \\\n"
9216 " int b = 23; "
9217 " \\\n"
9218 " int ccc = 234; "
9219 " \\\n"
9220 " int dddddddddd = 2345;",
9221 Alignment);
9222 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9223 "k = 4, int l = 5,\n"
9224 " int m = 6) {\n"
9225 " int j = 10;\n"
9226 " otherThing = 1;\n"
9227 "}",
9228 Alignment);
9229 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9230 " int i = 1;\n"
9231 " int j = 2;\n"
9232 " int big = 10000;\n"
9233 "}",
9234 Alignment);
9235 verifyFormat("class C {\n"
9236 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009237 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009238 " virtual void f() = 0;\n"
9239 "};",
9240 Alignment);
9241 verifyFormat("int i = 1;\n"
9242 "if (SomeType t = getSomething()) {\n"
9243 "}\n"
9244 "int j = 2;\n"
9245 "int big = 10000;",
9246 Alignment);
9247 verifyFormat("int j = 7;\n"
9248 "for (int k = 0; k < N; ++k) {\n"
9249 "}\n"
9250 "int j = 2;\n"
9251 "int big = 10000;\n"
9252 "}",
9253 Alignment);
9254 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9255 verifyFormat("int i = 1;\n"
9256 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9257 " = someLooooooooooooooooongFunction();\n"
9258 "int j = 2;",
9259 Alignment);
9260 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9261 verifyFormat("int i = 1;\n"
9262 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9263 " someLooooooooooooooooongFunction();\n"
9264 "int j = 2;",
9265 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009266
9267 verifyFormat("auto lambda = []() {\n"
9268 " auto i = 0;\n"
9269 " return 0;\n"
9270 "};\n"
9271 "int i = 0;\n"
9272 "auto v = type{\n"
9273 " i = 1, //\n"
9274 " (i = 2), //\n"
9275 " i = 3 //\n"
9276 "};",
9277 Alignment);
9278
Daniel Jaspera44991332015-04-29 13:06:49 +00009279 // FIXME: Should align all three assignments
9280 verifyFormat(
9281 "int i = 1;\n"
9282 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9283 " loooooooooooooooooooooongParameterB);\n"
9284 "int j = 2;",
9285 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009286
9287 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9288 " typename B = very_long_type_name_1,\n"
9289 " typename T_2 = very_long_type_name_2>\n"
9290 "auto foo() {}\n",
9291 Alignment);
9292 verifyFormat("int a, b = 1;\n"
9293 "int c = 2;\n"
9294 "int dd = 3;\n",
9295 Alignment);
9296 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9297 "float b[1][] = {{3.f}};\n",
9298 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009299}
9300
Daniel Jaspere12597c2015-10-01 10:06:54 +00009301TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9302 FormatStyle Alignment = getLLVMStyle();
9303 Alignment.AlignConsecutiveDeclarations = false;
9304 verifyFormat("float const a = 5;\n"
9305 "int oneTwoThree = 123;",
9306 Alignment);
9307 verifyFormat("int a = 5;\n"
9308 "float const oneTwoThree = 123;",
9309 Alignment);
9310
9311 Alignment.AlignConsecutiveDeclarations = true;
9312 verifyFormat("float const a = 5;\n"
9313 "int oneTwoThree = 123;",
9314 Alignment);
9315 verifyFormat("int a = method();\n"
9316 "float const oneTwoThree = 133;",
9317 Alignment);
9318 verifyFormat("int i = 1, j = 10;\n"
9319 "something = 2000;",
9320 Alignment);
9321 verifyFormat("something = 2000;\n"
9322 "int i = 1, j = 10;\n",
9323 Alignment);
9324 verifyFormat("float something = 2000;\n"
9325 "double another = 911;\n"
9326 "int i = 1, j = 10;\n"
9327 "const int *oneMore = 1;\n"
9328 "unsigned i = 2;",
9329 Alignment);
9330 verifyFormat("float a = 5;\n"
9331 "int one = 1;\n"
9332 "method();\n"
9333 "const double oneTwoThree = 123;\n"
9334 "const unsigned int oneTwo = 12;",
9335 Alignment);
9336 verifyFormat("int oneTwoThree{0}; // comment\n"
9337 "unsigned oneTwo; // comment",
9338 Alignment);
9339 EXPECT_EQ("float const a = 5;\n"
9340 "\n"
9341 "int oneTwoThree = 123;",
9342 format("float const a = 5;\n"
9343 "\n"
9344 "int oneTwoThree= 123;",
9345 Alignment));
9346 EXPECT_EQ("float a = 5;\n"
9347 "int one = 1;\n"
9348 "\n"
9349 "unsigned oneTwoThree = 123;",
9350 format("float a = 5;\n"
9351 "int one = 1;\n"
9352 "\n"
9353 "unsigned oneTwoThree = 123;",
9354 Alignment));
9355 EXPECT_EQ("float a = 5;\n"
9356 "int one = 1;\n"
9357 "\n"
9358 "unsigned oneTwoThree = 123;\n"
9359 "int oneTwo = 12;",
9360 format("float a = 5;\n"
9361 "int one = 1;\n"
9362 "\n"
9363 "unsigned oneTwoThree = 123;\n"
9364 "int oneTwo = 12;",
9365 Alignment));
9366 Alignment.AlignConsecutiveAssignments = true;
9367 verifyFormat("float something = 2000;\n"
9368 "double another = 911;\n"
9369 "int i = 1, j = 10;\n"
9370 "const int *oneMore = 1;\n"
9371 "unsigned i = 2;",
9372 Alignment);
9373 verifyFormat("int oneTwoThree = {0}; // comment\n"
9374 "unsigned oneTwo = 0; // comment",
9375 Alignment);
9376 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9377 " int const i = 1;\n"
9378 " int * j = 2;\n"
9379 " int big = 10000;\n"
9380 "\n"
9381 " unsigned oneTwoThree = 123;\n"
9382 " int oneTwo = 12;\n"
9383 " method();\n"
9384 " float k = 2;\n"
9385 " int ll = 10000;\n"
9386 "}",
9387 format("void SomeFunction(int parameter= 0) {\n"
9388 " int const i= 1;\n"
9389 " int *j=2;\n"
9390 " int big = 10000;\n"
9391 "\n"
9392 "unsigned oneTwoThree =123;\n"
9393 "int oneTwo = 12;\n"
9394 " method();\n"
9395 "float k= 2;\n"
9396 "int ll=10000;\n"
9397 "}",
9398 Alignment));
9399 Alignment.AlignConsecutiveAssignments = false;
9400 Alignment.AlignEscapedNewlinesLeft = true;
9401 verifyFormat("#define A \\\n"
9402 " int aaaa = 12; \\\n"
9403 " float b = 23; \\\n"
9404 " const int ccc = 234; \\\n"
9405 " unsigned dddddddddd = 2345;",
9406 Alignment);
9407 Alignment.AlignEscapedNewlinesLeft = false;
9408 Alignment.ColumnLimit = 30;
9409 verifyFormat("#define A \\\n"
9410 " int aaaa = 12; \\\n"
9411 " float b = 23; \\\n"
9412 " const int ccc = 234; \\\n"
9413 " int dddddddddd = 2345;",
9414 Alignment);
9415 Alignment.ColumnLimit = 80;
9416 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9417 "k = 4, int l = 5,\n"
9418 " int m = 6) {\n"
9419 " const int j = 10;\n"
9420 " otherThing = 1;\n"
9421 "}",
9422 Alignment);
9423 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9424 " int const i = 1;\n"
9425 " int * j = 2;\n"
9426 " int big = 10000;\n"
9427 "}",
9428 Alignment);
9429 verifyFormat("class C {\n"
9430 "public:\n"
9431 " int i = 1;\n"
9432 " virtual void f() = 0;\n"
9433 "};",
9434 Alignment);
9435 verifyFormat("float i = 1;\n"
9436 "if (SomeType t = getSomething()) {\n"
9437 "}\n"
9438 "const unsigned j = 2;\n"
9439 "int big = 10000;",
9440 Alignment);
9441 verifyFormat("float j = 7;\n"
9442 "for (int k = 0; k < N; ++k) {\n"
9443 "}\n"
9444 "unsigned j = 2;\n"
9445 "int big = 10000;\n"
9446 "}",
9447 Alignment);
9448 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9449 verifyFormat("float i = 1;\n"
9450 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9451 " = someLooooooooooooooooongFunction();\n"
9452 "int j = 2;",
9453 Alignment);
9454 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9455 verifyFormat("int i = 1;\n"
9456 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9457 " someLooooooooooooooooongFunction();\n"
9458 "int j = 2;",
9459 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009460
9461 Alignment.AlignConsecutiveAssignments = true;
9462 verifyFormat("auto lambda = []() {\n"
9463 " auto ii = 0;\n"
9464 " float j = 0;\n"
9465 " return 0;\n"
9466 "};\n"
9467 "int i = 0;\n"
9468 "float i2 = 0;\n"
9469 "auto v = type{\n"
9470 " i = 1, //\n"
9471 " (i = 2), //\n"
9472 " i = 3 //\n"
9473 "};",
9474 Alignment);
9475 Alignment.AlignConsecutiveAssignments = false;
9476
Daniel Jaspere12597c2015-10-01 10:06:54 +00009477 // FIXME: Should align all three declarations
9478 verifyFormat(
9479 "int i = 1;\n"
9480 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9481 " loooooooooooooooooooooongParameterB);\n"
9482 "int j = 2;",
9483 Alignment);
9484
9485 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9486 // We expect declarations and assignments to align, as long as it doesn't
9487 // exceed the column limit, starting a new alignemnt sequence whenever it
9488 // happens.
9489 Alignment.AlignConsecutiveAssignments = true;
9490 Alignment.ColumnLimit = 30;
9491 verifyFormat("float ii = 1;\n"
9492 "unsigned j = 2;\n"
9493 "int someVerylongVariable = 1;\n"
9494 "AnotherLongType ll = 123456;\n"
9495 "VeryVeryLongType k = 2;\n"
9496 "int myvar = 1;",
9497 Alignment);
9498 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009499 Alignment.AlignConsecutiveAssignments = false;
9500
9501 verifyFormat(
9502 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9503 " typename LongType, typename B>\n"
9504 "auto foo() {}\n",
9505 Alignment);
9506 verifyFormat("float a, b = 1;\n"
9507 "int c = 2;\n"
9508 "int dd = 3;\n",
9509 Alignment);
9510 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9511 "float b[1][] = {{3.f}};\n",
9512 Alignment);
9513 Alignment.AlignConsecutiveAssignments = true;
9514 verifyFormat("float a, b = 1;\n"
9515 "int c = 2;\n"
9516 "int dd = 3;\n",
9517 Alignment);
9518 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9519 "float b[1][] = {{3.f}};\n",
9520 Alignment);
9521 Alignment.AlignConsecutiveAssignments = false;
9522
9523 Alignment.ColumnLimit = 30;
9524 Alignment.BinPackParameters = false;
9525 verifyFormat("void foo(float a,\n"
9526 " float b,\n"
9527 " int c,\n"
9528 " uint32_t *d) {\n"
9529 " int * e = 0;\n"
9530 " float f = 0;\n"
9531 " double g = 0;\n"
9532 "}\n"
9533 "void bar(ino_t a,\n"
9534 " int b,\n"
9535 " uint32_t *c,\n"
9536 " bool d) {}\n",
9537 Alignment);
9538 Alignment.BinPackParameters = true;
9539 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009540}
9541
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009542TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009543 FormatStyle LinuxBraceStyle = getLLVMStyle();
9544 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009545 verifyFormat("namespace a\n"
9546 "{\n"
9547 "class A\n"
9548 "{\n"
9549 " void f()\n"
9550 " {\n"
9551 " if (true) {\n"
9552 " a();\n"
9553 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009554 " } else {\n"
9555 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009556 " }\n"
9557 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009558 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009559 "};\n"
9560 "struct B {\n"
9561 " int x;\n"
9562 "};\n"
9563 "}\n",
9564 LinuxBraceStyle);
9565 verifyFormat("enum X {\n"
9566 " Y = 0,\n"
9567 "}\n",
9568 LinuxBraceStyle);
9569 verifyFormat("struct S {\n"
9570 " int Type;\n"
9571 " union {\n"
9572 " int x;\n"
9573 " double y;\n"
9574 " } Value;\n"
9575 " class C\n"
9576 " {\n"
9577 " MyFavoriteType Value;\n"
9578 " } Class;\n"
9579 "}\n",
9580 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009581}
9582
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009583TEST_F(FormatTest, MozillaBraceBreaking) {
9584 FormatStyle MozillaBraceStyle = getLLVMStyle();
9585 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9586 verifyFormat("namespace a {\n"
9587 "class A\n"
9588 "{\n"
9589 " void f()\n"
9590 " {\n"
9591 " if (true) {\n"
9592 " a();\n"
9593 " b();\n"
9594 " }\n"
9595 " }\n"
9596 " void g() { return; }\n"
9597 "};\n"
9598 "enum E\n"
9599 "{\n"
9600 " A,\n"
9601 " // foo\n"
9602 " B,\n"
9603 " C\n"
9604 "};\n"
9605 "struct B\n"
9606 "{\n"
9607 " int x;\n"
9608 "};\n"
9609 "}\n",
9610 MozillaBraceStyle);
9611 verifyFormat("struct S\n"
9612 "{\n"
9613 " int Type;\n"
9614 " union\n"
9615 " {\n"
9616 " int x;\n"
9617 " double y;\n"
9618 " } Value;\n"
9619 " class C\n"
9620 " {\n"
9621 " MyFavoriteType Value;\n"
9622 " } Class;\n"
9623 "}\n",
9624 MozillaBraceStyle);
9625}
9626
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009627TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009628 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9629 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009630 verifyFormat("namespace a {\n"
9631 "class A {\n"
9632 " void f()\n"
9633 " {\n"
9634 " if (true) {\n"
9635 " a();\n"
9636 " b();\n"
9637 " }\n"
9638 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009639 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009640 "};\n"
9641 "struct B {\n"
9642 " int x;\n"
9643 "};\n"
9644 "}\n",
9645 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009646
Daniel Jasperd9670872014-08-05 12:06:20 +00009647 verifyFormat("void foo()\n"
9648 "{\n"
9649 " if (a) {\n"
9650 " a();\n"
9651 " }\n"
9652 " else {\n"
9653 " b();\n"
9654 " }\n"
9655 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009656 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009657
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009658 verifyFormat("#ifdef _DEBUG\n"
9659 "int foo(int i = 0)\n"
9660 "#else\n"
9661 "int foo(int i = 5)\n"
9662 "#endif\n"
9663 "{\n"
9664 " return i;\n"
9665 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009666 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009667
9668 verifyFormat("void foo() {}\n"
9669 "void bar()\n"
9670 "#ifdef _DEBUG\n"
9671 "{\n"
9672 " foo();\n"
9673 "}\n"
9674 "#else\n"
9675 "{\n"
9676 "}\n"
9677 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009678 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009679
9680 verifyFormat("void foobar() { int i = 5; }\n"
9681 "#ifdef _DEBUG\n"
9682 "void bar() {}\n"
9683 "#else\n"
9684 "void bar() { foobar(); }\n"
9685 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009686 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009687}
9688
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009689TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009690 FormatStyle AllmanBraceStyle = getLLVMStyle();
9691 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009692 verifyFormat("namespace a\n"
9693 "{\n"
9694 "class A\n"
9695 "{\n"
9696 " void f()\n"
9697 " {\n"
9698 " if (true)\n"
9699 " {\n"
9700 " a();\n"
9701 " b();\n"
9702 " }\n"
9703 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009704 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009705 "};\n"
9706 "struct B\n"
9707 "{\n"
9708 " int x;\n"
9709 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009710 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009711 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009712
9713 verifyFormat("void f()\n"
9714 "{\n"
9715 " if (true)\n"
9716 " {\n"
9717 " a();\n"
9718 " }\n"
9719 " else if (false)\n"
9720 " {\n"
9721 " b();\n"
9722 " }\n"
9723 " else\n"
9724 " {\n"
9725 " c();\n"
9726 " }\n"
9727 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009728 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009729
9730 verifyFormat("void f()\n"
9731 "{\n"
9732 " for (int i = 0; i < 10; ++i)\n"
9733 " {\n"
9734 " a();\n"
9735 " }\n"
9736 " while (false)\n"
9737 " {\n"
9738 " b();\n"
9739 " }\n"
9740 " do\n"
9741 " {\n"
9742 " c();\n"
9743 " } while (false)\n"
9744 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009745 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009746
9747 verifyFormat("void f(int a)\n"
9748 "{\n"
9749 " switch (a)\n"
9750 " {\n"
9751 " case 0:\n"
9752 " break;\n"
9753 " case 1:\n"
9754 " {\n"
9755 " break;\n"
9756 " }\n"
9757 " case 2:\n"
9758 " {\n"
9759 " }\n"
9760 " break;\n"
9761 " default:\n"
9762 " break;\n"
9763 " }\n"
9764 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009765 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009766
9767 verifyFormat("enum X\n"
9768 "{\n"
9769 " Y = 0,\n"
9770 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009771 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009772 verifyFormat("enum X\n"
9773 "{\n"
9774 " Y = 0\n"
9775 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009776 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009777
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009778 verifyFormat("@interface BSApplicationController ()\n"
9779 "{\n"
9780 "@private\n"
9781 " id _extraIvar;\n"
9782 "}\n"
9783 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009784 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009785
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009786 verifyFormat("#ifdef _DEBUG\n"
9787 "int foo(int i = 0)\n"
9788 "#else\n"
9789 "int foo(int i = 5)\n"
9790 "#endif\n"
9791 "{\n"
9792 " return i;\n"
9793 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009794 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009795
9796 verifyFormat("void foo() {}\n"
9797 "void bar()\n"
9798 "#ifdef _DEBUG\n"
9799 "{\n"
9800 " foo();\n"
9801 "}\n"
9802 "#else\n"
9803 "{\n"
9804 "}\n"
9805 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009806 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009807
9808 verifyFormat("void foobar() { int i = 5; }\n"
9809 "#ifdef _DEBUG\n"
9810 "void bar() {}\n"
9811 "#else\n"
9812 "void bar() { foobar(); }\n"
9813 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009814 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009815
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009816 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009817 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009818 " // ...\n"
9819 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009820 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009821 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009822 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009823 " // ...\n"
9824 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009825 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009826 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009827 // .. or dict literals.
9828 verifyFormat("void f()\n"
9829 "{\n"
9830 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9831 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009832 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009833 verifyFormat("int f()\n"
9834 "{ // comment\n"
9835 " return 42;\n"
9836 "}",
9837 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009838
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009839 AllmanBraceStyle.ColumnLimit = 19;
9840 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9841 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009842 verifyFormat("void f()\n"
9843 "{\n"
9844 " int i;\n"
9845 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009846 AllmanBraceStyle);
9847 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009848
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009849 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009850 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9851 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9852 verifyFormat("void f(bool b)\n"
9853 "{\n"
9854 " if (b)\n"
9855 " {\n"
9856 " return;\n"
9857 " }\n"
9858 "}\n",
9859 BreakBeforeBraceShortIfs);
9860 verifyFormat("void f(bool b)\n"
9861 "{\n"
9862 " if (b) return;\n"
9863 "}\n",
9864 BreakBeforeBraceShortIfs);
9865 verifyFormat("void f(bool b)\n"
9866 "{\n"
9867 " while (b)\n"
9868 " {\n"
9869 " return;\n"
9870 " }\n"
9871 "}\n",
9872 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009873}
9874
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009875TEST_F(FormatTest, GNUBraceBreaking) {
9876 FormatStyle GNUBraceStyle = getLLVMStyle();
9877 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9878 verifyFormat("namespace a\n"
9879 "{\n"
9880 "class A\n"
9881 "{\n"
9882 " void f()\n"
9883 " {\n"
9884 " int a;\n"
9885 " {\n"
9886 " int b;\n"
9887 " }\n"
9888 " if (true)\n"
9889 " {\n"
9890 " a();\n"
9891 " b();\n"
9892 " }\n"
9893 " }\n"
9894 " void g() { return; }\n"
9895 "}\n"
9896 "}",
9897 GNUBraceStyle);
9898
9899 verifyFormat("void f()\n"
9900 "{\n"
9901 " if (true)\n"
9902 " {\n"
9903 " a();\n"
9904 " }\n"
9905 " else if (false)\n"
9906 " {\n"
9907 " b();\n"
9908 " }\n"
9909 " else\n"
9910 " {\n"
9911 " c();\n"
9912 " }\n"
9913 "}\n",
9914 GNUBraceStyle);
9915
9916 verifyFormat("void f()\n"
9917 "{\n"
9918 " for (int i = 0; i < 10; ++i)\n"
9919 " {\n"
9920 " a();\n"
9921 " }\n"
9922 " while (false)\n"
9923 " {\n"
9924 " b();\n"
9925 " }\n"
9926 " do\n"
9927 " {\n"
9928 " c();\n"
9929 " }\n"
9930 " while (false);\n"
9931 "}\n",
9932 GNUBraceStyle);
9933
9934 verifyFormat("void f(int a)\n"
9935 "{\n"
9936 " switch (a)\n"
9937 " {\n"
9938 " case 0:\n"
9939 " break;\n"
9940 " case 1:\n"
9941 " {\n"
9942 " break;\n"
9943 " }\n"
9944 " case 2:\n"
9945 " {\n"
9946 " }\n"
9947 " break;\n"
9948 " default:\n"
9949 " break;\n"
9950 " }\n"
9951 "}\n",
9952 GNUBraceStyle);
9953
9954 verifyFormat("enum X\n"
9955 "{\n"
9956 " Y = 0,\n"
9957 "}\n",
9958 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009959
9960 verifyFormat("@interface BSApplicationController ()\n"
9961 "{\n"
9962 "@private\n"
9963 " id _extraIvar;\n"
9964 "}\n"
9965 "@end\n",
9966 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009967
9968 verifyFormat("#ifdef _DEBUG\n"
9969 "int foo(int i = 0)\n"
9970 "#else\n"
9971 "int foo(int i = 5)\n"
9972 "#endif\n"
9973 "{\n"
9974 " return i;\n"
9975 "}",
9976 GNUBraceStyle);
9977
9978 verifyFormat("void foo() {}\n"
9979 "void bar()\n"
9980 "#ifdef _DEBUG\n"
9981 "{\n"
9982 " foo();\n"
9983 "}\n"
9984 "#else\n"
9985 "{\n"
9986 "}\n"
9987 "#endif",
9988 GNUBraceStyle);
9989
9990 verifyFormat("void foobar() { int i = 5; }\n"
9991 "#ifdef _DEBUG\n"
9992 "void bar() {}\n"
9993 "#else\n"
9994 "void bar() { foobar(); }\n"
9995 "#endif",
9996 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009997}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009998
9999TEST_F(FormatTest, WebKitBraceBreaking) {
10000 FormatStyle WebKitBraceStyle = getLLVMStyle();
10001 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
10002 verifyFormat("namespace a {\n"
10003 "class A {\n"
10004 " void f()\n"
10005 " {\n"
10006 " if (true) {\n"
10007 " a();\n"
10008 " b();\n"
10009 " }\n"
10010 " }\n"
10011 " void g() { return; }\n"
10012 "};\n"
10013 "enum E {\n"
10014 " A,\n"
10015 " // foo\n"
10016 " B,\n"
10017 " C\n"
10018 "};\n"
10019 "struct B {\n"
10020 " int x;\n"
10021 "};\n"
10022 "}\n",
10023 WebKitBraceStyle);
10024 verifyFormat("struct S {\n"
10025 " int Type;\n"
10026 " union {\n"
10027 " int x;\n"
10028 " double y;\n"
10029 " } Value;\n"
10030 " class C {\n"
10031 " MyFavoriteType Value;\n"
10032 " } Class;\n"
10033 "};\n",
10034 WebKitBraceStyle);
10035}
10036
Manuel Klimekd5735502013-08-12 03:51:17 +000010037TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10038 verifyFormat("void f() {\n"
10039 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010040 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010041 " }\n"
10042 "}\n",
10043 getLLVMStyle());
10044}
10045
Daniel Jasper9613c812013-08-07 16:29:23 +000010046TEST_F(FormatTest, UnderstandsPragmas) {
10047 verifyFormat("#pragma omp reduction(| : var)");
10048 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010049
10050 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10051 "(including parentheses).",
10052 format("#pragma mark Any non-hyphenated or hyphenated string "
10053 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010054}
10055
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010056TEST_F(FormatTest, UnderstandPragmaOption) {
10057 verifyFormat("#pragma option -C -A");
10058
10059 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10060}
10061
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010062#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10063 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010064 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10065 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010066
10067TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010068 SmallVector<FormatStyle, 3> Styles;
10069 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010070
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010071 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010072 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10073 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10074 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010075
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010076 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010077 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10078 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10079 EXPECT_ALL_STYLES_EQUAL(Styles);
10080
Nico Weber514ecc82014-02-02 20:50:45 +000010081 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010082 EXPECT_TRUE(
10083 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10084 EXPECT_TRUE(
10085 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10086 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010087
Nico Weber514ecc82014-02-02 20:50:45 +000010088 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010089 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10090 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10091 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010092
10093 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010094 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10095 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10096 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010097
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010098 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010099 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10100 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10101 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010102
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010103 Styles[0] = getGNUStyle();
10104 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10105 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10106 EXPECT_ALL_STYLES_EQUAL(Styles);
10107
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010108 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10109}
10110
10111TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10112 SmallVector<FormatStyle, 8> Styles;
10113 Styles.resize(2);
10114
10115 Styles[0] = getGoogleStyle();
10116 Styles[1] = getLLVMStyle();
10117 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10118 EXPECT_ALL_STYLES_EQUAL(Styles);
10119
10120 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010121 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010122 Styles[1] = getLLVMStyle();
10123 Styles[1].Language = FormatStyle::LK_JavaScript;
10124 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10125
10126 Styles[2] = getLLVMStyle();
10127 Styles[2].Language = FormatStyle::LK_JavaScript;
10128 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10129 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010130 &Styles[2])
10131 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010132
10133 Styles[3] = getLLVMStyle();
10134 Styles[3].Language = FormatStyle::LK_JavaScript;
10135 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10136 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010137 &Styles[3])
10138 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010139
10140 Styles[4] = getLLVMStyle();
10141 Styles[4].Language = FormatStyle::LK_JavaScript;
10142 EXPECT_EQ(0, parseConfiguration("---\n"
10143 "BasedOnStyle: LLVM\n"
10144 "IndentWidth: 123\n"
10145 "---\n"
10146 "BasedOnStyle: Google\n"
10147 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010148 &Styles[4])
10149 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010150 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010151}
10152
Daniel Jasper91881d92014-09-29 08:07:46 +000010153#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010154 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010155 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010156 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010157 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010158 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010159
Daniel Jasper91881d92014-09-29 08:07:46 +000010160#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10161
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010162#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10163 Style.STRUCT.FIELD = false; \
10164 EXPECT_EQ(0, \
10165 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10166 .value()); \
10167 EXPECT_TRUE(Style.STRUCT.FIELD); \
10168 EXPECT_EQ(0, \
10169 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10170 .value()); \
10171 EXPECT_FALSE(Style.STRUCT.FIELD);
10172
10173#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10174 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10175
Daniel Jasper00853002014-09-16 16:22:30 +000010176#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10177 EXPECT_NE(VALUE, Style.FIELD); \
10178 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10179 EXPECT_EQ(VALUE, Style.FIELD)
10180
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010181TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010182 FormatStyle Style = {};
10183 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010184 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +000010185 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010186 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010187 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010188 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010189 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010190 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010191 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010192 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010193 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010194 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010195 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010196 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010197 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010198 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +000010199 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010200 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010201 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010202 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010203 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010204 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010205 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010206 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010207 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010208 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010209 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010210 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010211 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010212 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010213 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010214 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010215 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010216 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010217 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010218 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010219 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010220 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010221 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010222
10223 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10224 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10225 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10226 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10227 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10228 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10229 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10230 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
10231 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10232 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10233 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010234}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010235
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010236#undef CHECK_PARSE_BOOL
10237
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010238TEST_F(FormatTest, ParsesConfiguration) {
10239 FormatStyle Style = {};
10240 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010241 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010242 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10243 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010244 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010245 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10246 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010247 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10248 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010249 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10250 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10251 PenaltyReturnTypeOnItsOwnLine, 1234u);
10252 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10253 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010254 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010255 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010256 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010257
Daniel Jasper553d4872014-06-17 12:40:34 +000010258 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010259 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10260 FormatStyle::PAS_Left);
10261 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10262 FormatStyle::PAS_Right);
10263 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10264 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010265 // For backward compatibility:
10266 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10267 FormatStyle::PAS_Left);
10268 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10269 FormatStyle::PAS_Right);
10270 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10271 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010272
Alexander Kornienkod6538332013-05-07 15:32:14 +000010273 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010274 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10275 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010276 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10277 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10278 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10279
Daniel Jasperac043c92014-09-15 11:11:00 +000010280 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010281 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10282 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010283 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10284 FormatStyle::BOS_None);
10285 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10286 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010287 // For backward compatibility:
10288 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10289 FormatStyle::BOS_None);
10290 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10291 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010292
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010293 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10294 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10295 FormatStyle::BAS_Align);
10296 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10297 FormatStyle::BAS_DontAlign);
10298 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10299 FormatStyle::BAS_AlwaysBreak);
10300 // For backward compatibility:
10301 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10302 FormatStyle::BAS_DontAlign);
10303 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10304 FormatStyle::BAS_Align);
10305
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010306 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010307 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10308 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10309 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010310 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10311 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010312 // For backward compatibility:
10313 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10314 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010315
Daniel Jasperd74cf402014-04-08 12:46:38 +000010316 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010317 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10318 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10319 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10320 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010321 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10322 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010323 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10324 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010325 // For backward compatibility:
10326 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10327 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10328 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10329 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010330
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010331 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10332 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10333 FormatStyle::SBPO_Never);
10334 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10335 FormatStyle::SBPO_Always);
10336 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10337 FormatStyle::SBPO_ControlStatements);
10338 // For backward compatibility:
10339 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10340 FormatStyle::SBPO_Never);
10341 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10342 FormatStyle::SBPO_ControlStatements);
10343
Alexander Kornienkod6538332013-05-07 15:32:14 +000010344 Style.ColumnLimit = 123;
10345 FormatStyle BaseStyle = getLLVMStyle();
10346 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10347 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10348
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010349 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10350 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10351 FormatStyle::BS_Attach);
10352 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10353 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010354 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10355 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010356 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10357 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010358 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10359 FormatStyle::BS_Allman);
10360 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010361 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10362 FormatStyle::BS_WebKit);
10363 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10364 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010365
Zachary Turner448592e2015-12-18 22:20:15 +000010366 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10367 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10368 FormatStyle::RTBS_None);
10369 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10370 FormatStyle::RTBS_All);
10371 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010372 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010373 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10374 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10375 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10376 AlwaysBreakAfterReturnType,
10377 FormatStyle::RTBS_TopLevelDefinitions);
10378
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010379 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10380 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10381 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10382 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10383 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10384 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10385 AlwaysBreakAfterDefinitionReturnType,
10386 FormatStyle::DRTBS_TopLevel);
10387
Daniel Jasper65ee3472013-07-31 23:16:02 +000010388 Style.NamespaceIndentation = FormatStyle::NI_All;
10389 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10390 FormatStyle::NI_None);
10391 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10392 FormatStyle::NI_Inner);
10393 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10394 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010395
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010396 // FIXME: This is required because parsing a configuration simply overwrites
10397 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010398 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010399 std::vector<std::string> BoostForeach;
10400 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010401 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010402 std::vector<std::string> BoostAndQForeach;
10403 BoostAndQForeach.push_back("BOOST_FOREACH");
10404 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010405 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10406 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010407
10408 Style.IncludeCategories.clear();
10409 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10410 {".*", 1}};
10411 CHECK_PARSE("IncludeCategories:\n"
10412 " - Regex: abc/.*\n"
10413 " Priority: 2\n"
10414 " - Regex: .*\n"
10415 " Priority: 1",
10416 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010417 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010418}
10419
10420TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10421 FormatStyle Style = {};
10422 Style.Language = FormatStyle::LK_Cpp;
10423 CHECK_PARSE("Language: Cpp\n"
10424 "IndentWidth: 12",
10425 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010426 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10427 "IndentWidth: 34",
10428 &Style),
10429 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010430 EXPECT_EQ(12u, Style.IndentWidth);
10431 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10432 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10433
10434 Style.Language = FormatStyle::LK_JavaScript;
10435 CHECK_PARSE("Language: JavaScript\n"
10436 "IndentWidth: 12",
10437 IndentWidth, 12u);
10438 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010439 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10440 "IndentWidth: 34",
10441 &Style),
10442 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010443 EXPECT_EQ(23u, Style.IndentWidth);
10444 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10445 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10446
10447 CHECK_PARSE("BasedOnStyle: LLVM\n"
10448 "IndentWidth: 67",
10449 IndentWidth, 67u);
10450
10451 CHECK_PARSE("---\n"
10452 "Language: JavaScript\n"
10453 "IndentWidth: 12\n"
10454 "---\n"
10455 "Language: Cpp\n"
10456 "IndentWidth: 34\n"
10457 "...\n",
10458 IndentWidth, 12u);
10459
10460 Style.Language = FormatStyle::LK_Cpp;
10461 CHECK_PARSE("---\n"
10462 "Language: JavaScript\n"
10463 "IndentWidth: 12\n"
10464 "---\n"
10465 "Language: Cpp\n"
10466 "IndentWidth: 34\n"
10467 "...\n",
10468 IndentWidth, 34u);
10469 CHECK_PARSE("---\n"
10470 "IndentWidth: 78\n"
10471 "---\n"
10472 "Language: JavaScript\n"
10473 "IndentWidth: 56\n"
10474 "...\n",
10475 IndentWidth, 78u);
10476
10477 Style.ColumnLimit = 123;
10478 Style.IndentWidth = 234;
10479 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10480 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010481 EXPECT_FALSE(parseConfiguration("---\n"
10482 "IndentWidth: 456\n"
10483 "BreakBeforeBraces: Allman\n"
10484 "---\n"
10485 "Language: JavaScript\n"
10486 "IndentWidth: 111\n"
10487 "TabWidth: 111\n"
10488 "---\n"
10489 "Language: Cpp\n"
10490 "BreakBeforeBraces: Stroustrup\n"
10491 "TabWidth: 789\n"
10492 "...\n",
10493 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010494 EXPECT_EQ(123u, Style.ColumnLimit);
10495 EXPECT_EQ(456u, Style.IndentWidth);
10496 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10497 EXPECT_EQ(789u, Style.TabWidth);
10498
Rafael Espindola1f243172014-06-12 11:35:17 +000010499 EXPECT_EQ(parseConfiguration("---\n"
10500 "Language: JavaScript\n"
10501 "IndentWidth: 56\n"
10502 "---\n"
10503 "IndentWidth: 78\n"
10504 "...\n",
10505 &Style),
10506 ParseError::Error);
10507 EXPECT_EQ(parseConfiguration("---\n"
10508 "Language: JavaScript\n"
10509 "IndentWidth: 56\n"
10510 "---\n"
10511 "Language: JavaScript\n"
10512 "IndentWidth: 78\n"
10513 "...\n",
10514 &Style),
10515 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010516
10517 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10518}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010519
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010520#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010521
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010522TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10523 FormatStyle Style = {};
10524 Style.Language = FormatStyle::LK_JavaScript;
10525 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010526 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010527 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010528
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010529 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010530 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010531 "BasedOnStyle: Google\n"
10532 "---\n"
10533 "Language: JavaScript\n"
10534 "IndentWidth: 76\n"
10535 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010536 &Style)
10537 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010538 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010539 EXPECT_EQ(76u, Style.IndentWidth);
10540 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10541}
10542
Alexander Kornienkod6538332013-05-07 15:32:14 +000010543TEST_F(FormatTest, ConfigurationRoundTripTest) {
10544 FormatStyle Style = getLLVMStyle();
10545 std::string YAML = configurationAsText(Style);
10546 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010547 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010548 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10549 EXPECT_EQ(Style, ParsedStyle);
10550}
10551
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010552TEST_F(FormatTest, WorksFor8bitEncodings) {
10553 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10554 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10555 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10556 "\"\xef\xee\xf0\xf3...\"",
10557 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10558 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10559 "\xef\xee\xf0\xf3...\"",
10560 getLLVMStyleWithColumns(12)));
10561}
10562
Alexander Kornienko393e3082013-11-13 14:04:17 +000010563TEST_F(FormatTest, HandlesUTF8BOM) {
10564 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10565 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10566 format("\xef\xbb\xbf#include <iostream>"));
10567 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10568 format("\xef\xbb\xbf\n#include <iostream>"));
10569}
10570
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010571// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10572#if !defined(_MSC_VER)
10573
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010574TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10575 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10576 getLLVMStyleWithColumns(35));
10577 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010578 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010579 verifyFormat("// Однажды в студёную зимнюю пору...",
10580 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010581 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010582 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10583 getLLVMStyleWithColumns(39));
10584 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010585 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010586}
10587
10588TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010589 // Non-printable characters' width is currently considered to be the length in
10590 // bytes in UTF8. The characters can be displayed in very different manner
10591 // (zero-width, single width with a substitution glyph, expanded to their code
10592 // (e.g. "<8d>"), so there's no single correct way to handle them.
10593 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010594 "\"\xc2\x8d\";",
10595 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010596 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010597 "\"\xc2\x8d\";",
10598 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010599 EXPECT_EQ("\"Однажды, в \"\n"
10600 "\"студёную \"\n"
10601 "\"зимнюю \"\n"
10602 "\"пору,\"",
10603 format("\"Однажды, в студёную зимнюю пору,\"",
10604 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010605 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010606 "\"一 二 三 \"\n"
10607 "\"四 五六 \"\n"
10608 "\"七 八 九 \"\n"
10609 "\"十\"",
10610 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010611 EXPECT_EQ("\"一\t二 \"\n"
10612 "\"\t三 \"\n"
10613 "\"四 五\t六 \"\n"
10614 "\"\t七 \"\n"
10615 "\"八九十\tqq\"",
10616 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10617 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010618
10619 // UTF8 character in an escape sequence.
10620 EXPECT_EQ("\"aaaaaa\"\n"
10621 "\"\\\xC2\x8D\"",
10622 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010623}
10624
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010625TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10626 EXPECT_EQ("const char *sssss =\n"
10627 " \"一二三四五六七八\\\n"
10628 " 九 十\";",
10629 format("const char *sssss = \"一二三四五六七八\\\n"
10630 " 九 十\";",
10631 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010632}
10633
10634TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010635 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10636 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010637 EXPECT_EQ("// Я из лесу\n"
10638 "// вышел; был\n"
10639 "// сильный\n"
10640 "// мороз.",
10641 format("// Я из лесу вышел; был сильный мороз.",
10642 getLLVMStyleWithColumns(13)));
10643 EXPECT_EQ("// 一二三\n"
10644 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010645 "// 八 九\n"
10646 "// 十",
10647 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010648}
10649
10650TEST_F(FormatTest, SplitsUTF8BlockComments) {
10651 EXPECT_EQ("/* Гляжу,\n"
10652 " * поднимается\n"
10653 " * медленно в\n"
10654 " * гору\n"
10655 " * Лошадка,\n"
10656 " * везущая\n"
10657 " * хворосту\n"
10658 " * воз. */",
10659 format("/* Гляжу, поднимается медленно в гору\n"
10660 " * Лошадка, везущая хворосту воз. */",
10661 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010662 EXPECT_EQ(
10663 "/* 一二三\n"
10664 " * 四五六七\n"
10665 " * 八 九\n"
10666 " * 十 */",
10667 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010668 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10669 " * 𝕓𝕪𝕥𝕖\n"
10670 " * 𝖀𝕿𝕱-𝟠 */",
10671 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010672}
10673
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010674#endif // _MSC_VER
10675
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010676TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10677 FormatStyle Style = getLLVMStyle();
10678
10679 Style.ConstructorInitializerIndentWidth = 4;
10680 verifyFormat(
10681 "SomeClass::Constructor()\n"
10682 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10683 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10684 Style);
10685
10686 Style.ConstructorInitializerIndentWidth = 2;
10687 verifyFormat(
10688 "SomeClass::Constructor()\n"
10689 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10690 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10691 Style);
10692
10693 Style.ConstructorInitializerIndentWidth = 0;
10694 verifyFormat(
10695 "SomeClass::Constructor()\n"
10696 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10697 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10698 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010699 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10700 verifyFormat(
10701 "SomeLongTemplateVariableName<\n"
10702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10703 Style);
10704 verifyFormat(
10705 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10706 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10707 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010708}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010709
Daniel Jasper00853002014-09-16 16:22:30 +000010710TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10711 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010712 Style.BreakConstructorInitializersBeforeComma = true;
10713 Style.ConstructorInitializerIndentWidth = 4;
10714 verifyFormat("SomeClass::Constructor()\n"
10715 " : a(a)\n"
10716 " , b(b)\n"
10717 " , c(c) {}",
10718 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010719 verifyFormat("SomeClass::Constructor()\n"
10720 " : a(a) {}",
10721 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010722
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010723 Style.ColumnLimit = 0;
10724 verifyFormat("SomeClass::Constructor()\n"
10725 " : a(a) {}",
10726 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010727 verifyFormat("SomeClass::Constructor() noexcept\n"
10728 " : a(a) {}",
10729 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010730 verifyFormat("SomeClass::Constructor()\n"
10731 " : a(a)\n"
10732 " , b(b)\n"
10733 " , c(c) {}",
10734 Style);
10735 verifyFormat("SomeClass::Constructor()\n"
10736 " : a(a) {\n"
10737 " foo();\n"
10738 " bar();\n"
10739 "}",
10740 Style);
10741
Daniel Jasperd74cf402014-04-08 12:46:38 +000010742 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010743 verifyFormat("SomeClass::Constructor()\n"
10744 " : a(a)\n"
10745 " , b(b)\n"
10746 " , c(c) {\n}",
10747 Style);
10748 verifyFormat("SomeClass::Constructor()\n"
10749 " : a(a) {\n}",
10750 Style);
10751
10752 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010753 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010754 Style.ConstructorInitializerIndentWidth = 2;
10755 verifyFormat("SomeClass::Constructor()\n"
10756 " : a(a)\n"
10757 " , b(b)\n"
10758 " , c(c) {}",
10759 Style);
10760
10761 Style.ConstructorInitializerIndentWidth = 0;
10762 verifyFormat("SomeClass::Constructor()\n"
10763 ": a(a)\n"
10764 ", b(b)\n"
10765 ", c(c) {}",
10766 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010767
10768 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10769 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010770 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10771 verifyFormat(
10772 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10773 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010774 verifyFormat(
10775 "SomeClass::Constructor()\n"
10776 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10777 Style);
10778 Style.ConstructorInitializerIndentWidth = 4;
10779 Style.ColumnLimit = 60;
10780 verifyFormat("SomeClass::Constructor()\n"
10781 " : aaaaaaaa(aaaaaaaa)\n"
10782 " , aaaaaaaa(aaaaaaaa)\n"
10783 " , aaaaaaaa(aaaaaaaa) {}",
10784 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010785}
10786
Daniel Jasper38efc132014-10-21 07:51:54 +000010787TEST_F(FormatTest, Destructors) {
10788 verifyFormat("void F(int &i) { i.~int(); }");
10789 verifyFormat("void F(int &i) { i->~int(); }");
10790}
10791
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010792TEST_F(FormatTest, FormatsWithWebKitStyle) {
10793 FormatStyle Style = getWebKitStyle();
10794
10795 // Don't indent in outer namespaces.
10796 verifyFormat("namespace outer {\n"
10797 "int i;\n"
10798 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010799 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010800 "} // namespace inner\n"
10801 "} // namespace outer\n"
10802 "namespace other_outer {\n"
10803 "int i;\n"
10804 "}",
10805 Style);
10806
10807 // Don't indent case labels.
10808 verifyFormat("switch (variable) {\n"
10809 "case 1:\n"
10810 "case 2:\n"
10811 " doSomething();\n"
10812 " break;\n"
10813 "default:\n"
10814 " ++variable;\n"
10815 "}",
10816 Style);
10817
10818 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010819 EXPECT_EQ("void f()\n"
10820 "{\n"
10821 " if (aaaaaaaaaaaaaaaa\n"
10822 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10823 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10824 " return;\n"
10825 "}",
10826 format("void f() {\n"
10827 "if (aaaaaaaaaaaaaaaa\n"
10828 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10829 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10830 "return;\n"
10831 "}",
10832 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010833
Daniel Jasper35995672014-04-29 14:05:20 +000010834 // Allow functions on a single line.
10835 verifyFormat("void f() { return; }", Style);
10836
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010837 // Constructor initializers are formatted one per line with the "," on the
10838 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010839 verifyFormat("Constructor()\n"
10840 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10841 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010842 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010843 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10844 "{\n"
10845 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010846 Style);
10847 verifyFormat("SomeClass::Constructor()\n"
10848 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010849 "{\n"
10850 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010851 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010852 EXPECT_EQ("SomeClass::Constructor()\n"
10853 " : a(a)\n"
10854 "{\n"
10855 "}",
10856 format("SomeClass::Constructor():a(a){}", Style));
10857 verifyFormat("SomeClass::Constructor()\n"
10858 " : a(a)\n"
10859 " , b(b)\n"
10860 " , c(c)\n"
10861 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010862 "}",
10863 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010864 verifyFormat("SomeClass::Constructor()\n"
10865 " : a(a)\n"
10866 "{\n"
10867 " foo();\n"
10868 " bar();\n"
10869 "}",
10870 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010871
Daniel Jasper65ee3472013-07-31 23:16:02 +000010872 // Access specifiers should be aligned left.
10873 verifyFormat("class C {\n"
10874 "public:\n"
10875 " int i;\n"
10876 "};",
10877 Style);
10878
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010879 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010880 verifyFormat("int a; // Do not\n"
10881 "double b; // align comments.",
10882 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010883
Daniel Jasper3219e432014-12-02 13:24:51 +000010884 // Do not align operands.
10885 EXPECT_EQ("ASSERT(aaaa\n"
10886 " || bbbb);",
10887 format("ASSERT ( aaaa\n||bbbb);", Style));
10888
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010889 // Accept input's line breaks.
10890 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10891 " || bbbbbbbbbbbbbbb) {\n"
10892 " i++;\n"
10893 "}",
10894 format("if (aaaaaaaaaaaaaaa\n"
10895 "|| bbbbbbbbbbbbbbb) { i++; }",
10896 Style));
10897 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10898 " i++;\n"
10899 "}",
10900 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010901
10902 // Don't automatically break all macro definitions (llvm.org/PR17842).
10903 verifyFormat("#define aNumber 10", Style);
10904 // However, generally keep the line breaks that the user authored.
10905 EXPECT_EQ("#define aNumber \\\n"
10906 " 10",
10907 format("#define aNumber \\\n"
10908 " 10",
10909 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010910
10911 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010912 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10913 " copyItems:YES];",
10914 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10915 "copyItems:YES];",
10916 Style));
10917 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10918 " copyItems:YES];",
10919 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10920 " copyItems:YES];",
10921 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010922 // FIXME: This does not seem right, there should be more indentation before
10923 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010924 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010925 " @\"a\",\n"
10926 " @\"a\"\n"
10927 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010928 " copyItems:YES];",
10929 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10930 " @\"a\",\n"
10931 " @\"a\"\n"
10932 " ]\n"
10933 " copyItems:YES];",
10934 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010935 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010936 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10937 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010938 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10939 " copyItems:YES];",
10940 Style));
10941
10942 verifyFormat("[self.a b:c c:d];", Style);
10943 EXPECT_EQ("[self.a b:c\n"
10944 " c:d];",
10945 format("[self.a b:c\n"
10946 "c:d];",
10947 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010948}
10949
Manuel Klimekffdeb592013-09-03 15:10:01 +000010950TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010951 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10952 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10953 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10954 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10955 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010956 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010957 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010958 verifyFormat("void f() {\n"
10959 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10960 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010961 verifyFormat("void f() {\n"
10962 " other(x.begin(), //\n"
10963 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010964 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010965 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010966 verifyFormat("SomeFunction([]() { // A cool function...\n"
10967 " return 43;\n"
10968 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010969 EXPECT_EQ("SomeFunction([]() {\n"
10970 "#define A a\n"
10971 " return 43;\n"
10972 "});",
10973 format("SomeFunction([](){\n"
10974 "#define A a\n"
10975 "return 43;\n"
10976 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010977 verifyFormat("void f() {\n"
10978 " SomeFunction([](decltype(x), A *a) {});\n"
10979 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010980 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10981 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010982 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10983 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10984 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010985 verifyFormat("Constructor()\n"
10986 " : Field([] { // comment\n"
10987 " int i;\n"
10988 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010989 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10990 " return some_parameter.size();\n"
10991 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010992 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10993 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010994 verifyFormat("int i = aaaaaa ? 1 //\n"
10995 " : [] {\n"
10996 " return 2; //\n"
10997 " }();");
10998 verifyFormat("llvm::errs() << \"number of twos is \"\n"
10999 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11000 " return x == 2; // force break\n"
11001 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011002 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
11003 " int iiiiiiiiiiii) {\n"
11004 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
11005 "});",
11006 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011007 verifyFormat("SomeFunction({[&] {\n"
11008 " // comment\n"
11009 " },\n"
11010 " [&] {\n"
11011 " // comment\n"
11012 " }});");
11013 verifyFormat("SomeFunction({[&] {\n"
11014 " // comment\n"
11015 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011016 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11017 " [&]() { return true; },\n"
11018 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011019
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011020 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011021 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011022 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011023 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11024 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011025 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011026 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011027 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11028 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011029 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011030 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11031 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011032 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011033 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011034 verifyFormat(
11035 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11036 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11037 " return aaaaaaaaaaaaaaaaa;\n"
11038 " });",
11039 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011040 verifyFormat("[]() //\n"
11041 " -> int {\n"
11042 " return 1; //\n"
11043 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011044
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011045 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011046 verifyFormat("SomeFunction(\n"
11047 " []() {\n"
11048 " int i = 42;\n"
11049 " return i;\n"
11050 " },\n"
11051 " []() {\n"
11052 " int j = 43;\n"
11053 " return j;\n"
11054 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011055
Daniel Jasperda18fd82014-06-10 06:39:03 +000011056 // More complex introducers.
11057 verifyFormat("return [i, args...] {};");
11058
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011059 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011060 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011061 verifyFormat("double &operator[](int i) { return 0; }\n"
11062 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011063 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011064 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011065 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011066
11067 // Other corner cases.
11068 verifyFormat("void f() {\n"
11069 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
11070 " );\n"
11071 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011072
11073 // Lambdas created through weird macros.
11074 verifyFormat("void f() {\n"
11075 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011076 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011077 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011078
11079 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11080 " doo_dah();\n"
11081 " doo_dah();\n"
11082 " })) {\n"
11083 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011084 verifyFormat("auto lambda = []() {\n"
11085 " int a = 2\n"
11086 "#if A\n"
11087 " + 2\n"
11088 "#endif\n"
11089 " ;\n"
11090 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011091}
11092
Manuel Klimek516e0542013-09-04 13:25:30 +000011093TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011094 FormatStyle ShortBlocks = getLLVMStyle();
11095 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11096 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11097 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11098 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11099 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11100 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11101 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011102
Daniel Jasper76284682014-10-22 09:12:44 +000011103 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11104 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11105 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011106
Daniel Jasper76284682014-10-22 09:12:44 +000011107 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011108 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011109 "}];");
11110 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011111 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011112 "}]};");
11113 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011114 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011115 "}];");
11116 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011117 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011118 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011119 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011120 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011121 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011122 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011123 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011124
11125 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011126 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011127 "}];",
11128 getLLVMStyleWithColumns(60));
11129 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011130 " NSString *path = [self sessionFilePath];\n"
11131 " if (path) {\n"
11132 " // ...\n"
11133 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011134 "});");
11135 verifyFormat("[[SessionService sharedService]\n"
11136 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011137 " if (window) {\n"
11138 " [self windowDidLoad:window];\n"
11139 " } else {\n"
11140 " [self errorLoadingWindow];\n"
11141 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011142 " }];");
11143 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011144 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011145 "};\n",
11146 getLLVMStyleWithColumns(40));
11147 verifyFormat("[[SessionService sharedService]\n"
11148 " loadWindowWithCompletionBlock: //\n"
11149 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011150 " if (window) {\n"
11151 " [self windowDidLoad:window];\n"
11152 " } else {\n"
11153 " [self errorLoadingWindow];\n"
11154 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011155 " }];",
11156 getLLVMStyleWithColumns(60));
11157 verifyFormat("[myObject doSomethingWith:arg1\n"
11158 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011159 " // ...\n"
11160 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011161 " }\n"
11162 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011163 " // ...\n"
11164 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011165 " }\n"
11166 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011167 " // ...\n"
11168 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011169 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011170 verifyFormat("[myObject doSomethingWith:arg1\n"
11171 " firstBlock:-1\n"
11172 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011173 " // ...\n"
11174 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011175 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011176
11177 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011178 " @autoreleasepool {\n"
11179 " if (a) {\n"
11180 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011181 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011182 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011183 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011184 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011185 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11186 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011187
11188 FormatStyle FourIndent = getLLVMStyle();
11189 FourIndent.ObjCBlockIndentWidth = 4;
11190 verifyFormat("[operation setCompletionBlock:^{\n"
11191 " [self onOperationDone];\n"
11192 "}];",
11193 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011194}
11195
Daniel Jasper289afc02015-04-23 09:23:17 +000011196TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11197 FormatStyle ZeroColumn = getLLVMStyle();
11198 ZeroColumn.ColumnLimit = 0;
11199
11200 verifyFormat("[[SessionService sharedService] "
11201 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11202 " if (window) {\n"
11203 " [self windowDidLoad:window];\n"
11204 " } else {\n"
11205 " [self errorLoadingWindow];\n"
11206 " }\n"
11207 "}];",
11208 ZeroColumn);
11209 EXPECT_EQ("[[SessionService sharedService]\n"
11210 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11211 " if (window) {\n"
11212 " [self windowDidLoad:window];\n"
11213 " } else {\n"
11214 " [self errorLoadingWindow];\n"
11215 " }\n"
11216 " }];",
11217 format("[[SessionService sharedService]\n"
11218 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11219 " if (window) {\n"
11220 " [self windowDidLoad:window];\n"
11221 " } else {\n"
11222 " [self errorLoadingWindow];\n"
11223 " }\n"
11224 "}];",
11225 ZeroColumn));
11226 verifyFormat("[myObject doSomethingWith:arg1\n"
11227 " firstBlock:^(Foo *a) {\n"
11228 " // ...\n"
11229 " int i;\n"
11230 " }\n"
11231 " secondBlock:^(Bar *b) {\n"
11232 " // ...\n"
11233 " int i;\n"
11234 " }\n"
11235 " thirdBlock:^Foo(Bar *b) {\n"
11236 " // ...\n"
11237 " int i;\n"
11238 " }];",
11239 ZeroColumn);
11240 verifyFormat("f(^{\n"
11241 " @autoreleasepool {\n"
11242 " if (a) {\n"
11243 " g();\n"
11244 " }\n"
11245 " }\n"
11246 "});",
11247 ZeroColumn);
11248 verifyFormat("void (^largeBlock)(void) = ^{\n"
11249 " // ...\n"
11250 "};",
11251 ZeroColumn);
11252
11253 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11254 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011255 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011256 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11257 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11258 " int i;\n"
11259 "};",
11260 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11261}
11262
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011263TEST_F(FormatTest, SupportsCRLF) {
11264 EXPECT_EQ("int a;\r\n"
11265 "int b;\r\n"
11266 "int c;\r\n",
11267 format("int a;\r\n"
11268 " int b;\r\n"
11269 " int c;\r\n",
11270 getLLVMStyle()));
11271 EXPECT_EQ("int a;\r\n"
11272 "int b;\r\n"
11273 "int c;\r\n",
11274 format("int a;\r\n"
11275 " int b;\n"
11276 " int c;\r\n",
11277 getLLVMStyle()));
11278 EXPECT_EQ("int a;\n"
11279 "int b;\n"
11280 "int c;\n",
11281 format("int a;\r\n"
11282 " int b;\n"
11283 " int c;\n",
11284 getLLVMStyle()));
11285 EXPECT_EQ("\"aaaaaaa \"\r\n"
11286 "\"bbbbbbb\";\r\n",
11287 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11288 EXPECT_EQ("#define A \\\r\n"
11289 " b; \\\r\n"
11290 " c; \\\r\n"
11291 " d;\r\n",
11292 format("#define A \\\r\n"
11293 " b; \\\r\n"
11294 " c; d; \r\n",
11295 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011296
11297 EXPECT_EQ("/*\r\n"
11298 "multi line block comments\r\n"
11299 "should not introduce\r\n"
11300 "an extra carriage return\r\n"
11301 "*/\r\n",
11302 format("/*\r\n"
11303 "multi line block comments\r\n"
11304 "should not introduce\r\n"
11305 "an extra carriage return\r\n"
11306 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011307}
11308
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011309TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11310 verifyFormat("MY_CLASS(C) {\n"
11311 " int i;\n"
11312 " int j;\n"
11313 "};");
11314}
11315
Daniel Jasper6633ab82013-10-18 10:38:14 +000011316TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11317 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11318 TwoIndent.ContinuationIndentWidth = 2;
11319
11320 EXPECT_EQ("int i =\n"
11321 " longFunction(\n"
11322 " arg);",
11323 format("int i = longFunction(arg);", TwoIndent));
11324
11325 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11326 SixIndent.ContinuationIndentWidth = 6;
11327
11328 EXPECT_EQ("int i =\n"
11329 " longFunction(\n"
11330 " arg);",
11331 format("int i = longFunction(arg);", SixIndent));
11332}
11333
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011334TEST_F(FormatTest, SpacesInAngles) {
11335 FormatStyle Spaces = getLLVMStyle();
11336 Spaces.SpacesInAngles = true;
11337
11338 verifyFormat("static_cast< int >(arg);", Spaces);
11339 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11340 verifyFormat("f< int, float >();", Spaces);
11341 verifyFormat("template <> g() {}", Spaces);
11342 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011343 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11344 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11345 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011346
11347 Spaces.Standard = FormatStyle::LS_Cpp03;
11348 Spaces.SpacesInAngles = true;
11349 verifyFormat("A< A< int > >();", Spaces);
11350
11351 Spaces.SpacesInAngles = false;
11352 verifyFormat("A<A<int> >();", Spaces);
11353
11354 Spaces.Standard = FormatStyle::LS_Cpp11;
11355 Spaces.SpacesInAngles = true;
11356 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011357
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011358 Spaces.SpacesInAngles = false;
11359 verifyFormat("A<A<int>>();", Spaces);
11360}
11361
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011362TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11363 FormatStyle Style = getLLVMStyle();
11364 Style.SpaceAfterTemplateKeyword = false;
11365 verifyFormat("template<int> void foo();", Style);
11366}
11367
Jacques Pienaarfc275112015-02-18 23:48:37 +000011368TEST_F(FormatTest, TripleAngleBrackets) {
11369 verifyFormat("f<<<1, 1>>>();");
11370 verifyFormat("f<<<1, 1, 1, s>>>();");
11371 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011372 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011373 verifyFormat("f<param><<<1, 1>>>();");
11374 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011375 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011376 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11377 "aaaaaaaaaaa<<<\n 1, 1>>>();");
11378}
11379
11380TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011381 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011382 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011383 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11384 "aaallvm::outs() <<");
11385 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11386 "aaaallvm::outs()\n <<");
11387}
11388
Manuel Klimek819788d2014-03-18 11:22:45 +000011389TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11390 std::string code = "#if A\n"
11391 "#if B\n"
11392 "a.\n"
11393 "#endif\n"
11394 " a = 1;\n"
11395 "#else\n"
11396 "#endif\n"
11397 "#if C\n"
11398 "#else\n"
11399 "#endif\n";
11400 EXPECT_EQ(code, format(code));
11401}
11402
Manuel Klimek68b03042014-04-14 09:14:11 +000011403TEST_F(FormatTest, HandleConflictMarkers) {
11404 // Git/SVN conflict markers.
11405 EXPECT_EQ("int a;\n"
11406 "void f() {\n"
11407 " callme(some(parameter1,\n"
11408 "<<<<<<< text by the vcs\n"
11409 " parameter2),\n"
11410 "||||||| text by the vcs\n"
11411 " parameter2),\n"
11412 " parameter3,\n"
11413 "======= text by the vcs\n"
11414 " parameter2, parameter3),\n"
11415 ">>>>>>> text by the vcs\n"
11416 " otherparameter);\n",
11417 format("int a;\n"
11418 "void f() {\n"
11419 " callme(some(parameter1,\n"
11420 "<<<<<<< text by the vcs\n"
11421 " parameter2),\n"
11422 "||||||| text by the vcs\n"
11423 " parameter2),\n"
11424 " parameter3,\n"
11425 "======= text by the vcs\n"
11426 " parameter2,\n"
11427 " parameter3),\n"
11428 ">>>>>>> text by the vcs\n"
11429 " otherparameter);\n"));
11430
11431 // Perforce markers.
11432 EXPECT_EQ("void f() {\n"
11433 " function(\n"
11434 ">>>> text by the vcs\n"
11435 " parameter,\n"
11436 "==== text by the vcs\n"
11437 " parameter,\n"
11438 "==== text by the vcs\n"
11439 " parameter,\n"
11440 "<<<< text by the vcs\n"
11441 " parameter);\n",
11442 format("void f() {\n"
11443 " function(\n"
11444 ">>>> text by the vcs\n"
11445 " parameter,\n"
11446 "==== text by the vcs\n"
11447 " parameter,\n"
11448 "==== text by the vcs\n"
11449 " parameter,\n"
11450 "<<<< text by the vcs\n"
11451 " parameter);\n"));
11452
11453 EXPECT_EQ("<<<<<<<\n"
11454 "|||||||\n"
11455 "=======\n"
11456 ">>>>>>>",
11457 format("<<<<<<<\n"
11458 "|||||||\n"
11459 "=======\n"
11460 ">>>>>>>"));
11461
11462 EXPECT_EQ("<<<<<<<\n"
11463 "|||||||\n"
11464 "int i;\n"
11465 "=======\n"
11466 ">>>>>>>",
11467 format("<<<<<<<\n"
11468 "|||||||\n"
11469 "int i;\n"
11470 "=======\n"
11471 ">>>>>>>"));
11472
11473 // FIXME: Handle parsing of macros around conflict markers correctly:
11474 EXPECT_EQ("#define Macro \\\n"
11475 "<<<<<<<\n"
11476 "Something \\\n"
11477 "|||||||\n"
11478 "Else \\\n"
11479 "=======\n"
11480 "Other \\\n"
11481 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011482 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011483 format("#define Macro \\\n"
11484 "<<<<<<<\n"
11485 " Something \\\n"
11486 "|||||||\n"
11487 " Else \\\n"
11488 "=======\n"
11489 " Other \\\n"
11490 ">>>>>>>\n"
11491 " End\n"
11492 "int i;\n"));
11493}
11494
Daniel Jasper471894432014-08-06 13:40:26 +000011495TEST_F(FormatTest, DisableRegions) {
11496 EXPECT_EQ("int i;\n"
11497 "// clang-format off\n"
11498 " int j;\n"
11499 "// clang-format on\n"
11500 "int k;",
11501 format(" int i;\n"
11502 " // clang-format off\n"
11503 " int j;\n"
11504 " // clang-format on\n"
11505 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011506 EXPECT_EQ("int i;\n"
11507 "/* clang-format off */\n"
11508 " int j;\n"
11509 "/* clang-format on */\n"
11510 "int k;",
11511 format(" int i;\n"
11512 " /* clang-format off */\n"
11513 " int j;\n"
11514 " /* clang-format on */\n"
11515 " int k;"));
Daniel Jasper471894432014-08-06 13:40:26 +000011516}
11517
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011518TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11519 format("? ) =");
11520 verifyNoCrash("#define a\\\n /**/}");
11521}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011522
Daniel Jasper498f5582015-12-25 08:53:31 +000011523TEST_F(FormatTest, FormatsTableGenCode) {
11524 FormatStyle Style = getLLVMStyle();
11525 Style.Language = FormatStyle::LK_TableGen;
11526 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11527}
11528
Eric Liu547d8792016-03-24 13:22:42 +000011529// Since this test case uses UNIX-style file path. We disable it for MS
11530// compiler.
Eric Liuc13ca6a2016-03-24 14:59:39 +000011531#if !defined(_MSC_VER) && !defined(__MINGW32__)
Eric Liu547d8792016-03-24 13:22:42 +000011532
11533TEST(FormatStyle, GetStyleOfFile) {
11534 vfs::InMemoryFileSystem FS;
11535 // Test 1: format file in the same directory.
11536 ASSERT_TRUE(
11537 FS.addFile("/a/.clang-format", 0,
11538 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11539 ASSERT_TRUE(
11540 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11541 auto Style1 = getStyle("file", "/a/.clang-format", "Google", &FS);
11542 ASSERT_EQ(Style1, getLLVMStyle());
11543
11544 // Test 2: fallback to default.
11545 ASSERT_TRUE(
11546 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11547 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", &FS);
11548 ASSERT_EQ(Style2, getMozillaStyle());
11549
11550 // Test 3: format file in parent directory.
11551 ASSERT_TRUE(
11552 FS.addFile("/c/.clang-format", 0,
11553 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11554 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11555 llvm::MemoryBuffer::getMemBuffer("int i;")));
11556 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", &FS);
11557 ASSERT_EQ(Style3, getGoogleStyle());
11558}
11559
11560#endif // _MSC_VER
11561
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011562TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11563 // Column limit is 20.
11564 std::string Code = "Type *a =\n"
11565 " new Type();\n"
11566 "g(iiiii, 0, jjjjj,\n"
11567 " 0, kkkkk, 0, mm);\n"
11568 "int bad = format ;";
11569 std::string Expected = "auto a = new Type();\n"
11570 "g(iiiii, nullptr,\n"
11571 " jjjjj, nullptr,\n"
11572 " kkkkk, nullptr,\n"
11573 " mm);\n"
11574 "int bad = format ;";
11575 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011576 tooling::Replacements Replaces = toReplacements(
11577 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11578 "auto "),
11579 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11580 "nullptr"),
11581 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11582 "nullptr"),
11583 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11584 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011585
11586 format::FormatStyle Style = format::getLLVMStyle();
11587 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011588 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11589 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11590 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11591 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11592 EXPECT_TRUE(static_cast<bool>(Result));
11593 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011594}
11595
Eric Liubaf58c22016-05-18 13:43:48 +000011596TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11597 std::string Code = "#include \"a.h\"\n"
11598 "#include \"c.h\"\n"
11599 "\n"
11600 "int main() {\n"
11601 " return 0;\n"
11602 "}";
11603 std::string Expected = "#include \"a.h\"\n"
11604 "#include \"b.h\"\n"
11605 "#include \"c.h\"\n"
11606 "\n"
11607 "int main() {\n"
11608 " return 0;\n"
11609 "}";
11610 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011611 tooling::Replacements Replaces = toReplacements(
11612 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11613 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011614
11615 format::FormatStyle Style = format::getLLVMStyle();
11616 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011617 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11618 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11619 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11620 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11621 EXPECT_TRUE(static_cast<bool>(Result));
11622 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011623}
11624
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011625TEST_F(FormatTest, AllignTrailingComments) {
11626 EXPECT_EQ("#define MACRO(V) \\\n"
11627 " V(Rt2) /* one more char */ \\\n"
11628 " V(Rs) /* than here */ \\\n"
11629 "/* comment 3 */\n",
11630 format("#define MACRO(V)\\\n"
11631 "V(Rt2) /* one more char */ \\\n"
11632 "V(Rs) /* than here */ \\\n"
11633 "/* comment 3 */ \\\n",
11634 getLLVMStyleWithColumns(40)));
11635}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011636} // end namespace
11637} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011638} // end namespace clang