blob: 6ab4a7462908c86364445f027ea3952e9089d50c [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 Jasperd0d27aa2016-11-01 06:23:14 +00005873 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005874 // FIXME: Is there a way to make this work?
5875 // verifyIndependentOfContext("MACRO(A *a);");
5876
Daniel Jasper32ccb032014-06-23 07:36:18 +00005877 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005878 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005879
Daniel Jasper866468a2014-04-14 13:15:29 +00005880 EXPECT_EQ("#define OP(x) \\\n"
5881 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5882 " return s << a.DebugString(); \\\n"
5883 " }",
5884 format("#define OP(x) \\\n"
5885 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5886 " return s << a.DebugString(); \\\n"
5887 " }",
5888 getLLVMStyleWithColumns(50)));
5889
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005890 // FIXME: We cannot handle this case yet; we might be able to figure out that
5891 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005892 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005893
5894 FormatStyle PointerMiddle = getLLVMStyle();
5895 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5896 verifyFormat("delete *x;", PointerMiddle);
5897 verifyFormat("int * x;", PointerMiddle);
5898 verifyFormat("template <int * y> f() {}", PointerMiddle);
5899 verifyFormat("int * f(int * a) {}", PointerMiddle);
5900 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5901 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5902 verifyFormat("A<int *> a;", PointerMiddle);
5903 verifyFormat("A<int **> a;", PointerMiddle);
5904 verifyFormat("A<int *, int *> a;", PointerMiddle);
5905 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005906 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5907 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005908 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005909
5910 // Member function reference qualifiers aren't binary operators.
5911 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005912 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005913 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005914 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005915 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005916 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005917}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005918
Daniel Jasperee6d6502013-07-17 20:25:02 +00005919TEST_F(FormatTest, UnderstandsAttributes) {
5920 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005921 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5922 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005923 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005924 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005925 verifyFormat("__attribute__((nodebug)) void\n"
5926 "foo() {}\n",
5927 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005928}
5929
Daniel Jasper10cd5812013-05-06 06:35:44 +00005930TEST_F(FormatTest, UnderstandsEllipsis) {
5931 verifyFormat("int printf(const char *fmt, ...);");
5932 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005933 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5934
5935 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005936 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005937 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005938}
5939
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005940TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005941 EXPECT_EQ("int *a;\n"
5942 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005943 "int *a;",
5944 format("int *a;\n"
5945 "int* a;\n"
5946 "int *a;",
5947 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005948 EXPECT_EQ("int* a;\n"
5949 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005950 "int* a;",
5951 format("int* a;\n"
5952 "int* a;\n"
5953 "int *a;",
5954 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005955 EXPECT_EQ("int *a;\n"
5956 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005957 "int *a;",
5958 format("int *a;\n"
5959 "int * a;\n"
5960 "int * a;",
5961 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005962 EXPECT_EQ("auto x = [] {\n"
5963 " int *a;\n"
5964 " int *a;\n"
5965 " int *a;\n"
5966 "};",
5967 format("auto x=[]{int *a;\n"
5968 "int * a;\n"
5969 "int * a;};",
5970 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005971}
5972
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005973TEST_F(FormatTest, UnderstandsRvalueReferences) {
5974 verifyFormat("int f(int &&a) {}");
5975 verifyFormat("int f(int a, char &&b) {}");
5976 verifyFormat("void f() { int &&a = b; }");
5977 verifyGoogleFormat("int f(int a, char&& b) {}");
5978 verifyGoogleFormat("void f() { int&& a = b; }");
5979
Daniel Jasper1eff9082013-05-27 16:36:33 +00005980 verifyIndependentOfContext("A<int &&> a;");
5981 verifyIndependentOfContext("A<int &&, int &&> a;");
5982 verifyGoogleFormat("A<int&&> a;");
5983 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00005984
5985 // Not rvalue references:
5986 verifyFormat("template <bool B, bool C> class A {\n"
5987 " static_assert(B && C, \"Something is wrong\");\n"
5988 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00005989 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
5990 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00005991 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005992}
5993
Manuel Klimekc1237a82013-01-23 14:08:21 +00005994TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
5995 verifyFormat("void f() {\n"
5996 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005997 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005998 "}",
5999 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006000}
6001
Daniel Jasperef906a92013-01-13 08:01:36 +00006002TEST_F(FormatTest, FormatsCasts) {
6003 verifyFormat("Type *A = static_cast<Type *>(P);");
6004 verifyFormat("Type *A = (Type *)P;");
6005 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6006 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006007 verifyFormat("int a = (int)2.0f;");
6008 verifyFormat("x[(int32)y];");
6009 verifyFormat("x = (int32)y;");
6010 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6011 verifyFormat("int a = (int)*b;");
6012 verifyFormat("int a = (int)2.0f;");
6013 verifyFormat("int a = (int)~0;");
6014 verifyFormat("int a = (int)++a;");
6015 verifyFormat("int a = (int)sizeof(int);");
6016 verifyFormat("int a = (int)+2;");
6017 verifyFormat("my_int a = (my_int)2.0f;");
6018 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006019 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006020 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006021 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006022 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006023 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006024
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006025 verifyFormat("void f() { my_int a = (my_int)*b; }");
6026 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6027 verifyFormat("my_int a = (my_int)~0;");
6028 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006029 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006030 verifyFormat("my_int a = (my_int)1;");
6031 verifyFormat("my_int a = (my_int *)1;");
6032 verifyFormat("my_int a = (const my_int)-1;");
6033 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006034 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006035 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006036 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006037 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006038
6039 // FIXME: single value wrapped with paren will be treated as cast.
6040 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006041
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006042 verifyFormat("{ (void)F; }");
6043
Daniel Jasper998cabc2013-07-18 14:46:07 +00006044 // Don't break after a cast's
6045 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6046 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6047 " bbbbbbbbbbbbbbbbbbbbbb);");
6048
Daniel Jasperef906a92013-01-13 08:01:36 +00006049 // These are not casts.
6050 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006051 verifyFormat("f(foo)->b;");
6052 verifyFormat("f(foo).b;");
6053 verifyFormat("f(foo)(b);");
6054 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006055 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006056 verifyFormat("(*funptr)(foo)[4];");
6057 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006058 verifyFormat("void f(int *);");
6059 verifyFormat("void f(int *) = 0;");
6060 verifyFormat("void f(SmallVector<int>) {}");
6061 verifyFormat("void f(SmallVector<int>);");
6062 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006063 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006064 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006065 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006066 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6067 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006068 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006069
Daniel Jasperba0bda92013-02-23 08:07:18 +00006070 // These are not casts, but at some point were confused with casts.
6071 verifyFormat("virtual void foo(int *) override;");
6072 verifyFormat("virtual void foo(char &) const;");
6073 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006074 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006075 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006076 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006077 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006078
6079 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6080 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006081 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006082 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006083 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6084 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6085 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006086}
6087
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006088TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006089 verifyFormat("A<bool()> a;");
6090 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006091 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006092 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006093 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006094 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006095 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006096 verifyFormat("template <class CallbackClass>\n"
6097 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006098
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006099 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6100 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006101 verifyGoogleFormat(
6102 "template <class CallbackClass>\n"
6103 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006104
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006105 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006106 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006107 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006108 verifyFormat("some_var = function(*some_pointer_var)[0];");
6109 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006110 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006111 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006112}
6113
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006114TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6115 verifyFormat("A (*foo_)[6];");
6116 verifyFormat("vector<int> (*foo_)[6];");
6117}
6118
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006119TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6120 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6121 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6122 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6123 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006124 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6125 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006126
6127 // Different ways of ()-initializiation.
6128 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6129 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6130 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6131 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6132 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6133 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006134 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6135 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006136}
6137
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006138TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006139 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006140 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006141 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006142 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006143 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006144 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006145 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6146 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006147 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6148 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006149 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6150 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006151 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6152 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006153 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6154 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006155 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6156 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6157 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6158 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006159 FormatStyle Indented = getLLVMStyle();
6160 Indented.IndentWrappedFunctionNames = true;
6161 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6162 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6163 Indented);
6164 verifyFormat(
6165 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6166 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6167 Indented);
6168 verifyFormat(
6169 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6170 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6171 Indented);
6172 verifyFormat(
6173 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6174 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6175 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006176
6177 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006178 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6179 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6180 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006181
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006182 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006183 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006184 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006185 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6186 " SourceLocation L, IdentifierIn *II,\n"
6187 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006188 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006189 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006190 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006191 " const SomeType<string, SomeOtherTemplateParameter>\n"
6192 " &ReallyReallyLongParameterName,\n"
6193 " const SomeType<string, SomeOtherTemplateParameter>\n"
6194 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006195 verifyFormat("template <typename A>\n"
6196 "SomeLoooooooooooooooooooooongType<\n"
6197 " typename some_namespace::SomeOtherType<A>::Type>\n"
6198 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006199
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006200 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006201 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6202 " aaaaaaaaaaaaaaaaaaaaaaa;");
6203 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006204 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6205 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006206 verifyGoogleFormat(
6207 "some_namespace::LongReturnType\n"
6208 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006209 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006210
6211 verifyGoogleFormat("template <typename T>\n"
6212 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006213 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006214 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6215 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006216
6217 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006218 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6219 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006220 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6221 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6222 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6223 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6224 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6225 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6226 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006227}
6228
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006229TEST_F(FormatTest, FormatsArrays) {
6230 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6231 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006232 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6233 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006234 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6235 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006236 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6237 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6238 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6239 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6240 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6241 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6242 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6243 verifyFormat(
6244 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6245 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6246 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006247 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6248 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006249
6250 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6251 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006252 verifyFormat(
6253 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6254 " .aaaaaaa[0]\n"
6255 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006256 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006257
6258 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006259
6260 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6261 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006262}
6263
Daniel Jaspere9de2602012-12-06 09:56:08 +00006264TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6265 verifyFormat("(a)->b();");
6266 verifyFormat("--a;");
6267}
6268
Daniel Jasper8b529712012-12-04 13:02:32 +00006269TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006270 verifyFormat("#include <string>\n"
6271 "#include <a/b/c.h>\n"
6272 "#include \"a/b/string\"\n"
6273 "#include \"string.h\"\n"
6274 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006275 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006276 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006277 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006278 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006279 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006280 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6281 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006282 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6283 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006284
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006285 verifyFormat("#import <string>");
6286 verifyFormat("#import <a/b/c.h>");
6287 verifyFormat("#import \"a/b/string\"");
6288 verifyFormat("#import \"string.h\"");
6289 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006290 verifyFormat("#if __has_include(<strstream>)\n"
6291 "#include <strstream>\n"
6292 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006293
Daniel Jasper343643b2014-08-13 08:29:18 +00006294 verifyFormat("#define MY_IMPORT <a/b>");
6295
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006296 // Protocol buffer definition or missing "#".
6297 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6298 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006299
6300 FormatStyle Style = getLLVMStyle();
6301 Style.AlwaysBreakBeforeMultilineStrings = true;
6302 Style.ColumnLimit = 0;
6303 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006304
6305 // But 'import' might also be a regular C++ namespace.
6306 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6307 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006308}
6309
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006310//===----------------------------------------------------------------------===//
6311// Error recovery tests.
6312//===----------------------------------------------------------------------===//
6313
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006314TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006315 FormatStyle NoBinPacking = getLLVMStyle();
6316 NoBinPacking.BinPackParameters = false;
6317 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6318 " double *min_x,\n"
6319 " double *max_x,\n"
6320 " double *min_y,\n"
6321 " double *max_y,\n"
6322 " double *min_z,\n"
6323 " double *max_z, ) {}",
6324 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006325}
6326
Daniel Jasper83a54d22013-01-10 09:26:47 +00006327TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006328 verifyFormat("void f() { return; }\n42");
6329 verifyFormat("void f() {\n"
6330 " if (0)\n"
6331 " return;\n"
6332 "}\n"
6333 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006334 verifyFormat("void f() { return }\n42");
6335 verifyFormat("void f() {\n"
6336 " if (0)\n"
6337 " return\n"
6338 "}\n"
6339 "42");
6340}
6341
6342TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6343 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6344 EXPECT_EQ("void f() {\n"
6345 " if (a)\n"
6346 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006347 "}",
6348 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006349 EXPECT_EQ("namespace N {\n"
6350 "void f()\n"
6351 "}",
6352 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006353 EXPECT_EQ("namespace N {\n"
6354 "void f() {}\n"
6355 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006356 "}",
6357 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006358}
6359
Daniel Jasper2df93312013-01-09 10:16:05 +00006360TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6361 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006362 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006363 " b;",
6364 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006365 verifyFormat("function(\n"
6366 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006367 " LoooooooooooongArgument);\n",
6368 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006369}
6370
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006371TEST_F(FormatTest, IncorrectAccessSpecifier) {
6372 verifyFormat("public:");
6373 verifyFormat("class A {\n"
6374 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006375 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006376 "};");
6377 verifyFormat("public\n"
6378 "int qwerty;");
6379 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006380 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006381 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006382 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006383 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006384 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006385}
Daniel Jasperf7935112012-12-03 18:12:45 +00006386
Daniel Jasper291f9362013-03-20 15:58:10 +00006387TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6388 verifyFormat("{");
6389 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006390 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006391}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006392
6393TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006394 verifyFormat("do {\n}");
6395 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006396 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006397 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006398 "wheeee(fun);");
6399 verifyFormat("do {\n"
6400 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006401 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006402}
6403
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006404TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006405 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006406 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006407 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006408 verifyFormat("while {\n foo;\n foo();\n}");
6409 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006410}
6411
Daniel Jasperc0880a92013-01-04 18:52:56 +00006412TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006413 verifyIncompleteFormat("namespace {\n"
6414 "class Foo { Foo (\n"
6415 "};\n"
6416 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006417}
6418
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006419TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006420 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006421 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6422 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006423 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006424
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006425 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006426 " {\n"
6427 " breakme(\n"
6428 " qwe);\n"
6429 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006430 format("{\n"
6431 " {\n"
6432 " breakme(qwe);\n"
6433 "}\n",
6434 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006435}
6436
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006437TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006438 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006439 " avariable,\n"
6440 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006441 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006442}
6443
Manuel Klimek762dd182013-01-21 10:07:49 +00006444TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006445 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006446}
6447
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006448TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006449 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006450 verifyFormat("vector<int> x{\n"
6451 " 1, 2, 3, 4,\n"
6452 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006453 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6454 verifyFormat("f({1, 2});");
6455 verifyFormat("auto v = Foo{-1};");
6456 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6457 verifyFormat("Class::Class : member{1, 2, 3} {}");
6458 verifyFormat("new vector<int>{1, 2, 3};");
6459 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006460 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006461 verifyFormat("return {arg1, arg2};");
6462 verifyFormat("return {arg1, SomeType{parameter}};");
6463 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6464 verifyFormat("new T{arg1, arg2};");
6465 verifyFormat("f(MyMap[{composite, key}]);");
6466 verifyFormat("class Class {\n"
6467 " T member = {arg1, arg2};\n"
6468 "};");
6469 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006470 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6471 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006472
Daniel Jasper438059e2014-05-22 12:11:13 +00006473 verifyFormat("int foo(int i) { return fo1{}(i); }");
6474 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006475 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006476 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006477 verifyFormat("Node n{1, Node{1000}, //\n"
6478 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006479 verifyFormat("Aaaa aaaaaaa{\n"
6480 " {\n"
6481 " aaaa,\n"
6482 " },\n"
6483 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006484 verifyFormat("class C : public D {\n"
6485 " SomeClass SC{2};\n"
6486 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006487 verifyFormat("class C : public A {\n"
6488 " class D : public B {\n"
6489 " void f() { int i{2}; }\n"
6490 " };\n"
6491 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006492 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006493
Daniel Jasper08434342015-05-26 07:26:26 +00006494 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006495 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006496 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006497 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6498 " bbbbb,\n"
6499 " ccccc,\n"
6500 " ddddd,\n"
6501 " eeeee,\n"
6502 " ffffff,\n"
6503 " ggggg,\n"
6504 " hhhhhh,\n"
6505 " iiiiii,\n"
6506 " jjjjjj,\n"
6507 " kkkkkk};",
6508 NoBinPacking);
6509 verifyFormat("const Aaaaaa aaaaa = {\n"
6510 " aaaaa,\n"
6511 " bbbbb,\n"
6512 " ccccc,\n"
6513 " ddddd,\n"
6514 " eeeee,\n"
6515 " ffffff,\n"
6516 " ggggg,\n"
6517 " hhhhhh,\n"
6518 " iiiiii,\n"
6519 " jjjjjj,\n"
6520 " kkkkkk,\n"
6521 "};",
6522 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006523 verifyFormat(
6524 "const Aaaaaa aaaaa = {\n"
6525 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6526 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6527 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6528 "};",
6529 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006530
Chandler Carruthf8b72662014-03-02 12:37:31 +00006531 // FIXME: The alignment of these trailing comments might be bad. Then again,
6532 // this might be utterly useless in real code.
6533 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006534 " : some_value{ //\n"
6535 " aaaaaaa, //\n"
6536 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006537
Chandler Carruthf8b72662014-03-02 12:37:31 +00006538 // In braced lists, the first comment is always assumed to belong to the
6539 // first element. Thus, it can be moved to the next or previous line as
6540 // appropriate.
6541 EXPECT_EQ("function({// First element:\n"
6542 " 1,\n"
6543 " // Second element:\n"
6544 " 2});",
6545 format("function({\n"
6546 " // First element:\n"
6547 " 1,\n"
6548 " // Second element:\n"
6549 " 2});"));
6550 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6551 " // First element:\n"
6552 " 1,\n"
6553 " // Second element:\n"
6554 " 2};",
6555 format("std::vector<int> MyNumbers{// First element:\n"
6556 " 1,\n"
6557 " // Second element:\n"
6558 " 2};",
6559 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00006560 // A trailing comma should still lead to an enforced line break.
6561 EXPECT_EQ("vector<int> SomeVector = {\n"
6562 " // aaa\n"
6563 " 1, 2,\n"
6564 "};",
6565 format("vector<int> SomeVector = { // aaa\n"
6566 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006567
Chandler Carruthf8b72662014-03-02 12:37:31 +00006568 FormatStyle ExtraSpaces = getLLVMStyle();
6569 ExtraSpaces.Cpp11BracedListStyle = false;
6570 ExtraSpaces.ColumnLimit = 75;
6571 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6572 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6573 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6574 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6575 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6576 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6577 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6578 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6579 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6580 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6581 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6582 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6583 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6584 verifyFormat("class Class {\n"
6585 " T member = { arg1, arg2 };\n"
6586 "};",
6587 ExtraSpaces);
6588 verifyFormat(
6589 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6590 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6591 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6592 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6593 ExtraSpaces);
6594 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006595 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006596 ExtraSpaces);
6597 verifyFormat(
6598 "someFunction(OtherParam,\n"
6599 " BracedList{ // comment 1 (Forcing interesting break)\n"
6600 " param1, param2,\n"
6601 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006602 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006603 ExtraSpaces);
6604 verifyFormat(
6605 "std::this_thread::sleep_for(\n"
6606 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6607 ExtraSpaces);
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006608 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaa{\n"
6609 " aaaaaaa,\n"
6610 " aaaaaaaaaa,\n"
6611 " aaaaa,\n"
6612 " aaaaaaaaaaaaaaa,\n"
6613 " aaa,\n"
6614 " aaaaaaaaaa,\n"
6615 " a,\n"
6616 " aaaaaaaaaaaaaaaaaaaaa,\n"
6617 " aaaaaaaaaaaa,\n"
6618 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6619 " aaaaaaa,\n"
6620 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006621 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006622}
6623
Daniel Jasper33b909c2013-10-25 14:29:37 +00006624TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006625 verifyFormat("vector<int> x = {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,\n"
6630 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006631 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006632 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006633 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006634 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6635 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006636 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006637 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6638 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6639 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6640 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6641 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6642 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6643 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006644 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006645 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6646 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006647 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6648 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6649 " // Separating comment.\n"
6650 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6651 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6652 " // Leading comment\n"
6653 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6654 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006655 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6656 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006657 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006658 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6659 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006660 getLLVMStyleWithColumns(38));
6661 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006662 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6663 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006664 verifyFormat(
6665 "static unsigned SomeValues[10][3] = {\n"
6666 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6667 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6668 verifyFormat("static auto fields = new vector<string>{\n"
6669 " \"aaaaaaaaaaaaa\",\n"
6670 " \"aaaaaaaaaaaaa\",\n"
6671 " \"aaaaaaaaaaaa\",\n"
6672 " \"aaaaaaaaaaaaaa\",\n"
6673 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6674 " \"aaaaaaaaaaaa\",\n"
6675 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6676 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006677 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6678 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6679 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6680 " 3, cccccccccccccccccccccc};",
6681 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006682
6683 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006684 verifyFormat("vector<int> x = {\n"
6685 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6686 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006687 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006688 verifyFormat("vector<int> x = {\n"
6689 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006690 "};",
6691 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006692 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6693 " 1, 1, 1, 1,\n"
6694 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006695 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006696
Daniel Jasper60c27072015-05-13 08:16:00 +00006697 // Trailing comment in the first line.
6698 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6699 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6700 " 111111111, 222222222, 3333333333, 444444444, //\n"
6701 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006702 // Trailing comment in the last line.
6703 verifyFormat("int aaaaa[] = {\n"
6704 " 1, 2, 3, // comment\n"
6705 " 4, 5, 6 // comment\n"
6706 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006707
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006708 // With nested lists, we should either format one item per line or all nested
6709 // lists one on line.
6710 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006711 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6712 " {aaaaaaaaaaaaaaaaaaa},\n"
6713 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6714 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006715 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006716 verifyFormat(
6717 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006718 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6719 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6720 " {aaa, aaa},\n"
6721 " {aaa, aaa},\n"
6722 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6723 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6724 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006725
6726 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006727 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
6728 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006729
6730 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006731
Daniel Jaspereb65e912015-12-21 18:31:15 +00006732 // No braced initializer here.
6733 verifyFormat("void f() {\n"
6734 " struct Dummy {};\n"
6735 " f(v);\n"
6736 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006737
6738 // Long lists should be formatted in columns even if they are nested.
6739 verifyFormat(
6740 "vector<int> x = function({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,\n"
6745 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006746}
6747
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006748TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006749 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006750 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006751
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006752 verifyFormat("void f() { return 42; }");
6753 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006754 " return 42;\n"
6755 "}",
6756 DoNotMerge);
6757 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006758 " // Comment\n"
6759 "}");
6760 verifyFormat("{\n"
6761 "#error {\n"
6762 " int a;\n"
6763 "}");
6764 verifyFormat("{\n"
6765 " int a;\n"
6766 "#error {\n"
6767 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006768 verifyFormat("void f() {} // comment");
6769 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006770 verifyFormat("void f() {\n"
6771 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006772 DoNotMerge);
6773 verifyFormat("void f() {\n"
6774 " int a;\n"
6775 "} // comment",
6776 DoNotMerge);
6777 verifyFormat("void f() {\n"
6778 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006779 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006780
6781 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6782 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6783
6784 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6785 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006786 verifyFormat("class C {\n"
6787 " C()\n"
6788 " : iiiiiiii(nullptr),\n"
6789 " kkkkkkk(nullptr),\n"
6790 " mmmmmmm(nullptr),\n"
6791 " nnnnnnn(nullptr) {}\n"
6792 "};",
6793 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006794
6795 FormatStyle NoColumnLimit = getLLVMStyle();
6796 NoColumnLimit.ColumnLimit = 0;
6797 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6798 EXPECT_EQ("class C {\n"
6799 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006800 "};",
6801 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006802 EXPECT_EQ("A()\n"
6803 " : b(0) {\n"
6804 "}",
6805 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6806
6807 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006808 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6809 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006810 EXPECT_EQ("A()\n"
6811 " : b(0) {\n"
6812 "}",
6813 format("A():b(0){}", DoNotMergeNoColumnLimit));
6814 EXPECT_EQ("A()\n"
6815 " : b(0) {\n"
6816 "}",
6817 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006818
6819 verifyFormat("#define A \\\n"
6820 " void f() { \\\n"
6821 " int i; \\\n"
6822 " }",
6823 getLLVMStyleWithColumns(20));
6824 verifyFormat("#define A \\\n"
6825 " void f() { int i; }",
6826 getLLVMStyleWithColumns(21));
6827 verifyFormat("#define A \\\n"
6828 " void f() { \\\n"
6829 " int i; \\\n"
6830 " } \\\n"
6831 " int j;",
6832 getLLVMStyleWithColumns(22));
6833 verifyFormat("#define A \\\n"
6834 " void f() { int i; } \\\n"
6835 " int j;",
6836 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006837}
6838
Daniel Jasperd74cf402014-04-08 12:46:38 +00006839TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6840 FormatStyle MergeInlineOnly = getLLVMStyle();
6841 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6842 verifyFormat("class C {\n"
6843 " int f() { return 42; }\n"
6844 "};",
6845 MergeInlineOnly);
6846 verifyFormat("int f() {\n"
6847 " return 42;\n"
6848 "}",
6849 MergeInlineOnly);
6850}
6851
Manuel Klimeke01bab52013-01-15 13:38:33 +00006852TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6853 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006854 verifyFormat("struct foo a = {bar};\nint n;");
6855 verifyFormat("class foo a = {bar};\nint n;");
6856 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006857
6858 // Elaborate types inside function definitions.
6859 verifyFormat("struct foo f() {}\nint n;");
6860 verifyFormat("class foo f() {}\nint n;");
6861 verifyFormat("union foo f() {}\nint n;");
6862
6863 // Templates.
6864 verifyFormat("template <class X> void f() {}\nint n;");
6865 verifyFormat("template <struct X> void f() {}\nint n;");
6866 verifyFormat("template <union X> void f() {}\nint n;");
6867
6868 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006869 verifyFormat("struct {\n} n;");
6870 verifyFormat(
6871 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006872 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006873 verifyFormat("class MACRO Z {\n} n;");
6874 verifyFormat("class MACRO(X) Z {\n} n;");
6875 verifyFormat("class __attribute__(X) Z {\n} n;");
6876 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006877 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006878 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006879 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6880 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006881
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006882 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006883 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006884
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006885 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006886 verifyFormat(
6887 "template <typename F>\n"
6888 "Matcher(const Matcher<F> &Other,\n"
6889 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6890 " !is_same<F, T>::value>::type * = 0)\n"
6891 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6892
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006893 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006894 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006895 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006896
6897 // FIXME:
6898 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006899 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006900
Manuel Klimeke01bab52013-01-15 13:38:33 +00006901 // Elaborate types where incorrectly parsing the structural element would
6902 // break the indent.
6903 verifyFormat("if (true)\n"
6904 " class X x;\n"
6905 "else\n"
6906 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006907
6908 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006909 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006910}
6911
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006912TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00006913 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
6914 format("#error Leave all white!!!!! space* alone!\n"));
6915 EXPECT_EQ(
6916 "#warning Leave all white!!!!! space* alone!\n",
6917 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006918 EXPECT_EQ("#error 1", format(" # error 1"));
6919 EXPECT_EQ("#warning 1", format(" # warning 1"));
6920}
6921
Daniel Jasper4431aa92013-04-23 13:54:04 +00006922TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00006923 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00006924 verifyFormat("#if (AAAA && BBBB)");
6925 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00006926 // FIXME: Come up with a better indentation for #elif.
6927 verifyFormat(
6928 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
6929 " defined(BBBBBBBB)\n"
6930 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
6931 " defined(BBBBBBBB)\n"
6932 "#endif",
6933 getLLVMStyleWithColumns(65));
6934}
6935
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006936TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
6937 FormatStyle AllowsMergedIf = getGoogleStyle();
6938 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
6939 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
6940 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00006941 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
6942 EXPECT_EQ("if (true) return 42;",
6943 format("if (true)\nreturn 42;", AllowsMergedIf));
6944 FormatStyle ShortMergedIf = AllowsMergedIf;
6945 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006946 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006947 " if (true) return 42;",
6948 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006949 verifyFormat("#define A \\\n"
6950 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006951 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006952 "#define B",
6953 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006954 verifyFormat("#define A \\\n"
6955 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006956 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006957 "g();",
6958 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00006959 verifyFormat("{\n"
6960 "#ifdef A\n"
6961 " // Comment\n"
6962 " if (true) continue;\n"
6963 "#endif\n"
6964 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00006965 " if (true) continue;\n"
6966 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006967 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00006968 ShortMergedIf.ColumnLimit = 29;
6969 verifyFormat("#define A \\\n"
6970 " if (aaaaaaaaaa) return 1; \\\n"
6971 " return 2;",
6972 ShortMergedIf);
6973 ShortMergedIf.ColumnLimit = 28;
6974 verifyFormat("#define A \\\n"
6975 " if (aaaaaaaaaa) \\\n"
6976 " return 1; \\\n"
6977 " return 2;",
6978 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006979}
6980
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00006981TEST_F(FormatTest, BlockCommentsInControlLoops) {
6982 verifyFormat("if (0) /* a comment in a strange place */ {\n"
6983 " f();\n"
6984 "}");
6985 verifyFormat("if (0) /* a comment in a strange place */ {\n"
6986 " f();\n"
6987 "} /* another comment */ else /* comment #3 */ {\n"
6988 " g();\n"
6989 "}");
6990 verifyFormat("while (0) /* a comment in a strange place */ {\n"
6991 " f();\n"
6992 "}");
6993 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
6994 " f();\n"
6995 "}");
6996 verifyFormat("do /* a comment in a strange place */ {\n"
6997 " f();\n"
6998 "} /* another comment */ while (0);");
6999}
7000
7001TEST_F(FormatTest, BlockComments) {
7002 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7003 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007004 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007005 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007006 " b\n"
7007 "/* */\n"
7008 "someCall(\n"
7009 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007010 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007011 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007012 "someCall(parameter);",
7013 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007014
7015 EXPECT_EQ("#define A\n"
7016 "/* */ someCall(\n"
7017 " parameter);",
7018 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007019 "/* */someCall(parameter);",
7020 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007021 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007022 EXPECT_EQ("/*\n"
7023 "*\n"
7024 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007025 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007026 "*/",
7027 format("/*\n"
7028 "*\n"
7029 " * aaaaaa aaaaaa\n"
7030 "*/",
7031 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007032 EXPECT_EQ("/*\n"
7033 "**\n"
7034 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007035 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007036 "*/",
7037 format("/*\n"
7038 "**\n"
7039 "* aaaaaa aaaaaa\n"
7040 "*/",
7041 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007042 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7043 " /* line 1\n"
7044 " bbbbbbbbbbbb */\n"
7045 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7046 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7047 " /* line 1\n"
7048 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7049 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007050
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007051 FormatStyle NoBinPacking = getLLVMStyle();
7052 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007053 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7054 " 2, /* comment 2 */\n"
7055 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007056 " aaaa,\n"
7057 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007058 format("someFunction (1, /* comment 1 */\n"
7059 " 2, /* comment 2 */ \n"
7060 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007061 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007062 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007063 verifyFormat(
7064 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7065 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7066 EXPECT_EQ(
7067 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7068 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7069 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7070 format(
7071 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7072 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7073 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007074 EXPECT_EQ(
7075 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7076 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7077 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7078 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7079 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7080 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007081
7082 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007083
7084 EXPECT_EQ("/*\n"
7085 " **\n"
7086 " */",
7087 format("/*\n"
7088 " **\n"
7089 " */"));
7090 EXPECT_EQ("/*\n"
7091 " *q\n"
7092 " */",
7093 format("/*\n"
7094 " *q\n"
7095 " */"));
7096 EXPECT_EQ("/*\n"
7097 " * q\n"
7098 " */",
7099 format("/*\n"
7100 " * q\n"
7101 " */"));
7102 EXPECT_EQ("/*\n"
7103 " **/",
7104 format("/*\n"
7105 " **/"));
7106 EXPECT_EQ("/*\n"
7107 " ***/",
7108 format("/*\n"
7109 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007110}
7111
Manuel Klimek82b836a2013-02-06 16:40:56 +00007112TEST_F(FormatTest, BlockCommentsInMacros) {
7113 EXPECT_EQ("#define A \\\n"
7114 " { \\\n"
7115 " /* one line */ \\\n"
7116 " someCall();",
7117 format("#define A { \\\n"
7118 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007119 " someCall();",
7120 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007121 EXPECT_EQ("#define A \\\n"
7122 " { \\\n"
7123 " /* previous */ \\\n"
7124 " /* one line */ \\\n"
7125 " someCall();",
7126 format("#define A { \\\n"
7127 " /* previous */ \\\n"
7128 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007129 " someCall();",
7130 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007131}
7132
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007133TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7134 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007135 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007136 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007137 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007138 "};",
7139 getLLVMStyleWithColumns(15)));
7140 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007141 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007142 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007143 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007144 "};",
7145 getLLVMStyleWithColumns(15)));
7146
7147 // FIXME: The formatting is still wrong here.
7148 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007149 " 1111 /* a\n"
7150 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007151 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007152 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007153 "};",
7154 getLLVMStyleWithColumns(15)));
7155}
7156
Manuel Klimek82b836a2013-02-06 16:40:56 +00007157TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007158 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007159 " // a\n"
7160 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007161}
7162
Manuel Klimekd33516e2013-01-23 10:09:28 +00007163TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007164 verifyFormat("void f(int *a);");
7165 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007166 verifyFormat("class A {\n void f(int *a);\n};");
7167 verifyFormat("class A {\n int *a;\n};");
7168 verifyFormat("namespace a {\n"
7169 "namespace b {\n"
7170 "class A {\n"
7171 " void f() {}\n"
7172 " int *a;\n"
7173 "};\n"
7174 "}\n"
7175 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007176}
7177
Manuel Klimekd33516e2013-01-23 10:09:28 +00007178TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7179 verifyFormat("while");
7180 verifyFormat("operator");
7181}
7182
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007183TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7184 // This code would be painfully slow to format if we didn't skip it.
7185 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
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(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7190 "A(1, 1)\n"
7191 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
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 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7201 // Deeply nested part is untouched, rest is formatted.
7202 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7203 format(std::string("int i;\n") + Code + "int j;\n",
7204 getLLVMStyle(), IC_ExpectIncomplete));
7205}
7206
Nico Weber7e6a7a12013-01-08 17:56:31 +00007207//===----------------------------------------------------------------------===//
7208// Objective-C tests.
7209//===----------------------------------------------------------------------===//
7210
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007211TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7212 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7213 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7214 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007215 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007216 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7217 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7218 format("-(NSInteger)Method3:(id)anObject;"));
7219 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7220 format("-(NSInteger)Method4:(id)anObject;"));
7221 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7222 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7223 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7224 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007225 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7226 "forAllCells:(BOOL)flag;",
7227 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7228 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007229
7230 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007231 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7232 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007233 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7234 " inRange:(NSRange)range\n"
7235 " outRange:(NSRange)out_range\n"
7236 " outRange1:(NSRange)out_range1\n"
7237 " outRange2:(NSRange)out_range2\n"
7238 " outRange3:(NSRange)out_range3\n"
7239 " outRange4:(NSRange)out_range4\n"
7240 " outRange5:(NSRange)out_range5\n"
7241 " outRange6:(NSRange)out_range6\n"
7242 " outRange7:(NSRange)out_range7\n"
7243 " outRange8:(NSRange)out_range8\n"
7244 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007245
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007246 // When the function name has to be wrapped.
7247 FormatStyle Style = getLLVMStyle();
7248 Style.IndentWrappedFunctionNames = false;
7249 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7250 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7251 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7252 "}",
7253 Style);
7254 Style.IndentWrappedFunctionNames = true;
7255 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7256 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7257 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7258 "}",
7259 Style);
7260
Nico Weberd6f962f2013-01-10 20:18:33 +00007261 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007262 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007263 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7264 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007265 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007266
Daniel Jasper37194282013-05-28 08:33:00 +00007267 verifyFormat("- (int (*)())foo:(int (*)())f;");
7268 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007269
7270 // If there's no return type (very rare in practice!), LLVM and Google style
7271 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007272 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007273 verifyFormat("- foo:(int)f;");
7274 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007275}
7276
Nico Weber7eecf4b2013-01-09 20:25:35 +00007277TEST_F(FormatTest, FormatObjCInterface) {
Nico Webera6087752013-01-10 20:12:55 +00007278 verifyFormat("@interface Foo : NSObject <NSSomeDelegate> {\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007279 "@public\n"
7280 " int field1;\n"
7281 "@protected\n"
7282 " int field2;\n"
7283 "@private\n"
7284 " int field3;\n"
7285 "@package\n"
7286 " int field4;\n"
7287 "}\n"
7288 "+ (id)init;\n"
7289 "@end");
7290
Nico Weber7eecf4b2013-01-09 20:25:35 +00007291 verifyGoogleFormat("@interface Foo : NSObject<NSSomeDelegate> {\n"
7292 " @public\n"
7293 " int field1;\n"
7294 " @protected\n"
7295 " int field2;\n"
7296 " @private\n"
7297 " int field3;\n"
7298 " @package\n"
7299 " int field4;\n"
7300 "}\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007301 "+ (id)init;\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007302 "@end");
7303
Nico Weber6029d4f2013-01-22 16:53:59 +00007304 verifyFormat("@interface /* wait for it */ Foo\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007305 "+ (id)init;\n"
7306 "// Look, a comment!\n"
7307 "- (int)answerWith:(int)i;\n"
7308 "@end");
7309
7310 verifyFormat("@interface Foo\n"
Nico Weberd8ffe752013-01-09 21:42:32 +00007311 "@end\n"
7312 "@interface Bar\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007313 "@end");
7314
7315 verifyFormat("@interface Foo : Bar\n"
7316 "+ (id)init;\n"
7317 "@end");
7318
Nico Weber6029d4f2013-01-22 16:53:59 +00007319 verifyFormat("@interface Foo : /**/ Bar /**/ <Baz, /**/ Quux>\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007320 "+ (id)init;\n"
7321 "@end");
7322
Nico Webera6087752013-01-10 20:12:55 +00007323 verifyGoogleFormat("@interface Foo : Bar<Baz, Quux>\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007324 "+ (id)init;\n"
Nico Webera6087752013-01-10 20:12:55 +00007325 "@end");
7326
Nico Weber2bb00742013-01-10 19:19:14 +00007327 verifyFormat("@interface Foo (HackStuff)\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007328 "+ (id)init;\n"
7329 "@end");
7330
Nico Weber2bb00742013-01-10 19:19:14 +00007331 verifyFormat("@interface Foo ()\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007332 "+ (id)init;\n"
7333 "@end");
7334
Nico Webera6087752013-01-10 20:12:55 +00007335 verifyFormat("@interface Foo (HackStuff) <MyProtocol>\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007336 "+ (id)init;\n"
7337 "@end");
7338
Daniel Jasper20e15562015-04-16 07:02:19 +00007339 verifyGoogleFormat("@interface Foo (HackStuff)<MyProtocol>\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007340 "+ (id)init;\n"
Nico Webera6087752013-01-10 20:12:55 +00007341 "@end");
7342
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007343 verifyFormat("@interface Foo {\n"
7344 " int _i;\n"
7345 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007346 "+ (id)init;\n"
7347 "@end");
7348
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007349 verifyFormat("@interface Foo : Bar {\n"
7350 " int _i;\n"
7351 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007352 "+ (id)init;\n"
7353 "@end");
7354
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007355 verifyFormat("@interface Foo : Bar <Baz, Quux> {\n"
7356 " int _i;\n"
7357 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007358 "+ (id)init;\n"
7359 "@end");
7360
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007361 verifyFormat("@interface Foo (HackStuff) {\n"
7362 " int _i;\n"
7363 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007364 "+ (id)init;\n"
7365 "@end");
7366
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007367 verifyFormat("@interface Foo () {\n"
7368 " int _i;\n"
7369 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007370 "+ (id)init;\n"
7371 "@end");
7372
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007373 verifyFormat("@interface Foo (HackStuff) <MyProtocol> {\n"
7374 " int _i;\n"
7375 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007376 "+ (id)init;\n"
7377 "@end");
Daniel Jasper437c3f52014-04-28 07:34:48 +00007378
7379 FormatStyle OnePerLine = getGoogleStyle();
7380 OnePerLine.BinPackParameters = false;
Daniel Jasper20e15562015-04-16 07:02:19 +00007381 verifyFormat("@interface aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ()<\n"
Daniel Jasper437c3f52014-04-28 07:34:48 +00007382 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7383 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7384 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7385 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
7386 "}",
7387 OnePerLine);
Nico Weber7eecf4b2013-01-09 20:25:35 +00007388}
7389
Nico Weber2ce0ac52013-01-09 23:25:37 +00007390TEST_F(FormatTest, FormatObjCImplementation) {
7391 verifyFormat("@implementation Foo : NSObject {\n"
7392 "@public\n"
7393 " int field1;\n"
7394 "@protected\n"
7395 " int field2;\n"
7396 "@private\n"
7397 " int field3;\n"
7398 "@package\n"
7399 " int field4;\n"
7400 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007401 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007402 "@end");
7403
7404 verifyGoogleFormat("@implementation Foo : NSObject {\n"
7405 " @public\n"
7406 " int field1;\n"
7407 " @protected\n"
7408 " int field2;\n"
7409 " @private\n"
7410 " int field3;\n"
7411 " @package\n"
7412 " int field4;\n"
7413 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007414 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007415 "@end");
7416
7417 verifyFormat("@implementation Foo\n"
7418 "+ (id)init {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +00007419 " if (true)\n"
7420 " return nil;\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007421 "}\n"
7422 "// Look, a comment!\n"
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007423 "- (int)answerWith:(int)i {\n"
7424 " return i;\n"
7425 "}\n"
Nico Webera21aaae2013-01-11 21:14:08 +00007426 "+ (int)answerWith:(int)i {\n"
7427 " return i;\n"
7428 "}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007429 "@end");
7430
7431 verifyFormat("@implementation Foo\n"
7432 "@end\n"
7433 "@implementation Bar\n"
7434 "@end");
7435
Daniel Jasper91b032a2014-05-22 12:46:38 +00007436 EXPECT_EQ("@implementation Foo : Bar\n"
7437 "+ (id)init {\n}\n"
7438 "- (void)foo {\n}\n"
7439 "@end",
7440 format("@implementation Foo : Bar\n"
7441 "+(id)init{}\n"
7442 "-(void)foo{}\n"
7443 "@end"));
Nico Weber2ce0ac52013-01-09 23:25:37 +00007444
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007445 verifyFormat("@implementation Foo {\n"
7446 " int _i;\n"
7447 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007448 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007449 "@end");
7450
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007451 verifyFormat("@implementation Foo : Bar {\n"
7452 " int _i;\n"
7453 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007454 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007455 "@end");
7456
Nico Weber2bb00742013-01-10 19:19:14 +00007457 verifyFormat("@implementation Foo (HackStuff)\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007458 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007459 "@end");
Daniel Jaspera15da302013-08-28 08:04:23 +00007460 verifyFormat("@implementation ObjcClass\n"
7461 "- (void)method;\n"
7462 "{}\n"
7463 "@end");
Nico Weber2ce0ac52013-01-09 23:25:37 +00007464}
7465
Nico Weber8696a8d2013-01-09 21:15:03 +00007466TEST_F(FormatTest, FormatObjCProtocol) {
7467 verifyFormat("@protocol Foo\n"
7468 "@property(weak) id delegate;\n"
7469 "- (NSUInteger)numberOfThings;\n"
7470 "@end");
7471
Nico Webera6087752013-01-10 20:12:55 +00007472 verifyFormat("@protocol MyProtocol <NSObject>\n"
Nico Weber8696a8d2013-01-09 21:15:03 +00007473 "- (NSUInteger)numberOfThings;\n"
7474 "@end");
7475
Nico Webera6087752013-01-10 20:12:55 +00007476 verifyGoogleFormat("@protocol MyProtocol<NSObject>\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007477 "- (NSUInteger)numberOfThings;\n"
Nico Webera6087752013-01-10 20:12:55 +00007478 "@end");
7479
Nico Weber8696a8d2013-01-09 21:15:03 +00007480 verifyFormat("@protocol Foo;\n"
7481 "@protocol Bar;\n");
Nico Weberd8ffe752013-01-09 21:42:32 +00007482
7483 verifyFormat("@protocol Foo\n"
7484 "@end\n"
7485 "@protocol Bar\n"
7486 "@end");
Nico Weber51306d22013-01-10 00:25:19 +00007487
7488 verifyFormat("@protocol myProtocol\n"
7489 "- (void)mandatoryWithInt:(int)i;\n"
7490 "@optional\n"
7491 "- (void)optional;\n"
7492 "@required\n"
7493 "- (void)required;\n"
Nico Weberbbe28b32013-01-10 00:42:07 +00007494 "@optional\n"
7495 "@property(assign) int madProp;\n"
Nico Weber51306d22013-01-10 00:25:19 +00007496 "@end\n");
Daniel Jasper9688ff12013-08-01 13:46:58 +00007497
7498 verifyFormat("@property(nonatomic, assign, readonly)\n"
7499 " int *looooooooooooooooooooooooooooongNumber;\n"
7500 "@property(nonatomic, assign, readonly)\n"
7501 " NSString *looooooooooooooooooooooooooooongName;");
Benjamin Kramere21cb742014-01-08 15:59:42 +00007502
7503 verifyFormat("@implementation PR18406\n"
7504 "}\n"
7505 "@end");
Nico Weber8696a8d2013-01-09 21:15:03 +00007506}
7507
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007508TEST_F(FormatTest, FormatObjCMethodDeclarations) {
7509 verifyFormat("- (void)doSomethingWith:(GTMFoo *)theFoo\n"
7510 " rect:(NSRect)theRect\n"
7511 " interval:(float)theInterval {\n"
7512 "}");
7513 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
Daniel Jasper06a26952016-01-04 07:29:07 +00007514 " longKeyword:(NSRect)theRect\n"
7515 " longerKeyword:(float)theInterval\n"
7516 " error:(NSError **)theError {\n"
7517 "}");
7518 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007519 " longKeyword:(NSRect)theRect\n"
7520 " evenLongerKeyword:(float)theInterval\n"
7521 " error:(NSError **)theError {\n"
7522 "}");
Daniel Jasperec8e8382014-10-11 08:24:56 +00007523 verifyFormat("- (instancetype)initXxxxxx:(id<x>)x\n"
7524 " y:(id<yyyyyyyyyyyyyyyyyyyy>)y\n"
7525 " NS_DESIGNATED_INITIALIZER;",
7526 getLLVMStyleWithColumns(60));
Daniel Jasper3c44c222015-07-16 22:58:24 +00007527
7528 // Continuation indent width should win over aligning colons if the function
7529 // name is long.
7530 FormatStyle continuationStyle = getGoogleStyle();
7531 continuationStyle.ColumnLimit = 40;
7532 continuationStyle.IndentWrappedFunctionNames = true;
7533 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
7534 " dontAlignNamef:(NSRect)theRect {\n"
7535 "}",
7536 continuationStyle);
7537
7538 // Make sure we don't break aligning for short parameter names.
7539 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
7540 " aShortf:(NSRect)theRect {\n"
7541 "}",
7542 continuationStyle);
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007543}
7544
Nico Webera7252d82013-01-12 06:18:40 +00007545TEST_F(FormatTest, FormatObjCMethodExpr) {
7546 verifyFormat("[foo bar:baz];");
7547 verifyFormat("return [foo bar:baz];");
Daniel Jasperea772b4d2014-10-16 08:38:51 +00007548 verifyFormat("return (a)[foo bar:baz];");
Nico Webera7252d82013-01-12 06:18:40 +00007549 verifyFormat("f([foo bar:baz]);");
7550 verifyFormat("f(2, [foo bar:baz]);");
7551 verifyFormat("f(2, a ? b : c);");
7552 verifyFormat("[[self initWithInt:4] bar:[baz quux:arrrr]];");
7553
Nico Weberb76de882013-02-05 16:21:00 +00007554 // Unary operators.
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 = --[foo bar:baz];");
7561 verifyFormat("int a = sizeof [foo bar:baz];");
Alexander Kornienko1e808872013-06-28 12:51:24 +00007562 verifyFormat("int a = alignof [foo bar:baz];", getGoogleStyle());
Nico Weber5d2624e2013-02-06 06:20:11 +00007563 verifyFormat("int a = &[foo bar:baz];");
7564 verifyFormat("int a = *[foo bar:baz];");
Nico Weberb76de882013-02-05 16:21:00 +00007565 // FIXME: Make casts work, without breaking f()[4].
Daniel Jaspera44991332015-04-29 13:06:49 +00007566 // verifyFormat("int a = (int)[foo bar:baz];");
7567 // verifyFormat("return (int)[foo bar:baz];");
7568 // verifyFormat("(void)[foo bar:baz];");
Nico Webera7892392013-02-13 03:48:27 +00007569 verifyFormat("return (MyType *)[self.tableView cellForRowAtIndexPath:cell];");
Nico Weberb76de882013-02-05 16:21:00 +00007570
7571 // Binary operators.
Nico Webera7252d82013-01-12 06:18:40 +00007572 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];");
7584 verifyFormat("[foo bar:baz] ? [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 verifyFormat("[foo bar:baz] % [foo bar:baz];");
7603 // Whew!
7604
Nico Weber29f9dea2013-02-11 15:32:15 +00007605 verifyFormat("return in[42];");
Daniel Jasper3a623db2014-12-18 12:11:01 +00007606 verifyFormat("for (auto v : in[1]) {\n}");
Daniel Jasper2b1865c2015-04-15 07:26:18 +00007607 verifyFormat("for (int i = 0; i < in[a]; ++i) {\n}");
7608 verifyFormat("for (int i = 0; in[a] < i; ++i) {\n}");
7609 verifyFormat("for (int i = 0; i < n; ++i, ++in[a]) {\n}");
7610 verifyFormat("for (int i = 0; i < n; ++i, in[a]++) {\n}");
7611 verifyFormat("for (int i = 0; i < f(in[a]); ++i, in[a]++) {\n}");
Nico Weber29f9dea2013-02-11 15:32:15 +00007612 verifyFormat("for (id foo in [self getStuffFor:bla]) {\n"
7613 "}");
Daniel Jasper78580792014-10-20 12:01:45 +00007614 verifyFormat("[self aaaaa:MACRO(a, b:, c:)];");
Daniel Jaspercdb58b22015-05-15 09:05:31 +00007615 verifyFormat("[self aaaaa:(1 + 2) bbbbb:3];");
7616 verifyFormat("[self aaaaa:(Type)a bbbbb:3];");
Nico Weber29f9dea2013-02-11 15:32:15 +00007617
Nico Webera7252d82013-01-12 06:18:40 +00007618 verifyFormat("[self stuffWithInt:(4 + 2) float:4.5];");
7619 verifyFormat("[self stuffWithInt:a ? b : c float:4.5];");
7620 verifyFormat("[self stuffWithInt:a ? [self foo:bar] : c];");
7621 verifyFormat("[self stuffWithInt:a ? (e ? f : g) : c];");
7622 verifyFormat("[cond ? obj1 : obj2 methodWithParam:param]");
Nico Weber5c8709b2013-01-12 23:41:33 +00007623 verifyFormat("[button setAction:@selector(zoomOut:)];");
Nico Weber2827a7e2013-01-12 23:48:49 +00007624 verifyFormat("[color getRed:&r green:&g blue:&b alpha:&a];");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007625
Nico Webera7252d82013-01-12 06:18:40 +00007626 verifyFormat("arr[[self indexForFoo:a]];");
7627 verifyFormat("throw [self errorFor:a];");
7628 verifyFormat("@throw [self errorFor:a];");
7629
Nico Weberec9e4102013-06-25 00:55:57 +00007630 verifyFormat("[(id)foo bar:(id)baz quux:(id)snorf];");
7631 verifyFormat("[(id)foo bar:(id) ? baz : quux];");
7632 verifyFormat("4 > 4 ? (id)a : (id)baz;");
7633
Nico Weberc9d73612013-01-12 22:48:47 +00007634 // This tests that the formatter doesn't break after "backing" but before ":",
7635 // which would be at 80 columns.
Nico Webera7252d82013-01-12 06:18:40 +00007636 verifyFormat(
7637 "void f() {\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007638 " if ((self = [super initWithContentRect:contentRect\n"
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007639 " styleMask:styleMask ?: otherMask\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007640 " backing:NSBackingStoreBuffered\n"
7641 " defer:YES]))");
7642
Daniel Jasperc697ad22013-02-06 10:05:46 +00007643 verifyFormat(
7644 "[foo checkThatBreakingAfterColonWorksOk:\n"
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007645 " [bar ifItDoes:reduceOverallLineLengthLikeInThisCase]];");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007646
7647 verifyFormat("[myObj short:arg1 // Force line break\n"
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007648 " longKeyword:arg2 != nil ? arg2 : @\"longKeyword\"\n"
7649 " evenLongerKeyword:arg3 ?: @\"evenLongerKeyword\"\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007650 " error:arg4];");
7651 verifyFormat(
7652 "void f() {\n"
7653 " popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
7654 " initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n"
7655 " pos.width(), pos.height())\n"
7656 " styleMask:NSBorderlessWindowMask\n"
7657 " backing:NSBackingStoreBuffered\n"
7658 " defer:NO]);\n"
7659 "}");
Daniel Jasper4478e522013-11-08 17:33:24 +00007660 verifyFormat(
7661 "void f() {\n"
7662 " popup_wdow_.reset([[RenderWidgetPopupWindow alloc]\n"
7663 " iniithContentRect:NSMakRet(origin_global.x, origin_global.y,\n"
7664 " pos.width(), pos.height())\n"
7665 " syeMask:NSBorderlessWindowMask\n"
7666 " bking:NSBackingStoreBuffered\n"
7667 " der:NO]);\n"
7668 "}",
7669 getLLVMStyleWithColumns(70));
Daniel Jasper18210d72014-10-09 09:52:05 +00007670 verifyFormat(
7671 "void f() {\n"
7672 " popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
7673 " initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n"
7674 " pos.width(), pos.height())\n"
7675 " styleMask:NSBorderlessWindowMask\n"
7676 " backing:NSBackingStoreBuffered\n"
7677 " defer:NO]);\n"
7678 "}",
7679 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasperc697ad22013-02-06 10:05:46 +00007680 verifyFormat("[contentsContainer replaceSubview:[subviews objectAtIndex:0]\n"
7681 " with:contentsNativeView];");
7682
7683 verifyFormat(
7684 "[pboard addTypes:[NSArray arrayWithObject:kBookmarkButtonDragType]\n"
7685 " owner:nillllll];");
7686
Daniel Jasperc697ad22013-02-06 10:05:46 +00007687 verifyFormat(
Daniel Jasperacc33662013-02-08 08:22:00 +00007688 "[pboard setData:[NSData dataWithBytes:&button length:sizeof(button)]\n"
Daniel Jasperc697ad22013-02-06 10:05:46 +00007689 " forType:kBookmarkButtonDragType];");
7690
7691 verifyFormat("[defaultCenter addObserver:self\n"
7692 " selector:@selector(willEnterFullscreen)\n"
7693 " name:kWillEnterFullscreenNotification\n"
7694 " object:nil];");
Daniel Jasperc485b4e2013-02-06 16:00:26 +00007695 verifyFormat("[image_rep drawInRect:drawRect\n"
7696 " fromRect:NSZeroRect\n"
7697 " operation:NSCompositeCopy\n"
7698 " fraction:1.0\n"
7699 " respectFlipped:NO\n"
7700 " hints:nil];");
Daniel Jaspereb536682015-05-06 12:48:06 +00007701 verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasper9c950132015-05-07 14:19:59 +00007703 verifyFormat("[aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
7704 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jaspera7b14262015-05-13 10:23:03 +00007705 verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaa[aaaaaaaaaaaaaaaaaaaaa]\n"
7706 " aaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasper00492f92016-01-05 13:03:50 +00007707 verifyFormat("[call aaaaaaaa.aaaaaa.aaaaaaaa.aaaaaaaa.aaaaaaaa.aaaaaaaa\n"
7708 " .aaaaaaaa];", // FIXME: Indentation seems off.
Daniel Jaspered41f772015-05-19 11:06:33 +00007709 getLLVMStyleWithColumns(60));
Nico Weberac9bde22013-02-06 16:54:35 +00007710
7711 verifyFormat(
7712 "scoped_nsobject<NSTextField> message(\n"
7713 " // The frame will be fixed up when |-setMessageText:| is called.\n"
7714 " [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 0, 0)]);");
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007715 verifyFormat("[self aaaaaa:bbbbbbbbbbbbb\n"
7716 " aaaaaaaaaa:bbbbbbbbbbbbbbbbb\n"
7717 " aaaaa:bbbbbbbbbbb + bbbbbbbbbbbb\n"
7718 " aaaa:bbb];");
Daniel Jasper4478e522013-11-08 17:33:24 +00007719 verifyFormat("[self param:function( //\n"
7720 " parameter)]");
Daniel Jasperf48b5ab2013-11-07 19:23:49 +00007721 verifyFormat(
7722 "[self aaaaaaaaaa:aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |\n"
7723 " aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |\n"
7724 " aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa];");
Daniel Jaspera1ea4cb2013-10-26 17:00:22 +00007725
Daniel Jasper2746a302015-05-06 13:13:03 +00007726 // FIXME: This violates the column limit.
7727 verifyFormat(
7728 "[aaaaaaaaaaaaaaaaaaaaaaaaa\n"
7729 " aaaaaaaaaaaaaaaaa:aaaaaaaa\n"
7730 " aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];",
7731 getLLVMStyleWithColumns(60));
7732
Daniel Jaspera1ea4cb2013-10-26 17:00:22 +00007733 // Variadic parameters.
7734 verifyFormat(
7735 "NSArray *myStrings = [NSArray stringarray:@\"a\", @\"b\", nil];");
Daniel Jasperf48b5ab2013-11-07 19:23:49 +00007736 verifyFormat(
7737 "[self aaaaaaaaaaaaa:aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
7738 " aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
7739 " aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa];");
Daniel Jasperb302f9a2013-11-08 02:08:01 +00007740 verifyFormat("[self // break\n"
7741 " a:a\n"
7742 " aaa:aaa];");
Daniel Jasper3460b252013-12-18 07:08:51 +00007743 verifyFormat("bool a = ([aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaa ||\n"
7744 " [aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaaaaa);");
Nico Webera7252d82013-01-12 06:18:40 +00007745}
7746
Nico Weber12d5bab2013-01-07 15:56:25 +00007747TEST_F(FormatTest, ObjCAt) {
Nico Weber803d61d2013-01-07 16:07:07 +00007748 verifyFormat("@autoreleasepool");
Nico Webere89c42f2013-01-07 16:14:28 +00007749 verifyFormat("@catch");
7750 verifyFormat("@class");
Nico Weber803d61d2013-01-07 16:07:07 +00007751 verifyFormat("@compatibility_alias");
7752 verifyFormat("@defs");
Nico Webera8876502013-01-07 15:17:23 +00007753 verifyFormat("@dynamic");
Nico Weber803d61d2013-01-07 16:07:07 +00007754 verifyFormat("@encode");
7755 verifyFormat("@end");
7756 verifyFormat("@finally");
7757 verifyFormat("@implementation");
7758 verifyFormat("@import");
7759 verifyFormat("@interface");
7760 verifyFormat("@optional");
7761 verifyFormat("@package");
Nico Webere89c42f2013-01-07 16:14:28 +00007762 verifyFormat("@private");
Nico Weber803d61d2013-01-07 16:07:07 +00007763 verifyFormat("@property");
Nico Webere89c42f2013-01-07 16:14:28 +00007764 verifyFormat("@protected");
Nico Weber803d61d2013-01-07 16:07:07 +00007765 verifyFormat("@protocol");
Nico Webere89c42f2013-01-07 16:14:28 +00007766 verifyFormat("@public");
Nico Weber803d61d2013-01-07 16:07:07 +00007767 verifyFormat("@required");
7768 verifyFormat("@selector");
7769 verifyFormat("@synchronized");
7770 verifyFormat("@synthesize");
Nico Webere89c42f2013-01-07 16:14:28 +00007771 verifyFormat("@throw");
7772 verifyFormat("@try");
Nico Weber803d61d2013-01-07 16:07:07 +00007773
Nico Weber12d5bab2013-01-07 15:56:25 +00007774 EXPECT_EQ("@interface", format("@ interface"));
7775
7776 // The precise formatting of this doesn't matter, nobody writes code like
7777 // this.
7778 verifyFormat("@ /*foo*/ interface");
Nico Webera8876502013-01-07 15:17:23 +00007779}
7780
Nico Weberd8cdb532013-01-08 19:15:23 +00007781TEST_F(FormatTest, ObjCSnippets) {
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007782 verifyFormat("@autoreleasepool {\n"
7783 " foo();\n"
7784 "}");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007785 verifyFormat("@class Foo, Bar;");
Nico Weberd8cdb532013-01-08 19:15:23 +00007786 verifyFormat("@compatibility_alias AliasName ExistingClass;");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007787 verifyFormat("@dynamic textColor;");
Nico Webere3025672013-01-18 05:11:47 +00007788 verifyFormat("char *buf1 = @encode(int *);");
7789 verifyFormat("char *buf1 = @encode(typeof(4 * 5));");
Nico Weber44449172013-02-12 16:17:07 +00007790 verifyFormat("char *buf1 = @encode(int **);");
Nico Weber4cc98742013-01-08 20:16:23 +00007791 verifyFormat("Protocol *proto = @protocol(p1);");
Nico Weber250fe712013-01-18 02:43:57 +00007792 verifyFormat("SEL s = @selector(foo:);");
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007793 verifyFormat("@synchronized(self) {\n"
7794 " f();\n"
7795 "}");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007796
Nico Webera2a84952013-01-10 21:30:42 +00007797 verifyFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
7798 verifyGoogleFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
7799
Nico Weber7e6a7a12013-01-08 17:56:31 +00007800 verifyFormat("@property(assign, nonatomic) CGFloat hoverAlpha;");
Nico Webera2a84952013-01-10 21:30:42 +00007801 verifyFormat("@property(assign, getter=isEditable) BOOL editable;");
7802 verifyGoogleFormat("@property(assign, getter=isEditable) BOOL editable;");
Daniel Jaspere9beea22014-01-28 15:20:33 +00007803 verifyFormat("@property (assign, getter=isEditable) BOOL editable;",
7804 getMozillaStyle());
7805 verifyFormat("@property BOOL editable;", getMozillaStyle());
7806 verifyFormat("@property (assign, getter=isEditable) BOOL editable;",
7807 getWebKitStyle());
7808 verifyFormat("@property BOOL editable;", getWebKitStyle());
Nico Webere8d78242013-06-25 00:25:40 +00007809
7810 verifyFormat("@import foo.bar;\n"
7811 "@import baz;");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007812}
7813
Daniel Jasper9cb1ac282015-10-07 15:09:08 +00007814TEST_F(FormatTest, ObjCForIn) {
7815 verifyFormat("- (void)test {\n"
7816 " for (NSString *n in arrayOfStrings) {\n"
7817 " foo(n);\n"
7818 " }\n"
7819 "}");
7820 verifyFormat("- (void)test {\n"
7821 " for (NSString *n in (__bridge NSArray *)arrayOfStrings) {\n"
7822 " foo(n);\n"
7823 " }\n"
7824 "}");
7825}
7826
Nico Weber0588b502013-02-07 00:19:29 +00007827TEST_F(FormatTest, ObjCLiterals) {
7828 verifyFormat("@\"String\"");
7829 verifyFormat("@1");
7830 verifyFormat("@+4.8");
7831 verifyFormat("@-4");
7832 verifyFormat("@1LL");
7833 verifyFormat("@.5");
7834 verifyFormat("@'c'");
7835 verifyFormat("@true");
7836
7837 verifyFormat("NSNumber *smallestInt = @(-INT_MAX - 1);");
7838 verifyFormat("NSNumber *piOverTwo = @(M_PI / 2);");
7839 verifyFormat("NSNumber *favoriteColor = @(Green);");
7840 verifyFormat("NSString *path = @(getenv(\"PATH\"));");
Daniel Jasperb1c19f82014-01-10 07:44:53 +00007841
7842 verifyFormat("[dictionary setObject:@(1) forKey:@\"number\"];");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007843}
Nico Weber0588b502013-02-07 00:19:29 +00007844
Daniel Jasperb596fb22013-10-24 10:31:50 +00007845TEST_F(FormatTest, ObjCDictLiterals) {
Nico Weber0588b502013-02-07 00:19:29 +00007846 verifyFormat("@{");
Nico Weber372d8dc2013-02-10 20:35:35 +00007847 verifyFormat("@{}");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007848 verifyFormat("@{@\"one\" : @1}");
7849 verifyFormat("return @{@\"one\" : @1;");
Daniel Jaspera125d532014-03-21 12:38:57 +00007850 verifyFormat("@{@\"one\" : @1}");
Manuel Klimek1a18c402013-04-12 14:13:36 +00007851
Chandler Carruthf8b72662014-03-02 12:37:31 +00007852 verifyFormat("@{@\"one\" : @{@2 : @1}}");
Daniel Jaspera125d532014-03-21 12:38:57 +00007853 verifyFormat("@{\n"
7854 " @\"one\" : @{@2 : @1},\n"
7855 "}");
Manuel Klimek1a18c402013-04-12 14:13:36 +00007856
Chandler Carruthf8b72662014-03-02 12:37:31 +00007857 verifyFormat("@{1 > 2 ? @\"one\" : @\"two\" : 1 > 2 ? @1 : @2}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007858 verifyIncompleteFormat("[self setDict:@{}");
7859 verifyIncompleteFormat("[self setDict:@{@1 : @2}");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007860 verifyFormat("NSLog(@\"%@\", @{@1 : @2, @2 : @3}[@1]);");
Nico Weber372d8dc2013-02-10 20:35:35 +00007861 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007862 "NSDictionary *masses = @{@\"H\" : @1.0078, @\"He\" : @4.0026};");
Nico Weber33c68e92013-02-10 20:39:05 +00007863 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007864 "NSDictionary *settings = @{AVEncoderKey : @(AVAudioQualityMax)};");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007865
Daniel Jaspera44991332015-04-29 13:06:49 +00007866 verifyFormat("NSDictionary *d = @{\n"
7867 " @\"nam\" : NSUserNam(),\n"
7868 " @\"dte\" : [NSDate date],\n"
7869 " @\"processInfo\" : [NSProcessInfo processInfo]\n"
7870 "};");
Nico Weberced7d412013-05-26 05:39:26 +00007871 verifyFormat(
Daniel Jasperd489dd32013-10-20 16:45:46 +00007872 "@{\n"
7873 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee : "
7874 "regularFont,\n"
7875 "};");
Daniel Jasperb8f61682013-10-22 15:45:58 +00007876 verifyGoogleFormat(
7877 "@{\n"
7878 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee : "
7879 "regularFont,\n"
7880 "};");
Daniel Jasper1fd6f1f2014-03-17 14:32:47 +00007881 verifyFormat(
7882 "@{\n"
7883 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee :\n"
7884 " reeeeeeeeeeeeeeeeeeeeeeeegularFont,\n"
7885 "};");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007886
7887 // We should try to be robust in case someone forgets the "@".
Daniel Jaspera44991332015-04-29 13:06:49 +00007888 verifyFormat("NSDictionary *d = {\n"
7889 " @\"nam\" : NSUserNam(),\n"
7890 " @\"dte\" : [NSDate date],\n"
7891 " @\"processInfo\" : [NSProcessInfo processInfo]\n"
7892 "};");
Daniel Jasper335ff262014-05-28 09:11:53 +00007893 verifyFormat("NSMutableDictionary *dictionary =\n"
7894 " [NSMutableDictionary dictionaryWithDictionary:@{\n"
7895 " aaaaaaaaaaaaaaaaaaaaa : aaaaaaaaaaaaa,\n"
7896 " bbbbbbbbbbbbbbbbbb : bbbbb,\n"
7897 " cccccccccccccccc : ccccccccccccccc\n"
7898 " }];");
Daniel Jasper4d724492015-10-12 03:19:07 +00007899
7900 // Ensure that casts before the key are kept on the same line as the key.
7901 verifyFormat(
7902 "NSDictionary *d = @{\n"
7903 " (aaaaaaaa id)aaaaaaaaa : (aaaaaaaa id)aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7904 " (aaaaaaaa id)aaaaaaaaaaaaaa : (aaaaaaaa id)aaaaaaaaaaaaaa,\n"
7905 "};");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007906}
7907
7908TEST_F(FormatTest, ObjCArrayLiterals) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007909 verifyIncompleteFormat("@[");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007910 verifyFormat("@[]");
7911 verifyFormat(
7912 "NSArray *array = @[ @\" Hey \", NSApp, [NSNumber numberWithInt:42] ];");
7913 verifyFormat("return @[ @3, @[], @[ @4, @5 ] ];");
7914 verifyFormat("NSArray *array = @[ [foo description] ];");
7915
7916 verifyFormat(
7917 "NSArray *some_variable = @[\n"
7918 " aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" : @\"aaaaaaaaaaaaaa\",\n"
7919 " @\"aaaaaaaaaaaaaaaaa\",\n"
7920 " @\"aaaaaaaaaaaaaaaaa\",\n"
Daniel Jasper50780ce2016-01-13 16:41:34 +00007921 " @\"aaaaaaaaaaaaaaaaa\",\n"
7922 "];");
7923 verifyFormat(
7924 "NSArray *some_variable = @[\n"
7925 " aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" : @\"aaaaaaaaaaaaaa\",\n"
7926 " @\"aaaaaaaaaaaaaaaa\", @\"aaaaaaaaaaaaaaaa\", @\"aaaaaaaaaaaaaaaa\"\n"
Daniel Jasperb8f61682013-10-22 15:45:58 +00007927 "];");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007928 verifyFormat("NSArray *some_variable = @[\n"
7929 " @\"aaaaaaaaaaaaaaaaa\",\n"
7930 " @\"aaaaaaaaaaaaaaaaa\",\n"
7931 " @\"aaaaaaaaaaaaaaaaa\",\n"
7932 " @\"aaaaaaaaaaaaaaaaa\",\n"
7933 "];");
Daniel Jasper308062b2015-02-27 08:41:05 +00007934 verifyFormat("NSArray *array = @[\n"
7935 " @\"a\",\n"
7936 " @\"a\",\n" // Trailing comma -> one per line.
7937 "];");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007938
7939 // We should try to be robust in case someone forgets the "@".
7940 verifyFormat("NSArray *some_variable = [\n"
7941 " @\"aaaaaaaaaaaaaaaaa\",\n"
7942 " @\"aaaaaaaaaaaaaaaaa\",\n"
7943 " @\"aaaaaaaaaaaaaaaaa\",\n"
7944 " @\"aaaaaaaaaaaaaaaaa\",\n"
7945 "];");
Daniel Jasper4bf0d802013-11-23 14:27:27 +00007946 verifyFormat(
7947 "- (NSAttributedString *)attributedStringForSegment:(NSUInteger)segment\n"
7948 " index:(NSUInteger)index\n"
7949 " nonDigitAttributes:\n"
7950 " (NSDictionary *)noDigitAttributes;");
Daniel Jasperf841d3a2015-05-28 07:21:50 +00007951 verifyFormat("[someFunction someLooooooooooooongParameter:@[\n"
7952 " NSBundle.mainBundle.infoDictionary[@\"a\"]\n"
7953 "]];");
Nico Weber0588b502013-02-07 00:19:29 +00007954}
7955
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007956TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007957 EXPECT_EQ("\"some text \"\n"
7958 "\"other\";",
7959 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007960 EXPECT_EQ("\"some text \"\n"
7961 "\"other\";",
7962 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007963 EXPECT_EQ(
7964 "#define A \\\n"
7965 " \"some \" \\\n"
7966 " \"text \" \\\n"
7967 " \"other\";",
7968 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7969 EXPECT_EQ(
7970 "#define A \\\n"
7971 " \"so \" \\\n"
7972 " \"text \" \\\n"
7973 " \"other\";",
7974 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7975
7976 EXPECT_EQ("\"some text\"",
7977 format("\"some text\"", getLLVMStyleWithColumns(1)));
7978 EXPECT_EQ("\"some text\"",
7979 format("\"some text\"", getLLVMStyleWithColumns(11)));
7980 EXPECT_EQ("\"some \"\n"
7981 "\"text\"",
7982 format("\"some text\"", getLLVMStyleWithColumns(10)));
7983 EXPECT_EQ("\"some \"\n"
7984 "\"text\"",
7985 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007986 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007987 "\" tex\"\n"
7988 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007989 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007990 EXPECT_EQ("\"some\"\n"
7991 "\" tex\"\n"
7992 "\" and\"",
7993 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7994 EXPECT_EQ("\"some\"\n"
7995 "\"/tex\"\n"
7996 "\"/and\"",
7997 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007998
7999 EXPECT_EQ("variable =\n"
8000 " \"long string \"\n"
8001 " \"literal\";",
8002 format("variable = \"long string literal\";",
8003 getLLVMStyleWithColumns(20)));
8004
8005 EXPECT_EQ("variable = f(\n"
8006 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00008007 " \"literal\",\n"
8008 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00008009 " loooooooooooooooooooong);",
8010 format("variable = f(\"long string literal\", short, "
8011 "loooooooooooooooooooong);",
8012 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008013
Daniel Jaspera44991332015-04-29 13:06:49 +00008014 EXPECT_EQ(
8015 "f(g(\"long string \"\n"
8016 " \"literal\"),\n"
8017 " b);",
8018 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008019 EXPECT_EQ("f(g(\"long string \"\n"
8020 " \"literal\",\n"
8021 " a),\n"
8022 " b);",
8023 format("f(g(\"long string literal\", a), b);",
8024 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008025 EXPECT_EQ(
8026 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00008027 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008028 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8029 EXPECT_EQ("f(\"one two three four five six \"\n"
8030 " \"seven\".split(\n"
8031 " really_looooong_variable));",
8032 format("f(\"one two three four five six seven\"."
8033 "split(really_looooong_variable));",
8034 getLLVMStyleWithColumns(33)));
8035
8036 EXPECT_EQ("f(\"some \"\n"
8037 " \"text\",\n"
8038 " other);",
8039 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008040
8041 // Only break as a last resort.
8042 verifyFormat(
8043 "aaaaaaaaaaaaaaaaaaaa(\n"
8044 " aaaaaaaaaaaaaaaaaaaa,\n"
8045 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008046
Daniel Jaspera44991332015-04-29 13:06:49 +00008047 EXPECT_EQ("\"splitmea\"\n"
8048 "\"trandomp\"\n"
8049 "\"oint\"",
8050 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008051
Daniel Jaspera44991332015-04-29 13:06:49 +00008052 EXPECT_EQ("\"split/\"\n"
8053 "\"pathat/\"\n"
8054 "\"slashes\"",
8055 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008056
Daniel Jaspera44991332015-04-29 13:06:49 +00008057 EXPECT_EQ("\"split/\"\n"
8058 "\"pathat/\"\n"
8059 "\"slashes\"",
8060 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008061 EXPECT_EQ("\"split at \"\n"
8062 "\"spaces/at/\"\n"
8063 "\"slashes.at.any$\"\n"
8064 "\"non-alphanumeric%\"\n"
8065 "\"1111111111characte\"\n"
8066 "\"rs\"",
8067 format("\"split at "
8068 "spaces/at/"
8069 "slashes.at."
8070 "any$non-"
8071 "alphanumeric%"
8072 "1111111111characte"
8073 "rs\"",
8074 getLLVMStyleWithColumns(20)));
8075
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008076 // Verify that splitting the strings understands
8077 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008078 EXPECT_EQ(
8079 "aaaaaaaaaaaa(\n"
8080 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8081 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8082 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8083 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8084 "aaaaaaaaaaaaaaaaaaaaaa\");",
8085 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008086 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8087 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8088 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8089 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8090 "aaaaaaaaaaaaaaaaaaaaaa\";",
8091 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008092 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8093 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8094 format("llvm::outs() << "
8095 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8096 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008097 EXPECT_EQ("ffff(\n"
8098 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8099 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8100 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8101 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8102 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008103
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008104 FormatStyle Style = getLLVMStyleWithColumns(12);
8105 Style.BreakStringLiterals = false;
8106 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8107
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008108 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8109 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00008110 EXPECT_EQ("#define A \\\n"
8111 " \"some \" \\\n"
8112 " \"text \" \\\n"
8113 " \"other\";",
8114 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008115}
8116
Manuel Klimek9e321992015-07-28 15:50:24 +00008117TEST_F(FormatTest, FullyRemoveEmptyLines) {
8118 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8119 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8120 EXPECT_EQ("int i = a(b());",
8121 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8122}
8123
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008124TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8125 EXPECT_EQ(
8126 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8127 "(\n"
8128 " \"x\t\");",
8129 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8130 "aaaaaaa("
8131 "\"x\t\");"));
8132}
8133
Daniel Jasper174b0122014-01-09 14:18:12 +00008134TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008135 EXPECT_EQ(
8136 "u8\"utf8 string \"\n"
8137 "u8\"literal\";",
8138 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8139 EXPECT_EQ(
8140 "u\"utf16 string \"\n"
8141 "u\"literal\";",
8142 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8143 EXPECT_EQ(
8144 "U\"utf32 string \"\n"
8145 "U\"literal\";",
8146 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8147 EXPECT_EQ("L\"wide string \"\n"
8148 "L\"literal\";",
8149 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008150 EXPECT_EQ("@\"NSString \"\n"
8151 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008152 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008153
8154 // This input makes clang-format try to split the incomplete unicode escape
8155 // sequence, which used to lead to a crasher.
8156 verifyNoCrash(
8157 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8158 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008159}
8160
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008161TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8162 FormatStyle Style = getGoogleStyleWithColumns(15);
8163 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8164 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8165 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8166 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8167 EXPECT_EQ("u8R\"x(raw literal)x\";",
8168 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008169}
8170
8171TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8172 FormatStyle Style = getLLVMStyleWithColumns(20);
8173 EXPECT_EQ(
8174 "_T(\"aaaaaaaaaaaaaa\")\n"
8175 "_T(\"aaaaaaaaaaaaaa\")\n"
8176 "_T(\"aaaaaaaaaaaa\")",
8177 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8178 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
8179 " _T(\"aaaaaa\"),\n"
8180 " z);",
8181 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8182
8183 // FIXME: Handle embedded spaces in one iteration.
8184 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8185 // "_T(\"aaaaaaaaaaaaa\")\n"
8186 // "_T(\"aaaaaaaaaaaaa\")\n"
8187 // "_T(\"a\")",
8188 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8189 // getLLVMStyleWithColumns(20)));
8190 EXPECT_EQ(
8191 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8192 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008193 EXPECT_EQ("f(\n"
8194 "#if !TEST\n"
8195 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8196 "#endif\n"
8197 " );",
8198 format("f(\n"
8199 "#if !TEST\n"
8200 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8201 "#endif\n"
8202 ");"));
8203 EXPECT_EQ("f(\n"
8204 "\n"
8205 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8206 format("f(\n"
8207 "\n"
8208 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008209}
8210
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008211TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008212 EXPECT_EQ(
8213 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8214 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8215 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8216 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8217 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8218 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8219}
8220
8221TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8222 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008223 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008224 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8225 "multiline raw string literal xxxxxxxxxxxxxx\n"
8226 ")x\",\n"
8227 " a),\n"
8228 " b);",
8229 format("fffffffffff(g(R\"x(\n"
8230 "multiline raw string literal xxxxxxxxxxxxxx\n"
8231 ")x\", a), b);",
8232 getGoogleStyleWithColumns(20)));
8233 EXPECT_EQ("fffffffffff(\n"
8234 " g(R\"x(qqq\n"
8235 "multiline raw string literal xxxxxxxxxxxxxx\n"
8236 ")x\",\n"
8237 " a),\n"
8238 " b);",
8239 format("fffffffffff(g(R\"x(qqq\n"
8240 "multiline raw string literal xxxxxxxxxxxxxx\n"
8241 ")x\", a), b);",
8242 getGoogleStyleWithColumns(20)));
8243
8244 EXPECT_EQ("fffffffffff(R\"x(\n"
8245 "multiline raw string literal xxxxxxxxxxxxxx\n"
8246 ")x\");",
8247 format("fffffffffff(R\"x(\n"
8248 "multiline raw string literal xxxxxxxxxxxxxx\n"
8249 ")x\");",
8250 getGoogleStyleWithColumns(20)));
8251 EXPECT_EQ("fffffffffff(R\"x(\n"
8252 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008253 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008254 format("fffffffffff(R\"x(\n"
8255 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008256 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008257 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008258 EXPECT_EQ("fffffffffff(\n"
8259 " R\"x(\n"
8260 "multiline raw string literal xxxxxxxxxxxxxx\n"
8261 ")x\" +\n"
8262 " bbbbbb);",
8263 format("fffffffffff(\n"
8264 " R\"x(\n"
8265 "multiline raw string literal xxxxxxxxxxxxxx\n"
8266 ")x\" + bbbbbb);",
8267 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008268}
8269
Alexander Kornienkobe633902013-06-14 11:46:10 +00008270TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008271 verifyFormat("string a = \"unterminated;");
8272 EXPECT_EQ("function(\"unterminated,\n"
8273 " OtherParameter);",
8274 format("function( \"unterminated,\n"
8275 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008276}
8277
8278TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008279 FormatStyle Style = getLLVMStyle();
8280 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008281 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008282 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008283}
8284
Daniel Jaspera44991332015-04-29 13:06:49 +00008285TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008286
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008287TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8288 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8289 " \"ddeeefff\");",
8290 format("someFunction(\"aaabbbcccdddeeefff\");",
8291 getLLVMStyleWithColumns(25)));
8292 EXPECT_EQ("someFunction1234567890(\n"
8293 " \"aaabbbcccdddeeefff\");",
8294 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8295 getLLVMStyleWithColumns(26)));
8296 EXPECT_EQ("someFunction1234567890(\n"
8297 " \"aaabbbcccdddeeeff\"\n"
8298 " \"f\");",
8299 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8300 getLLVMStyleWithColumns(25)));
8301 EXPECT_EQ("someFunction1234567890(\n"
8302 " \"aaabbbcccdddeeeff\"\n"
8303 " \"f\");",
8304 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8305 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008306 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8307 " \"ddde \"\n"
8308 " \"efff\");",
8309 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008310 getLLVMStyleWithColumns(25)));
8311 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8312 " \"ddeeefff\");",
8313 format("someFunction(\"aaabbbccc ddeeefff\");",
8314 getLLVMStyleWithColumns(25)));
8315 EXPECT_EQ("someFunction1234567890(\n"
8316 " \"aaabb \"\n"
8317 " \"cccdddeeefff\");",
8318 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8319 getLLVMStyleWithColumns(25)));
8320 EXPECT_EQ("#define A \\\n"
8321 " string s = \\\n"
8322 " \"123456789\" \\\n"
8323 " \"0\"; \\\n"
8324 " int i;",
8325 format("#define A string s = \"1234567890\"; int i;",
8326 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008327 // FIXME: Put additional penalties on breaking at non-whitespace locations.
8328 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8329 " \"dddeeeff\"\n"
8330 " \"f\");",
8331 format("someFunction(\"aaabbbcc dddeeefff\");",
8332 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008333}
8334
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008335TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008336 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8337 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008338 EXPECT_EQ("\"test\"\n"
8339 "\"\\n\"",
8340 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8341 EXPECT_EQ("\"tes\\\\\"\n"
8342 "\"n\"",
8343 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8344 EXPECT_EQ("\"\\\\\\\\\"\n"
8345 "\"\\n\"",
8346 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008347 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008348 EXPECT_EQ("\"\\uff01\"\n"
8349 "\"test\"",
8350 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8351 EXPECT_EQ("\"\\Uff01ff02\"",
8352 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8353 EXPECT_EQ("\"\\x000000000001\"\n"
8354 "\"next\"",
8355 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8356 EXPECT_EQ("\"\\x000000000001next\"",
8357 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8358 EXPECT_EQ("\"\\x000000000001\"",
8359 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8360 EXPECT_EQ("\"test\"\n"
8361 "\"\\000000\"\n"
8362 "\"000001\"",
8363 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8364 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008365 "\"00000000\"\n"
8366 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008367 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008368}
8369
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008370TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8371 verifyFormat("void f() {\n"
8372 " return g() {}\n"
8373 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008374 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008375 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008376 "}");
8377}
8378
Manuel Klimek421147e2014-01-24 09:25:23 +00008379TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8380 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008381 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008382}
8383
Manuel Klimek13b97d82013-05-13 08:42:42 +00008384TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8385 verifyFormat("class X {\n"
8386 " void f() {\n"
8387 " }\n"
8388 "};",
8389 getLLVMStyleWithColumns(12));
8390}
8391
8392TEST_F(FormatTest, ConfigurableIndentWidth) {
8393 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8394 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008395 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008396 verifyFormat("void f() {\n"
8397 " someFunction();\n"
8398 " if (true) {\n"
8399 " f();\n"
8400 " }\n"
8401 "}",
8402 EightIndent);
8403 verifyFormat("class X {\n"
8404 " void f() {\n"
8405 " }\n"
8406 "};",
8407 EightIndent);
8408 verifyFormat("int x[] = {\n"
8409 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008410 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008411 EightIndent);
8412}
8413
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008414TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008415 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008416 "f();",
8417 getLLVMStyleWithColumns(8));
8418}
8419
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008420TEST_F(FormatTest, ConfigurableUseOfTab) {
8421 FormatStyle Tab = getLLVMStyleWithColumns(42);
8422 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008423 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008424 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008425
8426 EXPECT_EQ("if (aaaaaaaa && // q\n"
8427 " bb)\t\t// w\n"
8428 "\t;",
8429 format("if (aaaaaaaa &&// q\n"
8430 "bb)// w\n"
8431 ";",
8432 Tab));
8433 EXPECT_EQ("if (aaa && bbb) // w\n"
8434 "\t;",
8435 format("if(aaa&&bbb)// w\n"
8436 ";",
8437 Tab));
8438
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008439 verifyFormat("class X {\n"
8440 "\tvoid f() {\n"
8441 "\t\tsomeFunction(parameter1,\n"
8442 "\t\t\t parameter2);\n"
8443 "\t}\n"
8444 "};",
8445 Tab);
8446 verifyFormat("#define A \\\n"
8447 "\tvoid f() { \\\n"
8448 "\t\tsomeFunction( \\\n"
8449 "\t\t parameter1, \\\n"
8450 "\t\t parameter2); \\\n"
8451 "\t}",
8452 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008453
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008454 Tab.TabWidth = 4;
8455 Tab.IndentWidth = 8;
8456 verifyFormat("class TabWidth4Indent8 {\n"
8457 "\t\tvoid f() {\n"
8458 "\t\t\t\tsomeFunction(parameter1,\n"
8459 "\t\t\t\t\t\t\t parameter2);\n"
8460 "\t\t}\n"
8461 "};",
8462 Tab);
8463
8464 Tab.TabWidth = 4;
8465 Tab.IndentWidth = 4;
8466 verifyFormat("class TabWidth4Indent4 {\n"
8467 "\tvoid f() {\n"
8468 "\t\tsomeFunction(parameter1,\n"
8469 "\t\t\t\t\t parameter2);\n"
8470 "\t}\n"
8471 "};",
8472 Tab);
8473
8474 Tab.TabWidth = 8;
8475 Tab.IndentWidth = 4;
8476 verifyFormat("class TabWidth8Indent4 {\n"
8477 " void f() {\n"
8478 "\tsomeFunction(parameter1,\n"
8479 "\t\t parameter2);\n"
8480 " }\n"
8481 "};",
8482 Tab);
8483
Alexander Kornienko39856b72013-09-10 09:38:25 +00008484 Tab.TabWidth = 8;
8485 Tab.IndentWidth = 8;
8486 EXPECT_EQ("/*\n"
8487 "\t a\t\tcomment\n"
8488 "\t in multiple lines\n"
8489 " */",
8490 format(" /*\t \t \n"
8491 " \t \t a\t\tcomment\t \t\n"
8492 " \t \t in multiple lines\t\n"
8493 " \t */",
8494 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008495
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008496 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008497 verifyFormat("{\n"
8498 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8499 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8500 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8501 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8502 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8503 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008504 "};",
8505 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008506 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008507 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008508 "\ta2,\n"
8509 "\ta3\n"
8510 "};",
8511 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008512 EXPECT_EQ("if (aaaaaaaa && // q\n"
8513 " bb) // w\n"
8514 "\t;",
8515 format("if (aaaaaaaa &&// q\n"
8516 "bb)// w\n"
8517 ";",
8518 Tab));
8519 verifyFormat("class X {\n"
8520 "\tvoid f() {\n"
8521 "\t\tsomeFunction(parameter1,\n"
8522 "\t\t parameter2);\n"
8523 "\t}\n"
8524 "};",
8525 Tab);
8526 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008527 "\tQ(\n"
8528 "\t {\n"
8529 "\t\t int a;\n"
8530 "\t\t someFunction(aaaaaaaa,\n"
8531 "\t\t bbbbbbb);\n"
8532 "\t },\n"
8533 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008534 "}",
8535 Tab);
8536 EXPECT_EQ("{\n"
8537 "\t/* aaaa\n"
8538 "\t bbbb */\n"
8539 "}",
8540 format("{\n"
8541 "/* aaaa\n"
8542 " bbbb */\n"
8543 "}",
8544 Tab));
8545 EXPECT_EQ("{\n"
8546 "\t/*\n"
8547 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8548 "\t bbbbbbbbbbbbb\n"
8549 "\t*/\n"
8550 "}",
8551 format("{\n"
8552 "/*\n"
8553 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8554 "*/\n"
8555 "}",
8556 Tab));
8557 EXPECT_EQ("{\n"
8558 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8559 "\t// bbbbbbbbbbbbb\n"
8560 "}",
8561 format("{\n"
8562 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8563 "}",
8564 Tab));
8565 EXPECT_EQ("{\n"
8566 "\t/*\n"
8567 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8568 "\t bbbbbbbbbbbbb\n"
8569 "\t*/\n"
8570 "}",
8571 format("{\n"
8572 "\t/*\n"
8573 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8574 "\t*/\n"
8575 "}",
8576 Tab));
8577 EXPECT_EQ("{\n"
8578 "\t/*\n"
8579 "\n"
8580 "\t*/\n"
8581 "}",
8582 format("{\n"
8583 "\t/*\n"
8584 "\n"
8585 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008586 "}",
8587 Tab));
8588 EXPECT_EQ("{\n"
8589 "\t/*\n"
8590 " asdf\n"
8591 "\t*/\n"
8592 "}",
8593 format("{\n"
8594 "\t/*\n"
8595 " asdf\n"
8596 "\t*/\n"
8597 "}",
8598 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008599
8600 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008601 EXPECT_EQ("/*\n"
8602 " a\t\tcomment\n"
8603 " in multiple lines\n"
8604 " */",
8605 format(" /*\t \t \n"
8606 " \t \t a\t\tcomment\t \t\n"
8607 " \t \t in multiple lines\t\n"
8608 " \t */",
8609 Tab));
8610 EXPECT_EQ("/* some\n"
8611 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008612 format(" \t \t /* some\n"
8613 " \t \t comment */",
8614 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008615 EXPECT_EQ("int a; /* some\n"
8616 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008617 format(" \t \t int a; /* some\n"
8618 " \t \t comment */",
8619 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008620
Alexander Kornienko39856b72013-09-10 09:38:25 +00008621 EXPECT_EQ("int a; /* some\n"
8622 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008623 format(" \t \t int\ta; /* some\n"
8624 " \t \t comment */",
8625 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008626 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8627 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008628 format(" \t \t f(\"\t\t\"); /* some\n"
8629 " \t \t comment */",
8630 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008631 EXPECT_EQ("{\n"
8632 " /*\n"
8633 " * Comment\n"
8634 " */\n"
8635 " int i;\n"
8636 "}",
8637 format("{\n"
8638 "\t/*\n"
8639 "\t * Comment\n"
8640 "\t */\n"
8641 "\t int i;\n"
8642 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008643
8644 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8645 Tab.TabWidth = 8;
8646 Tab.IndentWidth = 8;
8647 EXPECT_EQ("if (aaaaaaaa && // q\n"
8648 " bb) // w\n"
8649 "\t;",
8650 format("if (aaaaaaaa &&// q\n"
8651 "bb)// w\n"
8652 ";",
8653 Tab));
8654 EXPECT_EQ("if (aaa && bbb) // w\n"
8655 "\t;",
8656 format("if(aaa&&bbb)// w\n"
8657 ";",
8658 Tab));
8659 verifyFormat("class X {\n"
8660 "\tvoid f() {\n"
8661 "\t\tsomeFunction(parameter1,\n"
8662 "\t\t\t parameter2);\n"
8663 "\t}\n"
8664 "};",
8665 Tab);
8666 verifyFormat("#define A \\\n"
8667 "\tvoid f() { \\\n"
8668 "\t\tsomeFunction( \\\n"
8669 "\t\t parameter1, \\\n"
8670 "\t\t parameter2); \\\n"
8671 "\t}",
8672 Tab);
8673 Tab.TabWidth = 4;
8674 Tab.IndentWidth = 8;
8675 verifyFormat("class TabWidth4Indent8 {\n"
8676 "\t\tvoid f() {\n"
8677 "\t\t\t\tsomeFunction(parameter1,\n"
8678 "\t\t\t\t\t\t\t parameter2);\n"
8679 "\t\t}\n"
8680 "};",
8681 Tab);
8682 Tab.TabWidth = 4;
8683 Tab.IndentWidth = 4;
8684 verifyFormat("class TabWidth4Indent4 {\n"
8685 "\tvoid f() {\n"
8686 "\t\tsomeFunction(parameter1,\n"
8687 "\t\t\t\t\t parameter2);\n"
8688 "\t}\n"
8689 "};",
8690 Tab);
8691 Tab.TabWidth = 8;
8692 Tab.IndentWidth = 4;
8693 verifyFormat("class TabWidth8Indent4 {\n"
8694 " void f() {\n"
8695 "\tsomeFunction(parameter1,\n"
8696 "\t\t parameter2);\n"
8697 " }\n"
8698 "};",
8699 Tab);
8700 Tab.TabWidth = 8;
8701 Tab.IndentWidth = 8;
8702 EXPECT_EQ("/*\n"
8703 "\t a\t\tcomment\n"
8704 "\t in multiple lines\n"
8705 " */",
8706 format(" /*\t \t \n"
8707 " \t \t a\t\tcomment\t \t\n"
8708 " \t \t in multiple lines\t\n"
8709 " \t */",
8710 Tab));
8711 verifyFormat("{\n"
8712 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8713 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8714 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8715 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8716 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8717 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8718 "};",
8719 Tab);
8720 verifyFormat("enum AA {\n"
8721 "\ta1, // Force multiple lines\n"
8722 "\ta2,\n"
8723 "\ta3\n"
8724 "};",
8725 Tab);
8726 EXPECT_EQ("if (aaaaaaaa && // q\n"
8727 " bb) // w\n"
8728 "\t;",
8729 format("if (aaaaaaaa &&// q\n"
8730 "bb)// w\n"
8731 ";",
8732 Tab));
8733 verifyFormat("class X {\n"
8734 "\tvoid f() {\n"
8735 "\t\tsomeFunction(parameter1,\n"
8736 "\t\t\t parameter2);\n"
8737 "\t}\n"
8738 "};",
8739 Tab);
8740 verifyFormat("{\n"
8741 "\tQ(\n"
8742 "\t {\n"
8743 "\t\t int a;\n"
8744 "\t\t someFunction(aaaaaaaa,\n"
8745 "\t\t\t\t bbbbbbb);\n"
8746 "\t },\n"
8747 "\t p);\n"
8748 "}",
8749 Tab);
8750 EXPECT_EQ("{\n"
8751 "\t/* aaaa\n"
8752 "\t bbbb */\n"
8753 "}",
8754 format("{\n"
8755 "/* aaaa\n"
8756 " bbbb */\n"
8757 "}",
8758 Tab));
8759 EXPECT_EQ("{\n"
8760 "\t/*\n"
8761 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8762 "\t bbbbbbbbbbbbb\n"
8763 "\t*/\n"
8764 "}",
8765 format("{\n"
8766 "/*\n"
8767 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8768 "*/\n"
8769 "}",
8770 Tab));
8771 EXPECT_EQ("{\n"
8772 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8773 "\t// bbbbbbbbbbbbb\n"
8774 "}",
8775 format("{\n"
8776 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8777 "}",
8778 Tab));
8779 EXPECT_EQ("{\n"
8780 "\t/*\n"
8781 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8782 "\t bbbbbbbbbbbbb\n"
8783 "\t*/\n"
8784 "}",
8785 format("{\n"
8786 "\t/*\n"
8787 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8788 "\t*/\n"
8789 "}",
8790 Tab));
8791 EXPECT_EQ("{\n"
8792 "\t/*\n"
8793 "\n"
8794 "\t*/\n"
8795 "}",
8796 format("{\n"
8797 "\t/*\n"
8798 "\n"
8799 "\t*/\n"
8800 "}",
8801 Tab));
8802 EXPECT_EQ("{\n"
8803 "\t/*\n"
8804 " asdf\n"
8805 "\t*/\n"
8806 "}",
8807 format("{\n"
8808 "\t/*\n"
8809 " asdf\n"
8810 "\t*/\n"
8811 "}",
8812 Tab));
8813 EXPECT_EQ("/*\n"
8814 "\t a\t\tcomment\n"
8815 "\t in multiple lines\n"
8816 " */",
8817 format(" /*\t \t \n"
8818 " \t \t a\t\tcomment\t \t\n"
8819 " \t \t in multiple lines\t\n"
8820 " \t */",
8821 Tab));
8822 EXPECT_EQ("/* some\n"
8823 " comment */",
8824 format(" \t \t /* some\n"
8825 " \t \t comment */",
8826 Tab));
8827 EXPECT_EQ("int a; /* some\n"
8828 " comment */",
8829 format(" \t \t int a; /* some\n"
8830 " \t \t comment */",
8831 Tab));
8832 EXPECT_EQ("int a; /* some\n"
8833 "comment */",
8834 format(" \t \t int\ta; /* some\n"
8835 " \t \t comment */",
8836 Tab));
8837 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8838 " comment */",
8839 format(" \t \t f(\"\t\t\"); /* some\n"
8840 " \t \t comment */",
8841 Tab));
8842 EXPECT_EQ("{\n"
8843 " /*\n"
8844 " * Comment\n"
8845 " */\n"
8846 " int i;\n"
8847 "}",
8848 format("{\n"
8849 "\t/*\n"
8850 "\t * Comment\n"
8851 "\t */\n"
8852 "\t int i;\n"
8853 "}"));
8854 Tab.AlignConsecutiveAssignments = true;
8855 Tab.AlignConsecutiveDeclarations = true;
8856 Tab.TabWidth = 4;
8857 Tab.IndentWidth = 4;
8858 verifyFormat("class Assign {\n"
8859 "\tvoid f() {\n"
8860 "\t\tint x = 123;\n"
8861 "\t\tint random = 4;\n"
8862 "\t\tstd::string alphabet =\n"
8863 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8864 "\t}\n"
8865 "};",
8866 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008867}
8868
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008869TEST_F(FormatTest, CalculatesOriginalColumn) {
8870 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8871 "q\"; /* some\n"
8872 " comment */",
8873 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8874 "q\"; /* some\n"
8875 " comment */",
8876 getLLVMStyle()));
8877 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8878 "/* some\n"
8879 " comment */",
8880 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8881 " /* some\n"
8882 " comment */",
8883 getLLVMStyle()));
8884 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8885 "qqq\n"
8886 "/* some\n"
8887 " comment */",
8888 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8889 "qqq\n"
8890 " /* some\n"
8891 " comment */",
8892 getLLVMStyle()));
8893 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8894 "wwww; /* some\n"
8895 " comment */",
8896 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8897 "wwww; /* some\n"
8898 " comment */",
8899 getLLVMStyle()));
8900}
8901
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008902TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008903 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008904 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008905
8906 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008907 " continue;",
8908 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008909 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008910 " continue;",
8911 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008912 verifyFormat("if(true)\n"
8913 " f();\n"
8914 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008915 " f();",
8916 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008917 verifyFormat("do {\n"
8918 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008919 "} while(something());",
8920 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008921 verifyFormat("switch(x) {\n"
8922 "default:\n"
8923 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008924 "}",
8925 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008926 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008927 verifyFormat("size_t x = sizeof(x);", NoSpace);
8928 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8929 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8930 verifyFormat("alignas(128) char a[128];", NoSpace);
8931 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8932 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8933 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008934 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008935 verifyFormat("T A::operator()();", NoSpace);
8936 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008937
8938 FormatStyle Space = getLLVMStyle();
8939 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8940
8941 verifyFormat("int f ();", Space);
8942 verifyFormat("void f (int a, T b) {\n"
8943 " while (true)\n"
8944 " continue;\n"
8945 "}",
8946 Space);
8947 verifyFormat("if (true)\n"
8948 " f ();\n"
8949 "else if (true)\n"
8950 " f ();",
8951 Space);
8952 verifyFormat("do {\n"
8953 " do_something ();\n"
8954 "} while (something ());",
8955 Space);
8956 verifyFormat("switch (x) {\n"
8957 "default:\n"
8958 " break;\n"
8959 "}",
8960 Space);
8961 verifyFormat("A::A () : a (1) {}", Space);
8962 verifyFormat("void f () __attribute__ ((asdf));", Space);
8963 verifyFormat("*(&a + 1);\n"
8964 "&((&a)[1]);\n"
8965 "a[(b + c) * d];\n"
8966 "(((a + 1) * 2) + 3) * 4;",
8967 Space);
8968 verifyFormat("#define A(x) x", Space);
8969 verifyFormat("#define A (x) x", Space);
8970 verifyFormat("#if defined(x)\n"
8971 "#endif",
8972 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008973 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008974 verifyFormat("size_t x = sizeof (x);", Space);
8975 verifyFormat("auto f (int x) -> decltype (x);", Space);
8976 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8977 verifyFormat("alignas (128) char a[128];", Space);
8978 verifyFormat("size_t x = alignof (MyType);", Space);
8979 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8980 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008981 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008982 verifyFormat("T A::operator() ();", Space);
8983 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008984}
8985
8986TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8987 FormatStyle Spaces = getLLVMStyle();
8988
8989 Spaces.SpacesInParentheses = true;
8990 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008991 verifyFormat("call();", Spaces);
8992 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008993 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8994 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008995 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008996 " continue;",
8997 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008998 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008999 " continue;",
9000 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009001 verifyFormat("if ( true )\n"
9002 " f();\n"
9003 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009004 " f();",
9005 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009006 verifyFormat("do {\n"
9007 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009008 "} while ( something() );",
9009 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009010 verifyFormat("switch ( x ) {\n"
9011 "default:\n"
9012 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009013 "}",
9014 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009015
9016 Spaces.SpacesInParentheses = false;
9017 Spaces.SpacesInCStyleCastParentheses = true;
9018 verifyFormat("Type *A = ( Type * )P;", Spaces);
9019 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9020 verifyFormat("x = ( int32 )y;", Spaces);
9021 verifyFormat("int a = ( int )(2.0f);", Spaces);
9022 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9023 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9024 verifyFormat("#define x (( int )-1)", Spaces);
9025
Daniel Jasper92e09822015-03-18 12:59:19 +00009026 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00009027 Spaces.SpacesInParentheses = false;
9028 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009029 Spaces.SpacesInCStyleCastParentheses = true;
9030 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009031 verifyFormat("call( );", Spaces);
9032 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009033 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009034 " continue;",
9035 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009036 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009037 " continue;",
9038 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009039 verifyFormat("if (true)\n"
9040 " f( );\n"
9041 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009042 " f( );",
9043 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009044 verifyFormat("do {\n"
9045 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009046 "} while (something( ));",
9047 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009048 verifyFormat("switch (x) {\n"
9049 "default:\n"
9050 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009051 "}",
9052 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009053
Daniel Jasper92e09822015-03-18 12:59:19 +00009054 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009055 Spaces.SpaceAfterCStyleCast = true;
9056 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009057 verifyFormat("call( );", Spaces);
9058 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009059 verifyFormat("while (( bool ) 1)\n"
9060 " continue;",
9061 Spaces);
9062 verifyFormat("for (;;)\n"
9063 " continue;",
9064 Spaces);
9065 verifyFormat("if (true)\n"
9066 " f( );\n"
9067 "else if (true)\n"
9068 " f( );",
9069 Spaces);
9070 verifyFormat("do {\n"
9071 " do_something(( int ) i);\n"
9072 "} while (something( ));",
9073 Spaces);
9074 verifyFormat("switch (x) {\n"
9075 "default:\n"
9076 " break;\n"
9077 "}",
9078 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009079
9080 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009081 Spaces.SpacesInCStyleCastParentheses = false;
9082 Spaces.SpaceAfterCStyleCast = true;
9083 verifyFormat("while ((bool) 1)\n"
9084 " continue;",
9085 Spaces);
9086 verifyFormat("do {\n"
9087 " do_something((int) i);\n"
9088 "} while (something( ));",
9089 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009090}
9091
Daniel Jasperad981f82014-08-26 11:41:14 +00009092TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9093 verifyFormat("int a[5];");
9094 verifyFormat("a[3] += 42;");
9095
9096 FormatStyle Spaces = getLLVMStyle();
9097 Spaces.SpacesInSquareBrackets = true;
9098 // Lambdas unchanged.
9099 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9100 verifyFormat("return [i, args...] {};", Spaces);
9101
9102 // Not lambdas.
9103 verifyFormat("int a[ 5 ];", Spaces);
9104 verifyFormat("a[ 3 ] += 42;", Spaces);
9105 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9106 verifyFormat("double &operator[](int i) { return 0; }\n"
9107 "int i;",
9108 Spaces);
9109 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9110 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9111 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9112}
9113
Daniel Jasperd94bff32013-09-25 15:15:02 +00009114TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9115 verifyFormat("int a = 5;");
9116 verifyFormat("a += 42;");
9117 verifyFormat("a or_eq 8;");
9118
9119 FormatStyle Spaces = getLLVMStyle();
9120 Spaces.SpaceBeforeAssignmentOperators = false;
9121 verifyFormat("int a= 5;", Spaces);
9122 verifyFormat("a+= 42;", Spaces);
9123 verifyFormat("a or_eq 8;", Spaces);
9124}
9125
Daniel Jaspera44991332015-04-29 13:06:49 +00009126TEST_F(FormatTest, AlignConsecutiveAssignments) {
9127 FormatStyle Alignment = getLLVMStyle();
9128 Alignment.AlignConsecutiveAssignments = false;
9129 verifyFormat("int a = 5;\n"
9130 "int oneTwoThree = 123;",
9131 Alignment);
9132 verifyFormat("int a = 5;\n"
9133 "int oneTwoThree = 123;",
9134 Alignment);
9135
9136 Alignment.AlignConsecutiveAssignments = true;
9137 verifyFormat("int a = 5;\n"
9138 "int oneTwoThree = 123;",
9139 Alignment);
9140 verifyFormat("int a = method();\n"
9141 "int oneTwoThree = 133;",
9142 Alignment);
9143 verifyFormat("a &= 5;\n"
9144 "bcd *= 5;\n"
9145 "ghtyf += 5;\n"
9146 "dvfvdb -= 5;\n"
9147 "a /= 5;\n"
9148 "vdsvsv %= 5;\n"
9149 "sfdbddfbdfbb ^= 5;\n"
9150 "dvsdsv |= 5;\n"
9151 "int dsvvdvsdvvv = 123;",
9152 Alignment);
9153 verifyFormat("int i = 1, j = 10;\n"
9154 "something = 2000;",
9155 Alignment);
9156 verifyFormat("something = 2000;\n"
9157 "int i = 1, j = 10;\n",
9158 Alignment);
9159 verifyFormat("something = 2000;\n"
9160 "another = 911;\n"
9161 "int i = 1, j = 10;\n"
9162 "oneMore = 1;\n"
9163 "i = 2;",
9164 Alignment);
9165 verifyFormat("int a = 5;\n"
9166 "int one = 1;\n"
9167 "method();\n"
9168 "int oneTwoThree = 123;\n"
9169 "int oneTwo = 12;",
9170 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009171 verifyFormat("int oneTwoThree = 123;\n"
9172 "int oneTwo = 12;\n"
9173 "method();\n",
9174 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009175 verifyFormat("int oneTwoThree = 123; // comment\n"
9176 "int oneTwo = 12; // comment",
9177 Alignment);
9178 EXPECT_EQ("int a = 5;\n"
9179 "\n"
9180 "int oneTwoThree = 123;",
9181 format("int a = 5;\n"
9182 "\n"
9183 "int oneTwoThree= 123;",
9184 Alignment));
9185 EXPECT_EQ("int a = 5;\n"
9186 "int one = 1;\n"
9187 "\n"
9188 "int oneTwoThree = 123;",
9189 format("int a = 5;\n"
9190 "int one = 1;\n"
9191 "\n"
9192 "int oneTwoThree = 123;",
9193 Alignment));
9194 EXPECT_EQ("int a = 5;\n"
9195 "int one = 1;\n"
9196 "\n"
9197 "int oneTwoThree = 123;\n"
9198 "int oneTwo = 12;",
9199 format("int a = 5;\n"
9200 "int one = 1;\n"
9201 "\n"
9202 "int oneTwoThree = 123;\n"
9203 "int oneTwo = 12;",
9204 Alignment));
9205 Alignment.AlignEscapedNewlinesLeft = true;
9206 verifyFormat("#define A \\\n"
9207 " int aaaa = 12; \\\n"
9208 " int b = 23; \\\n"
9209 " int ccc = 234; \\\n"
9210 " int dddddddddd = 2345;",
9211 Alignment);
9212 Alignment.AlignEscapedNewlinesLeft = false;
9213 verifyFormat("#define A "
9214 " \\\n"
9215 " int aaaa = 12; "
9216 " \\\n"
9217 " int b = 23; "
9218 " \\\n"
9219 " int ccc = 234; "
9220 " \\\n"
9221 " int dddddddddd = 2345;",
9222 Alignment);
9223 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9224 "k = 4, int l = 5,\n"
9225 " int m = 6) {\n"
9226 " int j = 10;\n"
9227 " otherThing = 1;\n"
9228 "}",
9229 Alignment);
9230 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9231 " int i = 1;\n"
9232 " int j = 2;\n"
9233 " int big = 10000;\n"
9234 "}",
9235 Alignment);
9236 verifyFormat("class C {\n"
9237 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009238 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009239 " virtual void f() = 0;\n"
9240 "};",
9241 Alignment);
9242 verifyFormat("int i = 1;\n"
9243 "if (SomeType t = getSomething()) {\n"
9244 "}\n"
9245 "int j = 2;\n"
9246 "int big = 10000;",
9247 Alignment);
9248 verifyFormat("int j = 7;\n"
9249 "for (int k = 0; k < N; ++k) {\n"
9250 "}\n"
9251 "int j = 2;\n"
9252 "int big = 10000;\n"
9253 "}",
9254 Alignment);
9255 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9256 verifyFormat("int i = 1;\n"
9257 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9258 " = someLooooooooooooooooongFunction();\n"
9259 "int j = 2;",
9260 Alignment);
9261 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9262 verifyFormat("int i = 1;\n"
9263 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9264 " someLooooooooooooooooongFunction();\n"
9265 "int j = 2;",
9266 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009267
9268 verifyFormat("auto lambda = []() {\n"
9269 " auto i = 0;\n"
9270 " return 0;\n"
9271 "};\n"
9272 "int i = 0;\n"
9273 "auto v = type{\n"
9274 " i = 1, //\n"
9275 " (i = 2), //\n"
9276 " i = 3 //\n"
9277 "};",
9278 Alignment);
9279
Daniel Jaspera44991332015-04-29 13:06:49 +00009280 // FIXME: Should align all three assignments
9281 verifyFormat(
9282 "int i = 1;\n"
9283 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9284 " loooooooooooooooooooooongParameterB);\n"
9285 "int j = 2;",
9286 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009287
9288 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9289 " typename B = very_long_type_name_1,\n"
9290 " typename T_2 = very_long_type_name_2>\n"
9291 "auto foo() {}\n",
9292 Alignment);
9293 verifyFormat("int a, b = 1;\n"
9294 "int c = 2;\n"
9295 "int dd = 3;\n",
9296 Alignment);
9297 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9298 "float b[1][] = {{3.f}};\n",
9299 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009300}
9301
Daniel Jaspere12597c2015-10-01 10:06:54 +00009302TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9303 FormatStyle Alignment = getLLVMStyle();
9304 Alignment.AlignConsecutiveDeclarations = false;
9305 verifyFormat("float const a = 5;\n"
9306 "int oneTwoThree = 123;",
9307 Alignment);
9308 verifyFormat("int a = 5;\n"
9309 "float const oneTwoThree = 123;",
9310 Alignment);
9311
9312 Alignment.AlignConsecutiveDeclarations = true;
9313 verifyFormat("float const a = 5;\n"
9314 "int oneTwoThree = 123;",
9315 Alignment);
9316 verifyFormat("int a = method();\n"
9317 "float const oneTwoThree = 133;",
9318 Alignment);
9319 verifyFormat("int i = 1, j = 10;\n"
9320 "something = 2000;",
9321 Alignment);
9322 verifyFormat("something = 2000;\n"
9323 "int i = 1, j = 10;\n",
9324 Alignment);
9325 verifyFormat("float something = 2000;\n"
9326 "double another = 911;\n"
9327 "int i = 1, j = 10;\n"
9328 "const int *oneMore = 1;\n"
9329 "unsigned i = 2;",
9330 Alignment);
9331 verifyFormat("float a = 5;\n"
9332 "int one = 1;\n"
9333 "method();\n"
9334 "const double oneTwoThree = 123;\n"
9335 "const unsigned int oneTwo = 12;",
9336 Alignment);
9337 verifyFormat("int oneTwoThree{0}; // comment\n"
9338 "unsigned oneTwo; // comment",
9339 Alignment);
9340 EXPECT_EQ("float const a = 5;\n"
9341 "\n"
9342 "int oneTwoThree = 123;",
9343 format("float const a = 5;\n"
9344 "\n"
9345 "int oneTwoThree= 123;",
9346 Alignment));
9347 EXPECT_EQ("float a = 5;\n"
9348 "int one = 1;\n"
9349 "\n"
9350 "unsigned oneTwoThree = 123;",
9351 format("float a = 5;\n"
9352 "int one = 1;\n"
9353 "\n"
9354 "unsigned oneTwoThree = 123;",
9355 Alignment));
9356 EXPECT_EQ("float a = 5;\n"
9357 "int one = 1;\n"
9358 "\n"
9359 "unsigned oneTwoThree = 123;\n"
9360 "int oneTwo = 12;",
9361 format("float a = 5;\n"
9362 "int one = 1;\n"
9363 "\n"
9364 "unsigned oneTwoThree = 123;\n"
9365 "int oneTwo = 12;",
9366 Alignment));
9367 Alignment.AlignConsecutiveAssignments = true;
9368 verifyFormat("float something = 2000;\n"
9369 "double another = 911;\n"
9370 "int i = 1, j = 10;\n"
9371 "const int *oneMore = 1;\n"
9372 "unsigned i = 2;",
9373 Alignment);
9374 verifyFormat("int oneTwoThree = {0}; // comment\n"
9375 "unsigned oneTwo = 0; // comment",
9376 Alignment);
9377 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9378 " int const i = 1;\n"
9379 " int * j = 2;\n"
9380 " int big = 10000;\n"
9381 "\n"
9382 " unsigned oneTwoThree = 123;\n"
9383 " int oneTwo = 12;\n"
9384 " method();\n"
9385 " float k = 2;\n"
9386 " int ll = 10000;\n"
9387 "}",
9388 format("void SomeFunction(int parameter= 0) {\n"
9389 " int const i= 1;\n"
9390 " int *j=2;\n"
9391 " int big = 10000;\n"
9392 "\n"
9393 "unsigned oneTwoThree =123;\n"
9394 "int oneTwo = 12;\n"
9395 " method();\n"
9396 "float k= 2;\n"
9397 "int ll=10000;\n"
9398 "}",
9399 Alignment));
9400 Alignment.AlignConsecutiveAssignments = false;
9401 Alignment.AlignEscapedNewlinesLeft = true;
9402 verifyFormat("#define A \\\n"
9403 " int aaaa = 12; \\\n"
9404 " float b = 23; \\\n"
9405 " const int ccc = 234; \\\n"
9406 " unsigned dddddddddd = 2345;",
9407 Alignment);
9408 Alignment.AlignEscapedNewlinesLeft = false;
9409 Alignment.ColumnLimit = 30;
9410 verifyFormat("#define A \\\n"
9411 " int aaaa = 12; \\\n"
9412 " float b = 23; \\\n"
9413 " const int ccc = 234; \\\n"
9414 " int dddddddddd = 2345;",
9415 Alignment);
9416 Alignment.ColumnLimit = 80;
9417 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9418 "k = 4, int l = 5,\n"
9419 " int m = 6) {\n"
9420 " const int j = 10;\n"
9421 " otherThing = 1;\n"
9422 "}",
9423 Alignment);
9424 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9425 " int const i = 1;\n"
9426 " int * j = 2;\n"
9427 " int big = 10000;\n"
9428 "}",
9429 Alignment);
9430 verifyFormat("class C {\n"
9431 "public:\n"
9432 " int i = 1;\n"
9433 " virtual void f() = 0;\n"
9434 "};",
9435 Alignment);
9436 verifyFormat("float i = 1;\n"
9437 "if (SomeType t = getSomething()) {\n"
9438 "}\n"
9439 "const unsigned j = 2;\n"
9440 "int big = 10000;",
9441 Alignment);
9442 verifyFormat("float j = 7;\n"
9443 "for (int k = 0; k < N; ++k) {\n"
9444 "}\n"
9445 "unsigned j = 2;\n"
9446 "int big = 10000;\n"
9447 "}",
9448 Alignment);
9449 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9450 verifyFormat("float i = 1;\n"
9451 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9452 " = someLooooooooooooooooongFunction();\n"
9453 "int j = 2;",
9454 Alignment);
9455 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9456 verifyFormat("int i = 1;\n"
9457 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9458 " someLooooooooooooooooongFunction();\n"
9459 "int j = 2;",
9460 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009461
9462 Alignment.AlignConsecutiveAssignments = true;
9463 verifyFormat("auto lambda = []() {\n"
9464 " auto ii = 0;\n"
9465 " float j = 0;\n"
9466 " return 0;\n"
9467 "};\n"
9468 "int i = 0;\n"
9469 "float i2 = 0;\n"
9470 "auto v = type{\n"
9471 " i = 1, //\n"
9472 " (i = 2), //\n"
9473 " i = 3 //\n"
9474 "};",
9475 Alignment);
9476 Alignment.AlignConsecutiveAssignments = false;
9477
Daniel Jaspere12597c2015-10-01 10:06:54 +00009478 // FIXME: Should align all three declarations
9479 verifyFormat(
9480 "int i = 1;\n"
9481 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9482 " loooooooooooooooooooooongParameterB);\n"
9483 "int j = 2;",
9484 Alignment);
9485
9486 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9487 // We expect declarations and assignments to align, as long as it doesn't
9488 // exceed the column limit, starting a new alignemnt sequence whenever it
9489 // happens.
9490 Alignment.AlignConsecutiveAssignments = true;
9491 Alignment.ColumnLimit = 30;
9492 verifyFormat("float ii = 1;\n"
9493 "unsigned j = 2;\n"
9494 "int someVerylongVariable = 1;\n"
9495 "AnotherLongType ll = 123456;\n"
9496 "VeryVeryLongType k = 2;\n"
9497 "int myvar = 1;",
9498 Alignment);
9499 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009500 Alignment.AlignConsecutiveAssignments = false;
9501
9502 verifyFormat(
9503 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9504 " typename LongType, typename B>\n"
9505 "auto foo() {}\n",
9506 Alignment);
9507 verifyFormat("float a, b = 1;\n"
9508 "int c = 2;\n"
9509 "int dd = 3;\n",
9510 Alignment);
9511 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9512 "float b[1][] = {{3.f}};\n",
9513 Alignment);
9514 Alignment.AlignConsecutiveAssignments = true;
9515 verifyFormat("float a, b = 1;\n"
9516 "int c = 2;\n"
9517 "int dd = 3;\n",
9518 Alignment);
9519 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9520 "float b[1][] = {{3.f}};\n",
9521 Alignment);
9522 Alignment.AlignConsecutiveAssignments = false;
9523
9524 Alignment.ColumnLimit = 30;
9525 Alignment.BinPackParameters = false;
9526 verifyFormat("void foo(float a,\n"
9527 " float b,\n"
9528 " int c,\n"
9529 " uint32_t *d) {\n"
9530 " int * e = 0;\n"
9531 " float f = 0;\n"
9532 " double g = 0;\n"
9533 "}\n"
9534 "void bar(ino_t a,\n"
9535 " int b,\n"
9536 " uint32_t *c,\n"
9537 " bool d) {}\n",
9538 Alignment);
9539 Alignment.BinPackParameters = true;
9540 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009541}
9542
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009543TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009544 FormatStyle LinuxBraceStyle = getLLVMStyle();
9545 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009546 verifyFormat("namespace a\n"
9547 "{\n"
9548 "class A\n"
9549 "{\n"
9550 " void f()\n"
9551 " {\n"
9552 " if (true) {\n"
9553 " a();\n"
9554 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009555 " } else {\n"
9556 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009557 " }\n"
9558 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009559 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009560 "};\n"
9561 "struct B {\n"
9562 " int x;\n"
9563 "};\n"
9564 "}\n",
9565 LinuxBraceStyle);
9566 verifyFormat("enum X {\n"
9567 " Y = 0,\n"
9568 "}\n",
9569 LinuxBraceStyle);
9570 verifyFormat("struct S {\n"
9571 " int Type;\n"
9572 " union {\n"
9573 " int x;\n"
9574 " double y;\n"
9575 " } Value;\n"
9576 " class C\n"
9577 " {\n"
9578 " MyFavoriteType Value;\n"
9579 " } Class;\n"
9580 "}\n",
9581 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009582}
9583
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009584TEST_F(FormatTest, MozillaBraceBreaking) {
9585 FormatStyle MozillaBraceStyle = getLLVMStyle();
9586 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9587 verifyFormat("namespace a {\n"
9588 "class A\n"
9589 "{\n"
9590 " void f()\n"
9591 " {\n"
9592 " if (true) {\n"
9593 " a();\n"
9594 " b();\n"
9595 " }\n"
9596 " }\n"
9597 " void g() { return; }\n"
9598 "};\n"
9599 "enum E\n"
9600 "{\n"
9601 " A,\n"
9602 " // foo\n"
9603 " B,\n"
9604 " C\n"
9605 "};\n"
9606 "struct B\n"
9607 "{\n"
9608 " int x;\n"
9609 "};\n"
9610 "}\n",
9611 MozillaBraceStyle);
9612 verifyFormat("struct S\n"
9613 "{\n"
9614 " int Type;\n"
9615 " union\n"
9616 " {\n"
9617 " int x;\n"
9618 " double y;\n"
9619 " } Value;\n"
9620 " class C\n"
9621 " {\n"
9622 " MyFavoriteType Value;\n"
9623 " } Class;\n"
9624 "}\n",
9625 MozillaBraceStyle);
9626}
9627
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009628TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009629 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9630 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009631 verifyFormat("namespace a {\n"
9632 "class A {\n"
9633 " void f()\n"
9634 " {\n"
9635 " if (true) {\n"
9636 " a();\n"
9637 " b();\n"
9638 " }\n"
9639 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009640 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009641 "};\n"
9642 "struct B {\n"
9643 " int x;\n"
9644 "};\n"
9645 "}\n",
9646 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009647
Daniel Jasperd9670872014-08-05 12:06:20 +00009648 verifyFormat("void foo()\n"
9649 "{\n"
9650 " if (a) {\n"
9651 " a();\n"
9652 " }\n"
9653 " else {\n"
9654 " b();\n"
9655 " }\n"
9656 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009657 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009658
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009659 verifyFormat("#ifdef _DEBUG\n"
9660 "int foo(int i = 0)\n"
9661 "#else\n"
9662 "int foo(int i = 5)\n"
9663 "#endif\n"
9664 "{\n"
9665 " return i;\n"
9666 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009667 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009668
9669 verifyFormat("void foo() {}\n"
9670 "void bar()\n"
9671 "#ifdef _DEBUG\n"
9672 "{\n"
9673 " foo();\n"
9674 "}\n"
9675 "#else\n"
9676 "{\n"
9677 "}\n"
9678 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009679 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009680
9681 verifyFormat("void foobar() { int i = 5; }\n"
9682 "#ifdef _DEBUG\n"
9683 "void bar() {}\n"
9684 "#else\n"
9685 "void bar() { foobar(); }\n"
9686 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009687 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009688}
9689
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009690TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009691 FormatStyle AllmanBraceStyle = getLLVMStyle();
9692 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009693 verifyFormat("namespace a\n"
9694 "{\n"
9695 "class A\n"
9696 "{\n"
9697 " void f()\n"
9698 " {\n"
9699 " if (true)\n"
9700 " {\n"
9701 " a();\n"
9702 " b();\n"
9703 " }\n"
9704 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009705 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009706 "};\n"
9707 "struct B\n"
9708 "{\n"
9709 " int x;\n"
9710 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009711 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009712 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009713
9714 verifyFormat("void f()\n"
9715 "{\n"
9716 " if (true)\n"
9717 " {\n"
9718 " a();\n"
9719 " }\n"
9720 " else if (false)\n"
9721 " {\n"
9722 " b();\n"
9723 " }\n"
9724 " else\n"
9725 " {\n"
9726 " c();\n"
9727 " }\n"
9728 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009729 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009730
9731 verifyFormat("void f()\n"
9732 "{\n"
9733 " for (int i = 0; i < 10; ++i)\n"
9734 " {\n"
9735 " a();\n"
9736 " }\n"
9737 " while (false)\n"
9738 " {\n"
9739 " b();\n"
9740 " }\n"
9741 " do\n"
9742 " {\n"
9743 " c();\n"
9744 " } while (false)\n"
9745 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009746 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009747
9748 verifyFormat("void f(int a)\n"
9749 "{\n"
9750 " switch (a)\n"
9751 " {\n"
9752 " case 0:\n"
9753 " break;\n"
9754 " case 1:\n"
9755 " {\n"
9756 " break;\n"
9757 " }\n"
9758 " case 2:\n"
9759 " {\n"
9760 " }\n"
9761 " break;\n"
9762 " default:\n"
9763 " break;\n"
9764 " }\n"
9765 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009766 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009767
9768 verifyFormat("enum X\n"
9769 "{\n"
9770 " Y = 0,\n"
9771 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009772 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009773 verifyFormat("enum X\n"
9774 "{\n"
9775 " Y = 0\n"
9776 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009777 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009778
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009779 verifyFormat("@interface BSApplicationController ()\n"
9780 "{\n"
9781 "@private\n"
9782 " id _extraIvar;\n"
9783 "}\n"
9784 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009785 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009786
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009787 verifyFormat("#ifdef _DEBUG\n"
9788 "int foo(int i = 0)\n"
9789 "#else\n"
9790 "int foo(int i = 5)\n"
9791 "#endif\n"
9792 "{\n"
9793 " return i;\n"
9794 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009795 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009796
9797 verifyFormat("void foo() {}\n"
9798 "void bar()\n"
9799 "#ifdef _DEBUG\n"
9800 "{\n"
9801 " foo();\n"
9802 "}\n"
9803 "#else\n"
9804 "{\n"
9805 "}\n"
9806 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009807 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009808
9809 verifyFormat("void foobar() { int i = 5; }\n"
9810 "#ifdef _DEBUG\n"
9811 "void bar() {}\n"
9812 "#else\n"
9813 "void bar() { foobar(); }\n"
9814 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009815 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009816
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009817 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009818 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009819 " // ...\n"
9820 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009821 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009822 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009823 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009824 " // ...\n"
9825 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009826 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009827 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009828 // .. or dict literals.
9829 verifyFormat("void f()\n"
9830 "{\n"
9831 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9832 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009833 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009834 verifyFormat("int f()\n"
9835 "{ // comment\n"
9836 " return 42;\n"
9837 "}",
9838 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009839
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009840 AllmanBraceStyle.ColumnLimit = 19;
9841 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9842 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009843 verifyFormat("void f()\n"
9844 "{\n"
9845 " int i;\n"
9846 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009847 AllmanBraceStyle);
9848 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009849
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009850 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009851 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9852 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9853 verifyFormat("void f(bool b)\n"
9854 "{\n"
9855 " if (b)\n"
9856 " {\n"
9857 " return;\n"
9858 " }\n"
9859 "}\n",
9860 BreakBeforeBraceShortIfs);
9861 verifyFormat("void f(bool b)\n"
9862 "{\n"
9863 " if (b) return;\n"
9864 "}\n",
9865 BreakBeforeBraceShortIfs);
9866 verifyFormat("void f(bool b)\n"
9867 "{\n"
9868 " while (b)\n"
9869 " {\n"
9870 " return;\n"
9871 " }\n"
9872 "}\n",
9873 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009874}
9875
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009876TEST_F(FormatTest, GNUBraceBreaking) {
9877 FormatStyle GNUBraceStyle = getLLVMStyle();
9878 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9879 verifyFormat("namespace a\n"
9880 "{\n"
9881 "class A\n"
9882 "{\n"
9883 " void f()\n"
9884 " {\n"
9885 " int a;\n"
9886 " {\n"
9887 " int b;\n"
9888 " }\n"
9889 " if (true)\n"
9890 " {\n"
9891 " a();\n"
9892 " b();\n"
9893 " }\n"
9894 " }\n"
9895 " void g() { return; }\n"
9896 "}\n"
9897 "}",
9898 GNUBraceStyle);
9899
9900 verifyFormat("void f()\n"
9901 "{\n"
9902 " if (true)\n"
9903 " {\n"
9904 " a();\n"
9905 " }\n"
9906 " else if (false)\n"
9907 " {\n"
9908 " b();\n"
9909 " }\n"
9910 " else\n"
9911 " {\n"
9912 " c();\n"
9913 " }\n"
9914 "}\n",
9915 GNUBraceStyle);
9916
9917 verifyFormat("void f()\n"
9918 "{\n"
9919 " for (int i = 0; i < 10; ++i)\n"
9920 " {\n"
9921 " a();\n"
9922 " }\n"
9923 " while (false)\n"
9924 " {\n"
9925 " b();\n"
9926 " }\n"
9927 " do\n"
9928 " {\n"
9929 " c();\n"
9930 " }\n"
9931 " while (false);\n"
9932 "}\n",
9933 GNUBraceStyle);
9934
9935 verifyFormat("void f(int a)\n"
9936 "{\n"
9937 " switch (a)\n"
9938 " {\n"
9939 " case 0:\n"
9940 " break;\n"
9941 " case 1:\n"
9942 " {\n"
9943 " break;\n"
9944 " }\n"
9945 " case 2:\n"
9946 " {\n"
9947 " }\n"
9948 " break;\n"
9949 " default:\n"
9950 " break;\n"
9951 " }\n"
9952 "}\n",
9953 GNUBraceStyle);
9954
9955 verifyFormat("enum X\n"
9956 "{\n"
9957 " Y = 0,\n"
9958 "}\n",
9959 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009960
9961 verifyFormat("@interface BSApplicationController ()\n"
9962 "{\n"
9963 "@private\n"
9964 " id _extraIvar;\n"
9965 "}\n"
9966 "@end\n",
9967 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009968
9969 verifyFormat("#ifdef _DEBUG\n"
9970 "int foo(int i = 0)\n"
9971 "#else\n"
9972 "int foo(int i = 5)\n"
9973 "#endif\n"
9974 "{\n"
9975 " return i;\n"
9976 "}",
9977 GNUBraceStyle);
9978
9979 verifyFormat("void foo() {}\n"
9980 "void bar()\n"
9981 "#ifdef _DEBUG\n"
9982 "{\n"
9983 " foo();\n"
9984 "}\n"
9985 "#else\n"
9986 "{\n"
9987 "}\n"
9988 "#endif",
9989 GNUBraceStyle);
9990
9991 verifyFormat("void foobar() { int i = 5; }\n"
9992 "#ifdef _DEBUG\n"
9993 "void bar() {}\n"
9994 "#else\n"
9995 "void bar() { foobar(); }\n"
9996 "#endif",
9997 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009998}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009999
10000TEST_F(FormatTest, WebKitBraceBreaking) {
10001 FormatStyle WebKitBraceStyle = getLLVMStyle();
10002 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
10003 verifyFormat("namespace a {\n"
10004 "class A {\n"
10005 " void f()\n"
10006 " {\n"
10007 " if (true) {\n"
10008 " a();\n"
10009 " b();\n"
10010 " }\n"
10011 " }\n"
10012 " void g() { return; }\n"
10013 "};\n"
10014 "enum E {\n"
10015 " A,\n"
10016 " // foo\n"
10017 " B,\n"
10018 " C\n"
10019 "};\n"
10020 "struct B {\n"
10021 " int x;\n"
10022 "};\n"
10023 "}\n",
10024 WebKitBraceStyle);
10025 verifyFormat("struct S {\n"
10026 " int Type;\n"
10027 " union {\n"
10028 " int x;\n"
10029 " double y;\n"
10030 " } Value;\n"
10031 " class C {\n"
10032 " MyFavoriteType Value;\n"
10033 " } Class;\n"
10034 "};\n",
10035 WebKitBraceStyle);
10036}
10037
Manuel Klimekd5735502013-08-12 03:51:17 +000010038TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10039 verifyFormat("void f() {\n"
10040 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010041 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010042 " }\n"
10043 "}\n",
10044 getLLVMStyle());
10045}
10046
Daniel Jasper9613c812013-08-07 16:29:23 +000010047TEST_F(FormatTest, UnderstandsPragmas) {
10048 verifyFormat("#pragma omp reduction(| : var)");
10049 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010050
10051 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10052 "(including parentheses).",
10053 format("#pragma mark Any non-hyphenated or hyphenated string "
10054 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010055}
10056
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010057TEST_F(FormatTest, UnderstandPragmaOption) {
10058 verifyFormat("#pragma option -C -A");
10059
10060 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10061}
10062
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010063#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10064 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010065 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10066 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010067
10068TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010069 SmallVector<FormatStyle, 3> Styles;
10070 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010071
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010072 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010073 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10074 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10075 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010076
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010077 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010078 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10079 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10080 EXPECT_ALL_STYLES_EQUAL(Styles);
10081
Nico Weber514ecc82014-02-02 20:50:45 +000010082 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010083 EXPECT_TRUE(
10084 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10085 EXPECT_TRUE(
10086 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10087 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010088
Nico Weber514ecc82014-02-02 20:50:45 +000010089 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010090 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10091 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10092 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010093
10094 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010095 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10096 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10097 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010098
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010099 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010100 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10101 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10102 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010103
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010104 Styles[0] = getGNUStyle();
10105 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10106 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10107 EXPECT_ALL_STYLES_EQUAL(Styles);
10108
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010109 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10110}
10111
10112TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10113 SmallVector<FormatStyle, 8> Styles;
10114 Styles.resize(2);
10115
10116 Styles[0] = getGoogleStyle();
10117 Styles[1] = getLLVMStyle();
10118 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10119 EXPECT_ALL_STYLES_EQUAL(Styles);
10120
10121 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010122 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010123 Styles[1] = getLLVMStyle();
10124 Styles[1].Language = FormatStyle::LK_JavaScript;
10125 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10126
10127 Styles[2] = getLLVMStyle();
10128 Styles[2].Language = FormatStyle::LK_JavaScript;
10129 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10130 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010131 &Styles[2])
10132 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010133
10134 Styles[3] = getLLVMStyle();
10135 Styles[3].Language = FormatStyle::LK_JavaScript;
10136 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10137 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010138 &Styles[3])
10139 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010140
10141 Styles[4] = getLLVMStyle();
10142 Styles[4].Language = FormatStyle::LK_JavaScript;
10143 EXPECT_EQ(0, parseConfiguration("---\n"
10144 "BasedOnStyle: LLVM\n"
10145 "IndentWidth: 123\n"
10146 "---\n"
10147 "BasedOnStyle: Google\n"
10148 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010149 &Styles[4])
10150 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010151 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010152}
10153
Daniel Jasper91881d92014-09-29 08:07:46 +000010154#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010155 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010156 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010157 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010158 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010159 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010160
Daniel Jasper91881d92014-09-29 08:07:46 +000010161#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10162
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010163#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10164 Style.STRUCT.FIELD = false; \
10165 EXPECT_EQ(0, \
10166 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10167 .value()); \
10168 EXPECT_TRUE(Style.STRUCT.FIELD); \
10169 EXPECT_EQ(0, \
10170 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10171 .value()); \
10172 EXPECT_FALSE(Style.STRUCT.FIELD);
10173
10174#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10175 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10176
Daniel Jasper00853002014-09-16 16:22:30 +000010177#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10178 EXPECT_NE(VALUE, Style.FIELD); \
10179 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10180 EXPECT_EQ(VALUE, Style.FIELD)
10181
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010182TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010183 FormatStyle Style = {};
10184 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010185 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +000010186 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010187 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010188 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010189 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010190 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010191 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010192 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010193 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010194 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010195 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010196 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010197 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010198 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010199 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +000010200 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010201 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010202 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010203 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010204 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010205 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010206 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010207 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010208 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010209 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010210 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010211 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010212 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010213 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010214 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010215 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010216 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010217 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010218 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010219 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010220 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010221 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010222 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010223
10224 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10225 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10226 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10227 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10228 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10229 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10230 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10231 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
10232 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10233 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10234 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010235}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010236
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010237#undef CHECK_PARSE_BOOL
10238
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010239TEST_F(FormatTest, ParsesConfiguration) {
10240 FormatStyle Style = {};
10241 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010242 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010243 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10244 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010245 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010246 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10247 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010248 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10249 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010250 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10251 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10252 PenaltyReturnTypeOnItsOwnLine, 1234u);
10253 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10254 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010255 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010256 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010257 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010258
Daniel Jasper553d4872014-06-17 12:40:34 +000010259 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010260 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10261 FormatStyle::PAS_Left);
10262 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10263 FormatStyle::PAS_Right);
10264 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10265 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010266 // For backward compatibility:
10267 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10268 FormatStyle::PAS_Left);
10269 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10270 FormatStyle::PAS_Right);
10271 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10272 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010273
Alexander Kornienkod6538332013-05-07 15:32:14 +000010274 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010275 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10276 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010277 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10278 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10279 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10280
Daniel Jasperac043c92014-09-15 11:11:00 +000010281 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010282 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10283 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010284 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10285 FormatStyle::BOS_None);
10286 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10287 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010288 // For backward compatibility:
10289 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10290 FormatStyle::BOS_None);
10291 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10292 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010293
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010294 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10295 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10296 FormatStyle::BAS_Align);
10297 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10298 FormatStyle::BAS_DontAlign);
10299 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10300 FormatStyle::BAS_AlwaysBreak);
10301 // For backward compatibility:
10302 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10303 FormatStyle::BAS_DontAlign);
10304 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10305 FormatStyle::BAS_Align);
10306
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010307 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010308 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10309 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10310 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010311 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10312 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010313 // For backward compatibility:
10314 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10315 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010316
Daniel Jasperd74cf402014-04-08 12:46:38 +000010317 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010318 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10319 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10320 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10321 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010322 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10323 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010324 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10325 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010326 // For backward compatibility:
10327 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10328 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10329 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10330 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010331
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010332 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10333 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10334 FormatStyle::SBPO_Never);
10335 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10336 FormatStyle::SBPO_Always);
10337 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10338 FormatStyle::SBPO_ControlStatements);
10339 // For backward compatibility:
10340 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10341 FormatStyle::SBPO_Never);
10342 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10343 FormatStyle::SBPO_ControlStatements);
10344
Alexander Kornienkod6538332013-05-07 15:32:14 +000010345 Style.ColumnLimit = 123;
10346 FormatStyle BaseStyle = getLLVMStyle();
10347 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10348 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10349
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010350 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10351 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10352 FormatStyle::BS_Attach);
10353 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10354 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010355 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10356 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010357 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10358 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010359 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10360 FormatStyle::BS_Allman);
10361 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010362 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10363 FormatStyle::BS_WebKit);
10364 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10365 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010366
Zachary Turner448592e2015-12-18 22:20:15 +000010367 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10368 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10369 FormatStyle::RTBS_None);
10370 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10371 FormatStyle::RTBS_All);
10372 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010373 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010374 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10375 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10376 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10377 AlwaysBreakAfterReturnType,
10378 FormatStyle::RTBS_TopLevelDefinitions);
10379
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010380 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10381 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10382 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10383 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10384 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10385 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10386 AlwaysBreakAfterDefinitionReturnType,
10387 FormatStyle::DRTBS_TopLevel);
10388
Daniel Jasper65ee3472013-07-31 23:16:02 +000010389 Style.NamespaceIndentation = FormatStyle::NI_All;
10390 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10391 FormatStyle::NI_None);
10392 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10393 FormatStyle::NI_Inner);
10394 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10395 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010396
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010397 // FIXME: This is required because parsing a configuration simply overwrites
10398 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010399 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010400 std::vector<std::string> BoostForeach;
10401 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010402 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010403 std::vector<std::string> BoostAndQForeach;
10404 BoostAndQForeach.push_back("BOOST_FOREACH");
10405 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010406 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10407 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010408
10409 Style.IncludeCategories.clear();
10410 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10411 {".*", 1}};
10412 CHECK_PARSE("IncludeCategories:\n"
10413 " - Regex: abc/.*\n"
10414 " Priority: 2\n"
10415 " - Regex: .*\n"
10416 " Priority: 1",
10417 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010418 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010419}
10420
10421TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10422 FormatStyle Style = {};
10423 Style.Language = FormatStyle::LK_Cpp;
10424 CHECK_PARSE("Language: Cpp\n"
10425 "IndentWidth: 12",
10426 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010427 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10428 "IndentWidth: 34",
10429 &Style),
10430 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010431 EXPECT_EQ(12u, Style.IndentWidth);
10432 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10433 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10434
10435 Style.Language = FormatStyle::LK_JavaScript;
10436 CHECK_PARSE("Language: JavaScript\n"
10437 "IndentWidth: 12",
10438 IndentWidth, 12u);
10439 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010440 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10441 "IndentWidth: 34",
10442 &Style),
10443 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010444 EXPECT_EQ(23u, Style.IndentWidth);
10445 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10446 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10447
10448 CHECK_PARSE("BasedOnStyle: LLVM\n"
10449 "IndentWidth: 67",
10450 IndentWidth, 67u);
10451
10452 CHECK_PARSE("---\n"
10453 "Language: JavaScript\n"
10454 "IndentWidth: 12\n"
10455 "---\n"
10456 "Language: Cpp\n"
10457 "IndentWidth: 34\n"
10458 "...\n",
10459 IndentWidth, 12u);
10460
10461 Style.Language = FormatStyle::LK_Cpp;
10462 CHECK_PARSE("---\n"
10463 "Language: JavaScript\n"
10464 "IndentWidth: 12\n"
10465 "---\n"
10466 "Language: Cpp\n"
10467 "IndentWidth: 34\n"
10468 "...\n",
10469 IndentWidth, 34u);
10470 CHECK_PARSE("---\n"
10471 "IndentWidth: 78\n"
10472 "---\n"
10473 "Language: JavaScript\n"
10474 "IndentWidth: 56\n"
10475 "...\n",
10476 IndentWidth, 78u);
10477
10478 Style.ColumnLimit = 123;
10479 Style.IndentWidth = 234;
10480 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10481 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010482 EXPECT_FALSE(parseConfiguration("---\n"
10483 "IndentWidth: 456\n"
10484 "BreakBeforeBraces: Allman\n"
10485 "---\n"
10486 "Language: JavaScript\n"
10487 "IndentWidth: 111\n"
10488 "TabWidth: 111\n"
10489 "---\n"
10490 "Language: Cpp\n"
10491 "BreakBeforeBraces: Stroustrup\n"
10492 "TabWidth: 789\n"
10493 "...\n",
10494 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010495 EXPECT_EQ(123u, Style.ColumnLimit);
10496 EXPECT_EQ(456u, Style.IndentWidth);
10497 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10498 EXPECT_EQ(789u, Style.TabWidth);
10499
Rafael Espindola1f243172014-06-12 11:35:17 +000010500 EXPECT_EQ(parseConfiguration("---\n"
10501 "Language: JavaScript\n"
10502 "IndentWidth: 56\n"
10503 "---\n"
10504 "IndentWidth: 78\n"
10505 "...\n",
10506 &Style),
10507 ParseError::Error);
10508 EXPECT_EQ(parseConfiguration("---\n"
10509 "Language: JavaScript\n"
10510 "IndentWidth: 56\n"
10511 "---\n"
10512 "Language: JavaScript\n"
10513 "IndentWidth: 78\n"
10514 "...\n",
10515 &Style),
10516 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010517
10518 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10519}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010520
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010521#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010522
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010523TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10524 FormatStyle Style = {};
10525 Style.Language = FormatStyle::LK_JavaScript;
10526 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010527 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010528 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010529
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010530 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010531 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010532 "BasedOnStyle: Google\n"
10533 "---\n"
10534 "Language: JavaScript\n"
10535 "IndentWidth: 76\n"
10536 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010537 &Style)
10538 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010539 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010540 EXPECT_EQ(76u, Style.IndentWidth);
10541 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10542}
10543
Alexander Kornienkod6538332013-05-07 15:32:14 +000010544TEST_F(FormatTest, ConfigurationRoundTripTest) {
10545 FormatStyle Style = getLLVMStyle();
10546 std::string YAML = configurationAsText(Style);
10547 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010548 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010549 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10550 EXPECT_EQ(Style, ParsedStyle);
10551}
10552
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010553TEST_F(FormatTest, WorksFor8bitEncodings) {
10554 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10555 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10556 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10557 "\"\xef\xee\xf0\xf3...\"",
10558 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10559 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10560 "\xef\xee\xf0\xf3...\"",
10561 getLLVMStyleWithColumns(12)));
10562}
10563
Alexander Kornienko393e3082013-11-13 14:04:17 +000010564TEST_F(FormatTest, HandlesUTF8BOM) {
10565 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10566 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10567 format("\xef\xbb\xbf#include <iostream>"));
10568 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10569 format("\xef\xbb\xbf\n#include <iostream>"));
10570}
10571
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010572// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10573#if !defined(_MSC_VER)
10574
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010575TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10576 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10577 getLLVMStyleWithColumns(35));
10578 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010579 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010580 verifyFormat("// Однажды в студёную зимнюю пору...",
10581 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010582 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010583 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10584 getLLVMStyleWithColumns(39));
10585 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010586 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010587}
10588
10589TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010590 // Non-printable characters' width is currently considered to be the length in
10591 // bytes in UTF8. The characters can be displayed in very different manner
10592 // (zero-width, single width with a substitution glyph, expanded to their code
10593 // (e.g. "<8d>"), so there's no single correct way to handle them.
10594 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010595 "\"\xc2\x8d\";",
10596 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010597 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010598 "\"\xc2\x8d\";",
10599 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010600 EXPECT_EQ("\"Однажды, в \"\n"
10601 "\"студёную \"\n"
10602 "\"зимнюю \"\n"
10603 "\"пору,\"",
10604 format("\"Однажды, в студёную зимнюю пору,\"",
10605 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010606 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010607 "\"一 二 三 \"\n"
10608 "\"四 五六 \"\n"
10609 "\"七 八 九 \"\n"
10610 "\"十\"",
10611 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010612 EXPECT_EQ("\"一\t二 \"\n"
10613 "\"\t三 \"\n"
10614 "\"四 五\t六 \"\n"
10615 "\"\t七 \"\n"
10616 "\"八九十\tqq\"",
10617 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10618 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010619
10620 // UTF8 character in an escape sequence.
10621 EXPECT_EQ("\"aaaaaa\"\n"
10622 "\"\\\xC2\x8D\"",
10623 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010624}
10625
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010626TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10627 EXPECT_EQ("const char *sssss =\n"
10628 " \"一二三四五六七八\\\n"
10629 " 九 十\";",
10630 format("const char *sssss = \"一二三四五六七八\\\n"
10631 " 九 十\";",
10632 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010633}
10634
10635TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010636 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10637 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010638 EXPECT_EQ("// Я из лесу\n"
10639 "// вышел; был\n"
10640 "// сильный\n"
10641 "// мороз.",
10642 format("// Я из лесу вышел; был сильный мороз.",
10643 getLLVMStyleWithColumns(13)));
10644 EXPECT_EQ("// 一二三\n"
10645 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010646 "// 八 九\n"
10647 "// 十",
10648 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010649}
10650
10651TEST_F(FormatTest, SplitsUTF8BlockComments) {
10652 EXPECT_EQ("/* Гляжу,\n"
10653 " * поднимается\n"
10654 " * медленно в\n"
10655 " * гору\n"
10656 " * Лошадка,\n"
10657 " * везущая\n"
10658 " * хворосту\n"
10659 " * воз. */",
10660 format("/* Гляжу, поднимается медленно в гору\n"
10661 " * Лошадка, везущая хворосту воз. */",
10662 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010663 EXPECT_EQ(
10664 "/* 一二三\n"
10665 " * 四五六七\n"
10666 " * 八 九\n"
10667 " * 十 */",
10668 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010669 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10670 " * 𝕓𝕪𝕥𝕖\n"
10671 " * 𝖀𝕿𝕱-𝟠 */",
10672 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010673}
10674
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010675#endif // _MSC_VER
10676
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010677TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10678 FormatStyle Style = getLLVMStyle();
10679
10680 Style.ConstructorInitializerIndentWidth = 4;
10681 verifyFormat(
10682 "SomeClass::Constructor()\n"
10683 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10684 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10685 Style);
10686
10687 Style.ConstructorInitializerIndentWidth = 2;
10688 verifyFormat(
10689 "SomeClass::Constructor()\n"
10690 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10691 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10692 Style);
10693
10694 Style.ConstructorInitializerIndentWidth = 0;
10695 verifyFormat(
10696 "SomeClass::Constructor()\n"
10697 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10698 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10699 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010700 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10701 verifyFormat(
10702 "SomeLongTemplateVariableName<\n"
10703 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10704 Style);
10705 verifyFormat(
10706 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10707 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10708 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010709}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010710
Daniel Jasper00853002014-09-16 16:22:30 +000010711TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10712 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010713 Style.BreakConstructorInitializersBeforeComma = true;
10714 Style.ConstructorInitializerIndentWidth = 4;
10715 verifyFormat("SomeClass::Constructor()\n"
10716 " : a(a)\n"
10717 " , b(b)\n"
10718 " , c(c) {}",
10719 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010720 verifyFormat("SomeClass::Constructor()\n"
10721 " : a(a) {}",
10722 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010723
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010724 Style.ColumnLimit = 0;
10725 verifyFormat("SomeClass::Constructor()\n"
10726 " : a(a) {}",
10727 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010728 verifyFormat("SomeClass::Constructor() noexcept\n"
10729 " : a(a) {}",
10730 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010731 verifyFormat("SomeClass::Constructor()\n"
10732 " : a(a)\n"
10733 " , b(b)\n"
10734 " , c(c) {}",
10735 Style);
10736 verifyFormat("SomeClass::Constructor()\n"
10737 " : a(a) {\n"
10738 " foo();\n"
10739 " bar();\n"
10740 "}",
10741 Style);
10742
Daniel Jasperd74cf402014-04-08 12:46:38 +000010743 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010744 verifyFormat("SomeClass::Constructor()\n"
10745 " : a(a)\n"
10746 " , b(b)\n"
10747 " , c(c) {\n}",
10748 Style);
10749 verifyFormat("SomeClass::Constructor()\n"
10750 " : a(a) {\n}",
10751 Style);
10752
10753 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010754 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010755 Style.ConstructorInitializerIndentWidth = 2;
10756 verifyFormat("SomeClass::Constructor()\n"
10757 " : a(a)\n"
10758 " , b(b)\n"
10759 " , c(c) {}",
10760 Style);
10761
10762 Style.ConstructorInitializerIndentWidth = 0;
10763 verifyFormat("SomeClass::Constructor()\n"
10764 ": a(a)\n"
10765 ", b(b)\n"
10766 ", c(c) {}",
10767 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010768
10769 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10770 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010771 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10772 verifyFormat(
10773 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10774 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010775 verifyFormat(
10776 "SomeClass::Constructor()\n"
10777 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10778 Style);
10779 Style.ConstructorInitializerIndentWidth = 4;
10780 Style.ColumnLimit = 60;
10781 verifyFormat("SomeClass::Constructor()\n"
10782 " : aaaaaaaa(aaaaaaaa)\n"
10783 " , aaaaaaaa(aaaaaaaa)\n"
10784 " , aaaaaaaa(aaaaaaaa) {}",
10785 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010786}
10787
Daniel Jasper38efc132014-10-21 07:51:54 +000010788TEST_F(FormatTest, Destructors) {
10789 verifyFormat("void F(int &i) { i.~int(); }");
10790 verifyFormat("void F(int &i) { i->~int(); }");
10791}
10792
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010793TEST_F(FormatTest, FormatsWithWebKitStyle) {
10794 FormatStyle Style = getWebKitStyle();
10795
10796 // Don't indent in outer namespaces.
10797 verifyFormat("namespace outer {\n"
10798 "int i;\n"
10799 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010800 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010801 "} // namespace inner\n"
10802 "} // namespace outer\n"
10803 "namespace other_outer {\n"
10804 "int i;\n"
10805 "}",
10806 Style);
10807
10808 // Don't indent case labels.
10809 verifyFormat("switch (variable) {\n"
10810 "case 1:\n"
10811 "case 2:\n"
10812 " doSomething();\n"
10813 " break;\n"
10814 "default:\n"
10815 " ++variable;\n"
10816 "}",
10817 Style);
10818
10819 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010820 EXPECT_EQ("void f()\n"
10821 "{\n"
10822 " if (aaaaaaaaaaaaaaaa\n"
10823 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10824 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10825 " return;\n"
10826 "}",
10827 format("void f() {\n"
10828 "if (aaaaaaaaaaaaaaaa\n"
10829 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10830 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10831 "return;\n"
10832 "}",
10833 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010834
Daniel Jasper35995672014-04-29 14:05:20 +000010835 // Allow functions on a single line.
10836 verifyFormat("void f() { return; }", Style);
10837
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010838 // Constructor initializers are formatted one per line with the "," on the
10839 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010840 verifyFormat("Constructor()\n"
10841 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10842 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010843 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010844 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10845 "{\n"
10846 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010847 Style);
10848 verifyFormat("SomeClass::Constructor()\n"
10849 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010850 "{\n"
10851 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010852 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010853 EXPECT_EQ("SomeClass::Constructor()\n"
10854 " : a(a)\n"
10855 "{\n"
10856 "}",
10857 format("SomeClass::Constructor():a(a){}", Style));
10858 verifyFormat("SomeClass::Constructor()\n"
10859 " : a(a)\n"
10860 " , b(b)\n"
10861 " , c(c)\n"
10862 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010863 "}",
10864 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010865 verifyFormat("SomeClass::Constructor()\n"
10866 " : a(a)\n"
10867 "{\n"
10868 " foo();\n"
10869 " bar();\n"
10870 "}",
10871 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010872
Daniel Jasper65ee3472013-07-31 23:16:02 +000010873 // Access specifiers should be aligned left.
10874 verifyFormat("class C {\n"
10875 "public:\n"
10876 " int i;\n"
10877 "};",
10878 Style);
10879
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010880 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010881 verifyFormat("int a; // Do not\n"
10882 "double b; // align comments.",
10883 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010884
Daniel Jasper3219e432014-12-02 13:24:51 +000010885 // Do not align operands.
10886 EXPECT_EQ("ASSERT(aaaa\n"
10887 " || bbbb);",
10888 format("ASSERT ( aaaa\n||bbbb);", Style));
10889
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010890 // Accept input's line breaks.
10891 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10892 " || bbbbbbbbbbbbbbb) {\n"
10893 " i++;\n"
10894 "}",
10895 format("if (aaaaaaaaaaaaaaa\n"
10896 "|| bbbbbbbbbbbbbbb) { i++; }",
10897 Style));
10898 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10899 " i++;\n"
10900 "}",
10901 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010902
10903 // Don't automatically break all macro definitions (llvm.org/PR17842).
10904 verifyFormat("#define aNumber 10", Style);
10905 // However, generally keep the line breaks that the user authored.
10906 EXPECT_EQ("#define aNumber \\\n"
10907 " 10",
10908 format("#define aNumber \\\n"
10909 " 10",
10910 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010911
10912 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010913 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10914 " copyItems:YES];",
10915 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10916 "copyItems:YES];",
10917 Style));
10918 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10919 " copyItems:YES];",
10920 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10921 " copyItems:YES];",
10922 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010923 // FIXME: This does not seem right, there should be more indentation before
10924 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010925 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010926 " @\"a\",\n"
10927 " @\"a\"\n"
10928 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010929 " copyItems:YES];",
10930 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10931 " @\"a\",\n"
10932 " @\"a\"\n"
10933 " ]\n"
10934 " copyItems:YES];",
10935 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010936 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010937 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10938 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010939 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10940 " copyItems:YES];",
10941 Style));
10942
10943 verifyFormat("[self.a b:c c:d];", Style);
10944 EXPECT_EQ("[self.a b:c\n"
10945 " c:d];",
10946 format("[self.a b:c\n"
10947 "c:d];",
10948 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010949}
10950
Manuel Klimekffdeb592013-09-03 15:10:01 +000010951TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010952 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10953 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10954 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10955 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10956 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010957 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010958 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010959 verifyFormat("void f() {\n"
10960 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10961 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010962 verifyFormat("void f() {\n"
10963 " other(x.begin(), //\n"
10964 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010965 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010966 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010967 verifyFormat("SomeFunction([]() { // A cool function...\n"
10968 " return 43;\n"
10969 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010970 EXPECT_EQ("SomeFunction([]() {\n"
10971 "#define A a\n"
10972 " return 43;\n"
10973 "});",
10974 format("SomeFunction([](){\n"
10975 "#define A a\n"
10976 "return 43;\n"
10977 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010978 verifyFormat("void f() {\n"
10979 " SomeFunction([](decltype(x), A *a) {});\n"
10980 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010981 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10982 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010983 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10984 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10985 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010986 verifyFormat("Constructor()\n"
10987 " : Field([] { // comment\n"
10988 " int i;\n"
10989 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010990 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10991 " return some_parameter.size();\n"
10992 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010993 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10994 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010995 verifyFormat("int i = aaaaaa ? 1 //\n"
10996 " : [] {\n"
10997 " return 2; //\n"
10998 " }();");
10999 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11000 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11001 " return x == 2; // force break\n"
11002 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011003 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
11004 " int iiiiiiiiiiii) {\n"
11005 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
11006 "});",
11007 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011008 verifyFormat("SomeFunction({[&] {\n"
11009 " // comment\n"
11010 " },\n"
11011 " [&] {\n"
11012 " // comment\n"
11013 " }});");
11014 verifyFormat("SomeFunction({[&] {\n"
11015 " // comment\n"
11016 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011017 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11018 " [&]() { return true; },\n"
11019 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011020
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011021 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011022 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011023 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011024 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11025 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011026 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011027 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011028 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11029 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011030 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011031 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11032 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011033 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011034 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011035 verifyFormat(
11036 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11037 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11038 " return aaaaaaaaaaaaaaaaa;\n"
11039 " });",
11040 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011041 verifyFormat("[]() //\n"
11042 " -> int {\n"
11043 " return 1; //\n"
11044 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011045
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011046 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011047 verifyFormat("SomeFunction(\n"
11048 " []() {\n"
11049 " int i = 42;\n"
11050 " return i;\n"
11051 " },\n"
11052 " []() {\n"
11053 " int j = 43;\n"
11054 " return j;\n"
11055 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011056
Daniel Jasperda18fd82014-06-10 06:39:03 +000011057 // More complex introducers.
11058 verifyFormat("return [i, args...] {};");
11059
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011060 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011061 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011062 verifyFormat("double &operator[](int i) { return 0; }\n"
11063 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011064 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011065 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011066 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011067
11068 // Other corner cases.
11069 verifyFormat("void f() {\n"
11070 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
11071 " );\n"
11072 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011073
11074 // Lambdas created through weird macros.
11075 verifyFormat("void f() {\n"
11076 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011077 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011078 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011079
11080 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11081 " doo_dah();\n"
11082 " doo_dah();\n"
11083 " })) {\n"
11084 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011085 verifyFormat("auto lambda = []() {\n"
11086 " int a = 2\n"
11087 "#if A\n"
11088 " + 2\n"
11089 "#endif\n"
11090 " ;\n"
11091 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011092}
11093
Manuel Klimek516e0542013-09-04 13:25:30 +000011094TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011095 FormatStyle ShortBlocks = getLLVMStyle();
11096 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11097 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11098 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11099 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11100 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11101 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11102 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011103
Daniel Jasper76284682014-10-22 09:12:44 +000011104 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11105 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11106 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011107
Daniel Jasper76284682014-10-22 09:12:44 +000011108 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011109 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011110 "}];");
11111 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011112 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011113 "}]};");
11114 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011115 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011116 "}];");
11117 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011118 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011119 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011120 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011121 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011122 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011123 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011124 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011125
11126 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011127 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011128 "}];",
11129 getLLVMStyleWithColumns(60));
11130 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011131 " NSString *path = [self sessionFilePath];\n"
11132 " if (path) {\n"
11133 " // ...\n"
11134 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011135 "});");
11136 verifyFormat("[[SessionService sharedService]\n"
11137 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011138 " if (window) {\n"
11139 " [self windowDidLoad:window];\n"
11140 " } else {\n"
11141 " [self errorLoadingWindow];\n"
11142 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011143 " }];");
11144 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011145 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011146 "};\n",
11147 getLLVMStyleWithColumns(40));
11148 verifyFormat("[[SessionService sharedService]\n"
11149 " loadWindowWithCompletionBlock: //\n"
11150 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011151 " if (window) {\n"
11152 " [self windowDidLoad:window];\n"
11153 " } else {\n"
11154 " [self errorLoadingWindow];\n"
11155 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011156 " }];",
11157 getLLVMStyleWithColumns(60));
11158 verifyFormat("[myObject doSomethingWith:arg1\n"
11159 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011160 " // ...\n"
11161 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011162 " }\n"
11163 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011164 " // ...\n"
11165 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011166 " }\n"
11167 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011168 " // ...\n"
11169 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011170 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011171 verifyFormat("[myObject doSomethingWith:arg1\n"
11172 " firstBlock:-1\n"
11173 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011174 " // ...\n"
11175 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011176 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011177
11178 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011179 " @autoreleasepool {\n"
11180 " if (a) {\n"
11181 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011182 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011183 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011184 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011185 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011186 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11187 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011188
11189 FormatStyle FourIndent = getLLVMStyle();
11190 FourIndent.ObjCBlockIndentWidth = 4;
11191 verifyFormat("[operation setCompletionBlock:^{\n"
11192 " [self onOperationDone];\n"
11193 "}];",
11194 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011195}
11196
Daniel Jasper289afc02015-04-23 09:23:17 +000011197TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11198 FormatStyle ZeroColumn = getLLVMStyle();
11199 ZeroColumn.ColumnLimit = 0;
11200
11201 verifyFormat("[[SessionService sharedService] "
11202 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11203 " if (window) {\n"
11204 " [self windowDidLoad:window];\n"
11205 " } else {\n"
11206 " [self errorLoadingWindow];\n"
11207 " }\n"
11208 "}];",
11209 ZeroColumn);
11210 EXPECT_EQ("[[SessionService sharedService]\n"
11211 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11212 " if (window) {\n"
11213 " [self windowDidLoad:window];\n"
11214 " } else {\n"
11215 " [self errorLoadingWindow];\n"
11216 " }\n"
11217 " }];",
11218 format("[[SessionService sharedService]\n"
11219 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11220 " if (window) {\n"
11221 " [self windowDidLoad:window];\n"
11222 " } else {\n"
11223 " [self errorLoadingWindow];\n"
11224 " }\n"
11225 "}];",
11226 ZeroColumn));
11227 verifyFormat("[myObject doSomethingWith:arg1\n"
11228 " firstBlock:^(Foo *a) {\n"
11229 " // ...\n"
11230 " int i;\n"
11231 " }\n"
11232 " secondBlock:^(Bar *b) {\n"
11233 " // ...\n"
11234 " int i;\n"
11235 " }\n"
11236 " thirdBlock:^Foo(Bar *b) {\n"
11237 " // ...\n"
11238 " int i;\n"
11239 " }];",
11240 ZeroColumn);
11241 verifyFormat("f(^{\n"
11242 " @autoreleasepool {\n"
11243 " if (a) {\n"
11244 " g();\n"
11245 " }\n"
11246 " }\n"
11247 "});",
11248 ZeroColumn);
11249 verifyFormat("void (^largeBlock)(void) = ^{\n"
11250 " // ...\n"
11251 "};",
11252 ZeroColumn);
11253
11254 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11255 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011256 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011257 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11258 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11259 " int i;\n"
11260 "};",
11261 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11262}
11263
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011264TEST_F(FormatTest, SupportsCRLF) {
11265 EXPECT_EQ("int a;\r\n"
11266 "int b;\r\n"
11267 "int c;\r\n",
11268 format("int a;\r\n"
11269 " int b;\r\n"
11270 " int c;\r\n",
11271 getLLVMStyle()));
11272 EXPECT_EQ("int a;\r\n"
11273 "int b;\r\n"
11274 "int c;\r\n",
11275 format("int a;\r\n"
11276 " int b;\n"
11277 " int c;\r\n",
11278 getLLVMStyle()));
11279 EXPECT_EQ("int a;\n"
11280 "int b;\n"
11281 "int c;\n",
11282 format("int a;\r\n"
11283 " int b;\n"
11284 " int c;\n",
11285 getLLVMStyle()));
11286 EXPECT_EQ("\"aaaaaaa \"\r\n"
11287 "\"bbbbbbb\";\r\n",
11288 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11289 EXPECT_EQ("#define A \\\r\n"
11290 " b; \\\r\n"
11291 " c; \\\r\n"
11292 " d;\r\n",
11293 format("#define A \\\r\n"
11294 " b; \\\r\n"
11295 " c; d; \r\n",
11296 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011297
11298 EXPECT_EQ("/*\r\n"
11299 "multi line block comments\r\n"
11300 "should not introduce\r\n"
11301 "an extra carriage return\r\n"
11302 "*/\r\n",
11303 format("/*\r\n"
11304 "multi line block comments\r\n"
11305 "should not introduce\r\n"
11306 "an extra carriage return\r\n"
11307 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011308}
11309
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011310TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11311 verifyFormat("MY_CLASS(C) {\n"
11312 " int i;\n"
11313 " int j;\n"
11314 "};");
11315}
11316
Daniel Jasper6633ab82013-10-18 10:38:14 +000011317TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11318 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11319 TwoIndent.ContinuationIndentWidth = 2;
11320
11321 EXPECT_EQ("int i =\n"
11322 " longFunction(\n"
11323 " arg);",
11324 format("int i = longFunction(arg);", TwoIndent));
11325
11326 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11327 SixIndent.ContinuationIndentWidth = 6;
11328
11329 EXPECT_EQ("int i =\n"
11330 " longFunction(\n"
11331 " arg);",
11332 format("int i = longFunction(arg);", SixIndent));
11333}
11334
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011335TEST_F(FormatTest, SpacesInAngles) {
11336 FormatStyle Spaces = getLLVMStyle();
11337 Spaces.SpacesInAngles = true;
11338
11339 verifyFormat("static_cast< int >(arg);", Spaces);
11340 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11341 verifyFormat("f< int, float >();", Spaces);
11342 verifyFormat("template <> g() {}", Spaces);
11343 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011344 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11345 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11346 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011347
11348 Spaces.Standard = FormatStyle::LS_Cpp03;
11349 Spaces.SpacesInAngles = true;
11350 verifyFormat("A< A< int > >();", Spaces);
11351
11352 Spaces.SpacesInAngles = false;
11353 verifyFormat("A<A<int> >();", Spaces);
11354
11355 Spaces.Standard = FormatStyle::LS_Cpp11;
11356 Spaces.SpacesInAngles = true;
11357 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011358
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011359 Spaces.SpacesInAngles = false;
11360 verifyFormat("A<A<int>>();", Spaces);
11361}
11362
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011363TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11364 FormatStyle Style = getLLVMStyle();
11365 Style.SpaceAfterTemplateKeyword = false;
11366 verifyFormat("template<int> void foo();", Style);
11367}
11368
Jacques Pienaarfc275112015-02-18 23:48:37 +000011369TEST_F(FormatTest, TripleAngleBrackets) {
11370 verifyFormat("f<<<1, 1>>>();");
11371 verifyFormat("f<<<1, 1, 1, s>>>();");
11372 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011373 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011374 verifyFormat("f<param><<<1, 1>>>();");
11375 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011376 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011377 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11378 "aaaaaaaaaaa<<<\n 1, 1>>>();");
11379}
11380
11381TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011382 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011383 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011384 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11385 "aaallvm::outs() <<");
11386 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11387 "aaaallvm::outs()\n <<");
11388}
11389
Manuel Klimek819788d2014-03-18 11:22:45 +000011390TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11391 std::string code = "#if A\n"
11392 "#if B\n"
11393 "a.\n"
11394 "#endif\n"
11395 " a = 1;\n"
11396 "#else\n"
11397 "#endif\n"
11398 "#if C\n"
11399 "#else\n"
11400 "#endif\n";
11401 EXPECT_EQ(code, format(code));
11402}
11403
Manuel Klimek68b03042014-04-14 09:14:11 +000011404TEST_F(FormatTest, HandleConflictMarkers) {
11405 // Git/SVN conflict markers.
11406 EXPECT_EQ("int a;\n"
11407 "void f() {\n"
11408 " callme(some(parameter1,\n"
11409 "<<<<<<< text by the vcs\n"
11410 " parameter2),\n"
11411 "||||||| text by the vcs\n"
11412 " parameter2),\n"
11413 " parameter3,\n"
11414 "======= text by the vcs\n"
11415 " parameter2, parameter3),\n"
11416 ">>>>>>> text by the vcs\n"
11417 " otherparameter);\n",
11418 format("int a;\n"
11419 "void f() {\n"
11420 " callme(some(parameter1,\n"
11421 "<<<<<<< text by the vcs\n"
11422 " parameter2),\n"
11423 "||||||| text by the vcs\n"
11424 " parameter2),\n"
11425 " parameter3,\n"
11426 "======= text by the vcs\n"
11427 " parameter2,\n"
11428 " parameter3),\n"
11429 ">>>>>>> text by the vcs\n"
11430 " otherparameter);\n"));
11431
11432 // Perforce markers.
11433 EXPECT_EQ("void f() {\n"
11434 " function(\n"
11435 ">>>> text by the vcs\n"
11436 " parameter,\n"
11437 "==== text by the vcs\n"
11438 " parameter,\n"
11439 "==== text by the vcs\n"
11440 " parameter,\n"
11441 "<<<< text by the vcs\n"
11442 " parameter);\n",
11443 format("void f() {\n"
11444 " function(\n"
11445 ">>>> text by the vcs\n"
11446 " parameter,\n"
11447 "==== text by the vcs\n"
11448 " parameter,\n"
11449 "==== text by the vcs\n"
11450 " parameter,\n"
11451 "<<<< text by the vcs\n"
11452 " parameter);\n"));
11453
11454 EXPECT_EQ("<<<<<<<\n"
11455 "|||||||\n"
11456 "=======\n"
11457 ">>>>>>>",
11458 format("<<<<<<<\n"
11459 "|||||||\n"
11460 "=======\n"
11461 ">>>>>>>"));
11462
11463 EXPECT_EQ("<<<<<<<\n"
11464 "|||||||\n"
11465 "int i;\n"
11466 "=======\n"
11467 ">>>>>>>",
11468 format("<<<<<<<\n"
11469 "|||||||\n"
11470 "int i;\n"
11471 "=======\n"
11472 ">>>>>>>"));
11473
11474 // FIXME: Handle parsing of macros around conflict markers correctly:
11475 EXPECT_EQ("#define Macro \\\n"
11476 "<<<<<<<\n"
11477 "Something \\\n"
11478 "|||||||\n"
11479 "Else \\\n"
11480 "=======\n"
11481 "Other \\\n"
11482 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011483 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011484 format("#define Macro \\\n"
11485 "<<<<<<<\n"
11486 " Something \\\n"
11487 "|||||||\n"
11488 " Else \\\n"
11489 "=======\n"
11490 " Other \\\n"
11491 ">>>>>>>\n"
11492 " End\n"
11493 "int i;\n"));
11494}
11495
Daniel Jasper471894432014-08-06 13:40:26 +000011496TEST_F(FormatTest, DisableRegions) {
11497 EXPECT_EQ("int i;\n"
11498 "// clang-format off\n"
11499 " int j;\n"
11500 "// clang-format on\n"
11501 "int k;",
11502 format(" int i;\n"
11503 " // clang-format off\n"
11504 " int j;\n"
11505 " // clang-format on\n"
11506 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011507 EXPECT_EQ("int i;\n"
11508 "/* clang-format off */\n"
11509 " int j;\n"
11510 "/* clang-format on */\n"
11511 "int k;",
11512 format(" int i;\n"
11513 " /* clang-format off */\n"
11514 " int j;\n"
11515 " /* clang-format on */\n"
11516 " int k;"));
Daniel Jasper471894432014-08-06 13:40:26 +000011517}
11518
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011519TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11520 format("? ) =");
11521 verifyNoCrash("#define a\\\n /**/}");
11522}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011523
Daniel Jasper498f5582015-12-25 08:53:31 +000011524TEST_F(FormatTest, FormatsTableGenCode) {
11525 FormatStyle Style = getLLVMStyle();
11526 Style.Language = FormatStyle::LK_TableGen;
11527 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11528}
11529
Eric Liu547d8792016-03-24 13:22:42 +000011530// Since this test case uses UNIX-style file path. We disable it for MS
11531// compiler.
Eric Liuc13ca6a2016-03-24 14:59:39 +000011532#if !defined(_MSC_VER) && !defined(__MINGW32__)
Eric Liu547d8792016-03-24 13:22:42 +000011533
11534TEST(FormatStyle, GetStyleOfFile) {
11535 vfs::InMemoryFileSystem FS;
11536 // Test 1: format file in the same directory.
11537 ASSERT_TRUE(
11538 FS.addFile("/a/.clang-format", 0,
11539 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11540 ASSERT_TRUE(
11541 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11542 auto Style1 = getStyle("file", "/a/.clang-format", "Google", &FS);
11543 ASSERT_EQ(Style1, getLLVMStyle());
11544
11545 // Test 2: fallback to default.
11546 ASSERT_TRUE(
11547 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11548 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", &FS);
11549 ASSERT_EQ(Style2, getMozillaStyle());
11550
11551 // Test 3: format file in parent directory.
11552 ASSERT_TRUE(
11553 FS.addFile("/c/.clang-format", 0,
11554 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11555 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11556 llvm::MemoryBuffer::getMemBuffer("int i;")));
11557 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", &FS);
11558 ASSERT_EQ(Style3, getGoogleStyle());
11559}
11560
11561#endif // _MSC_VER
11562
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011563TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11564 // Column limit is 20.
11565 std::string Code = "Type *a =\n"
11566 " new Type();\n"
11567 "g(iiiii, 0, jjjjj,\n"
11568 " 0, kkkkk, 0, mm);\n"
11569 "int bad = format ;";
11570 std::string Expected = "auto a = new Type();\n"
11571 "g(iiiii, nullptr,\n"
11572 " jjjjj, nullptr,\n"
11573 " kkkkk, nullptr,\n"
11574 " mm);\n"
11575 "int bad = format ;";
11576 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011577 tooling::Replacements Replaces = toReplacements(
11578 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11579 "auto "),
11580 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11581 "nullptr"),
11582 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11583 "nullptr"),
11584 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11585 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011586
11587 format::FormatStyle Style = format::getLLVMStyle();
11588 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011589 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11590 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11591 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11592 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11593 EXPECT_TRUE(static_cast<bool>(Result));
11594 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011595}
11596
Eric Liubaf58c22016-05-18 13:43:48 +000011597TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11598 std::string Code = "#include \"a.h\"\n"
11599 "#include \"c.h\"\n"
11600 "\n"
11601 "int main() {\n"
11602 " return 0;\n"
11603 "}";
11604 std::string Expected = "#include \"a.h\"\n"
11605 "#include \"b.h\"\n"
11606 "#include \"c.h\"\n"
11607 "\n"
11608 "int main() {\n"
11609 " return 0;\n"
11610 "}";
11611 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011612 tooling::Replacements Replaces = toReplacements(
11613 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11614 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011615
11616 format::FormatStyle Style = format::getLLVMStyle();
11617 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011618 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11619 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11620 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11621 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11622 EXPECT_TRUE(static_cast<bool>(Result));
11623 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011624}
11625
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011626TEST_F(FormatTest, AllignTrailingComments) {
11627 EXPECT_EQ("#define MACRO(V) \\\n"
11628 " V(Rt2) /* one more char */ \\\n"
11629 " V(Rs) /* than here */ \\\n"
11630 "/* comment 3 */\n",
11631 format("#define MACRO(V)\\\n"
11632 "V(Rt2) /* one more char */ \\\n"
11633 "V(Rs) /* than here */ \\\n"
11634 "/* comment 3 */ \\\n",
11635 getLLVMStyleWithColumns(40)));
11636}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011637} // end namespace
11638} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011639} // end namespace clang