blob: 0056436e537fa235324f2e81cc269404aeed2860 [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
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005504TEST_F(FormatTest, BitshiftOperatorWidth) {
5505 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5506 " bar */",
5507 format("int a=1<<2; /* foo\n"
5508 " bar */"));
5509
5510 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5511 " bar */",
5512 format("int b =256>>1 ; /* foo\n"
5513 " bar */"));
5514}
5515
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005516TEST_F(FormatTest, UnderstandsBinaryOperators) {
5517 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005518 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005519}
5520
5521TEST_F(FormatTest, UnderstandsPointersToMembers) {
5522 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005523 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005524 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005525 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005526 verifyFormat("void f() {\n"
5527 " (a->*f)();\n"
5528 " a->*x;\n"
5529 " (a.*f)();\n"
5530 " ((*a).*f)();\n"
5531 " a.*x;\n"
5532 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005533 verifyFormat("void f() {\n"
5534 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5535 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5536 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005537 verifyFormat(
5538 "(aaaaaaaaaa->*bbbbbbb)(\n"
5539 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005540 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005541 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005542 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005543}
5544
Daniel Jasper8dd40472012-12-21 09:41:31 +00005545TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005546 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005547 verifyFormat("f(-1, -2, -3);");
5548 verifyFormat("a[-1] = 5;");
5549 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005550 verifyFormat("if (i == -1) {\n}");
5551 verifyFormat("if (i != -1) {\n}");
5552 verifyFormat("if (i > -1) {\n}");
5553 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005554 verifyFormat("++(a->f());");
5555 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005556 verifyFormat("(a->f())++;");
5557 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005558 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005559
5560 verifyFormat("a-- > b;");
5561 verifyFormat("b ? -a : c;");
5562 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005563 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005564 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005565 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005566
5567 verifyFormat("return -1;");
5568 verifyFormat("switch (a) {\n"
5569 "case -1:\n"
5570 " break;\n"
5571 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005572 verifyFormat("#define X -1");
5573 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005574
Chandler Carruthf8b72662014-03-02 12:37:31 +00005575 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5576 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005577
5578 verifyFormat("int a = /* confusing comment */ -1;");
5579 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5580 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005581}
5582
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005583TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005584 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005585 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005586 "}");
5587 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005588 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005589 verifyFormat("*aaa = aaaaaaa( // break\n"
5590 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005591}
5592
Daniel Jasper8863ada2013-08-26 08:10:17 +00005593TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005594 verifyFormat("bool operator<();");
5595 verifyFormat("bool operator>();");
5596 verifyFormat("bool operator=();");
5597 verifyFormat("bool operator==();");
5598 verifyFormat("bool operator!=();");
5599 verifyFormat("int operator+();");
5600 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00005601 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005602 verifyFormat("bool operator();");
5603 verifyFormat("bool operator()();");
5604 verifyFormat("bool operator[]();");
5605 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005606 verifyFormat("operator int();");
5607 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005608 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005609 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005610 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005611 verifyFormat("void *operator new(std::size_t size);");
5612 verifyFormat("void *operator new[](std::size_t size);");
5613 verifyFormat("void operator delete(void *ptr);");
5614 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005615 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5616 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005617 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005618 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005619
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005620 verifyFormat(
5621 "ostream &operator<<(ostream &OutputStream,\n"
5622 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005623 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5624 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5625 " return left.group < right.group;\n"
5626 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005627 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005628 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005629
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005630 verifyGoogleFormat("operator void*();");
5631 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005632 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005633
5634 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005635 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5636 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005637}
5638
Daniel Jasper1c220482015-02-25 10:30:06 +00005639TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005640 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5641 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5642 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5643 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5644 verifyFormat("Deleted &operator=(const Deleted &) &;");
5645 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5646 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5647 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5648 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5649 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5650 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005651 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005652 verifyFormat("template <typename T>\n"
5653 "void F(T) && = delete;",
5654 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005655
Daniel Jasperaf642c62015-08-25 13:40:51 +00005656 FormatStyle AlignLeft = getLLVMStyle();
5657 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005658 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005659 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5660 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5661 AlignLeft);
5662 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5663 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005664 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5665 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5666 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5667 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005668 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005669
5670 FormatStyle Spaces = getLLVMStyle();
5671 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005672 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5673 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5674 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5675 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005676
5677 Spaces.SpacesInCStyleCastParentheses = false;
5678 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005679 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5680 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5681 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5682 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005683}
5684
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005685TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005686 verifyFormat("void f() {\n"
5687 " A *a = new A;\n"
5688 " A *a = new (placement) A;\n"
5689 " delete a;\n"
5690 " delete (A *)a;\n"
5691 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005692 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5693 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005694 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5695 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5696 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005697 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005698}
5699
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005700TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005701 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005702 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005703 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005704 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005705 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005706 verifyIndependentOfContext("int a = b * 10;");
5707 verifyIndependentOfContext("int a = 10 * b;");
5708 verifyIndependentOfContext("int a = b * c;");
5709 verifyIndependentOfContext("int a += b * c;");
5710 verifyIndependentOfContext("int a -= b * c;");
5711 verifyIndependentOfContext("int a *= b * c;");
5712 verifyIndependentOfContext("int a /= b * c;");
5713 verifyIndependentOfContext("int a = *b;");
5714 verifyIndependentOfContext("int a = *b * c;");
5715 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005716 verifyIndependentOfContext("int a = b * (10);");
5717 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005718 verifyIndependentOfContext("return 10 * b;");
5719 verifyIndependentOfContext("return *b * *c;");
5720 verifyIndependentOfContext("return a & ~b;");
5721 verifyIndependentOfContext("f(b ? *c : *d);");
5722 verifyIndependentOfContext("int a = b ? *c : *d;");
5723 verifyIndependentOfContext("*b = a;");
5724 verifyIndependentOfContext("a * ~b;");
5725 verifyIndependentOfContext("a * !b;");
5726 verifyIndependentOfContext("a * +b;");
5727 verifyIndependentOfContext("a * -b;");
5728 verifyIndependentOfContext("a * ++b;");
5729 verifyIndependentOfContext("a * --b;");
5730 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005731 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005732 verifyIndependentOfContext("f() * b;");
5733 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005734 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005735 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005736 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005737 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005738 verifyIndependentOfContext("return sizeof(int **);");
5739 verifyIndependentOfContext("return sizeof(int ******);");
5740 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005741 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005742 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005743 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005744 verifyGoogleFormat("return sizeof(int**);");
5745 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5746 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005747 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005748 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005749 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005750 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005751 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005752 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005753 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005754 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005755 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005756 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005757 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005758 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005759 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005760 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005761 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005762 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasper27234032012-12-07 09:52:15 +00005763
Daniel Jasper5b49f472013-01-23 12:10:53 +00005764 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005765
Daniel Jasper5b49f472013-01-23 12:10:53 +00005766 verifyIndependentOfContext("A<int *> a;");
5767 verifyIndependentOfContext("A<int **> a;");
5768 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005769 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005770 verifyIndependentOfContext(
5771 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005772 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005773 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005774 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005775 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005776 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005777
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005778 verifyFormat(
5779 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5780 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5781
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005782 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005783 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005784 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005785 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005786 verifyGoogleFormat("A<int*> a;");
5787 verifyGoogleFormat("A<int**> a;");
5788 verifyGoogleFormat("A<int*, int*> a;");
5789 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005790 verifyGoogleFormat("f(b ? *c : *d);");
5791 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005792 verifyGoogleFormat("Type* t = **x;");
5793 verifyGoogleFormat("Type* t = *++*x;");
5794 verifyGoogleFormat("*++*x;");
5795 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5796 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005797 verifyGoogleFormat(
5798 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005799 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005800 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5801 verifyGoogleFormat("template <typename T>\n"
5802 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005803
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005804 FormatStyle Left = getLLVMStyle();
5805 Left.PointerAlignment = FormatStyle::PAS_Left;
5806 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005807 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005808 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005809
Daniel Jasper5b49f472013-01-23 12:10:53 +00005810 verifyIndependentOfContext("a = *(x + y);");
5811 verifyIndependentOfContext("a = &(x + y);");
5812 verifyIndependentOfContext("*(x + y).call();");
5813 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005814 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005815
Daniel Jasper5b49f472013-01-23 12:10:53 +00005816 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005817 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005818 "int *MyValues = {\n"
5819 " *A, // Operator detection might be confused by the '{'\n"
5820 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005821 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005822
Daniel Jasper5b49f472013-01-23 12:10:53 +00005823 verifyIndependentOfContext("if (int *a = &b)");
5824 verifyIndependentOfContext("if (int &a = *b)");
5825 verifyIndependentOfContext("if (a & b[i])");
5826 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5827 verifyIndependentOfContext("if (*b[i])");
5828 verifyIndependentOfContext("if (int *a = (&b))");
5829 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005830 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005831 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005832 verifyFormat("void f() {\n"
5833 " for (const int &v : Values) {\n"
5834 " }\n"
5835 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005836 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5837 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005838 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005839
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005840 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005841 verifyFormat("#define MACRO \\\n"
5842 " int *i = a * b; \\\n"
5843 " void f(a *b);",
5844 getLLVMStyleWithColumns(19));
5845
Daniel Jasper97b89482013-03-13 07:49:51 +00005846 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005847 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005848 verifyIndependentOfContext("T **t = new T *;");
5849 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005850 verifyGoogleFormat("A = new SomeType*[Length]();");
5851 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005852 verifyGoogleFormat("T** t = new T*;");
5853 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005854
Daniel Jasper990ff972013-05-07 14:17:18 +00005855 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005856 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00005857 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00005858 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5859 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005860 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005861 "typename t::if<x && y>::type f() {}");
5862 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005863 verifyFormat("vector<int *> v;");
5864 verifyFormat("vector<int *const> v;");
5865 verifyFormat("vector<int *const **const *> v;");
5866 verifyFormat("vector<int *volatile> v;");
5867 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005868 verifyFormat("foo<b && false>();");
5869 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005870 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005871 verifyFormat(
5872 "template <class T, class = typename std::enable_if<\n"
5873 " std::is_integral<T>::value &&\n"
5874 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005875 "void F();",
5876 getLLVMStyleWithColumns(76));
5877 verifyFormat(
5878 "template <class T,\n"
5879 " class = typename ::std::enable_if<\n"
5880 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5881 "void F();",
5882 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005883
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005884 verifyIndependentOfContext("MACRO(int *i);");
5885 verifyIndependentOfContext("MACRO(auto *a);");
5886 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00005887 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00005888 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005889 // FIXME: Is there a way to make this work?
5890 // verifyIndependentOfContext("MACRO(A *a);");
5891
Daniel Jasper32ccb032014-06-23 07:36:18 +00005892 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005893 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005894
Daniel Jasper866468a2014-04-14 13:15:29 +00005895 EXPECT_EQ("#define OP(x) \\\n"
5896 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5897 " return s << a.DebugString(); \\\n"
5898 " }",
5899 format("#define OP(x) \\\n"
5900 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5901 " return s << a.DebugString(); \\\n"
5902 " }",
5903 getLLVMStyleWithColumns(50)));
5904
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005905 // FIXME: We cannot handle this case yet; we might be able to figure out that
5906 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005907 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005908
5909 FormatStyle PointerMiddle = getLLVMStyle();
5910 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5911 verifyFormat("delete *x;", PointerMiddle);
5912 verifyFormat("int * x;", PointerMiddle);
5913 verifyFormat("template <int * y> f() {}", PointerMiddle);
5914 verifyFormat("int * f(int * a) {}", PointerMiddle);
5915 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5916 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5917 verifyFormat("A<int *> a;", PointerMiddle);
5918 verifyFormat("A<int **> a;", PointerMiddle);
5919 verifyFormat("A<int *, int *> a;", PointerMiddle);
5920 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005921 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5922 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005923 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005924
5925 // Member function reference qualifiers aren't binary operators.
5926 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005927 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005928 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005929 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005930 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005931 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005932}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005933
Daniel Jasperee6d6502013-07-17 20:25:02 +00005934TEST_F(FormatTest, UnderstandsAttributes) {
5935 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005936 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5937 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005938 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005939 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005940 verifyFormat("__attribute__((nodebug)) void\n"
5941 "foo() {}\n",
5942 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005943}
5944
Daniel Jasper10cd5812013-05-06 06:35:44 +00005945TEST_F(FormatTest, UnderstandsEllipsis) {
5946 verifyFormat("int printf(const char *fmt, ...);");
5947 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005948 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5949
5950 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005951 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005952 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005953}
5954
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005955TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005956 EXPECT_EQ("int *a;\n"
5957 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005958 "int *a;",
5959 format("int *a;\n"
5960 "int* a;\n"
5961 "int *a;",
5962 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005963 EXPECT_EQ("int* a;\n"
5964 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005965 "int* a;",
5966 format("int* a;\n"
5967 "int* a;\n"
5968 "int *a;",
5969 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005970 EXPECT_EQ("int *a;\n"
5971 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005972 "int *a;",
5973 format("int *a;\n"
5974 "int * a;\n"
5975 "int * a;",
5976 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005977 EXPECT_EQ("auto x = [] {\n"
5978 " int *a;\n"
5979 " int *a;\n"
5980 " int *a;\n"
5981 "};",
5982 format("auto x=[]{int *a;\n"
5983 "int * a;\n"
5984 "int * a;};",
5985 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005986}
5987
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005988TEST_F(FormatTest, UnderstandsRvalueReferences) {
5989 verifyFormat("int f(int &&a) {}");
5990 verifyFormat("int f(int a, char &&b) {}");
5991 verifyFormat("void f() { int &&a = b; }");
5992 verifyGoogleFormat("int f(int a, char&& b) {}");
5993 verifyGoogleFormat("void f() { int&& a = b; }");
5994
Daniel Jasper1eff9082013-05-27 16:36:33 +00005995 verifyIndependentOfContext("A<int &&> a;");
5996 verifyIndependentOfContext("A<int &&, int &&> a;");
5997 verifyGoogleFormat("A<int&&> a;");
5998 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00005999
6000 // Not rvalue references:
6001 verifyFormat("template <bool B, bool C> class A {\n"
6002 " static_assert(B && C, \"Something is wrong\");\n"
6003 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006004 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6005 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006006 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006007}
6008
Manuel Klimekc1237a82013-01-23 14:08:21 +00006009TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6010 verifyFormat("void f() {\n"
6011 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006012 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006013 "}",
6014 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006015}
6016
Daniel Jasperef906a92013-01-13 08:01:36 +00006017TEST_F(FormatTest, FormatsCasts) {
6018 verifyFormat("Type *A = static_cast<Type *>(P);");
6019 verifyFormat("Type *A = (Type *)P;");
6020 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6021 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006022 verifyFormat("int a = (int)2.0f;");
6023 verifyFormat("x[(int32)y];");
6024 verifyFormat("x = (int32)y;");
6025 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6026 verifyFormat("int a = (int)*b;");
6027 verifyFormat("int a = (int)2.0f;");
6028 verifyFormat("int a = (int)~0;");
6029 verifyFormat("int a = (int)++a;");
6030 verifyFormat("int a = (int)sizeof(int);");
6031 verifyFormat("int a = (int)+2;");
6032 verifyFormat("my_int a = (my_int)2.0f;");
6033 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006034 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006035 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006036 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006037 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006038 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006039
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006040 verifyFormat("void f() { my_int a = (my_int)*b; }");
6041 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6042 verifyFormat("my_int a = (my_int)~0;");
6043 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006044 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006045 verifyFormat("my_int a = (my_int)1;");
6046 verifyFormat("my_int a = (my_int *)1;");
6047 verifyFormat("my_int a = (const my_int)-1;");
6048 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006049 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006050 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006051 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006052 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006053
6054 // FIXME: single value wrapped with paren will be treated as cast.
6055 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006056
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006057 verifyFormat("{ (void)F; }");
6058
Daniel Jasper998cabc2013-07-18 14:46:07 +00006059 // Don't break after a cast's
6060 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6061 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6062 " bbbbbbbbbbbbbbbbbbbbbb);");
6063
Daniel Jasperef906a92013-01-13 08:01:36 +00006064 // These are not casts.
6065 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006066 verifyFormat("f(foo)->b;");
6067 verifyFormat("f(foo).b;");
6068 verifyFormat("f(foo)(b);");
6069 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006070 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006071 verifyFormat("(*funptr)(foo)[4];");
6072 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006073 verifyFormat("void f(int *);");
6074 verifyFormat("void f(int *) = 0;");
6075 verifyFormat("void f(SmallVector<int>) {}");
6076 verifyFormat("void f(SmallVector<int>);");
6077 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006078 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006079 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006080 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006081 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6082 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006083 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006084
Daniel Jasperba0bda92013-02-23 08:07:18 +00006085 // These are not casts, but at some point were confused with casts.
6086 verifyFormat("virtual void foo(int *) override;");
6087 verifyFormat("virtual void foo(char &) const;");
6088 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006089 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006090 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006091 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006092 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006093
6094 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6095 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006096 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006097 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006098 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6099 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6100 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006101}
6102
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006103TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006104 verifyFormat("A<bool()> a;");
6105 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006106 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006107 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006108 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006109 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006110 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006111 verifyFormat("template <class CallbackClass>\n"
6112 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006113
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006114 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6115 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006116 verifyGoogleFormat(
6117 "template <class CallbackClass>\n"
6118 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006119
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006120 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006121 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006122 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006123 verifyFormat("some_var = function(*some_pointer_var)[0];");
6124 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006125 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006126 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006127}
6128
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006129TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6130 verifyFormat("A (*foo_)[6];");
6131 verifyFormat("vector<int> (*foo_)[6];");
6132}
6133
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006134TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6135 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6136 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6137 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6138 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006139 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6140 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006141
6142 // Different ways of ()-initializiation.
6143 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6144 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6145 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6146 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6147 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6148 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006149 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6150 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006151}
6152
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006153TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006154 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006155 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006156 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006157 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006158 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006159 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006160 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6161 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006162 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6163 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006164 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6165 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006166 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6167 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006168 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6169 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006170 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6171 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6172 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6173 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006174 FormatStyle Indented = getLLVMStyle();
6175 Indented.IndentWrappedFunctionNames = true;
6176 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6177 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6178 Indented);
6179 verifyFormat(
6180 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6181 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6182 Indented);
6183 verifyFormat(
6184 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6185 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6186 Indented);
6187 verifyFormat(
6188 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6189 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6190 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006191
6192 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006193 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6194 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6195 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006196
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006197 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006198 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006199 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006200 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6201 " SourceLocation L, IdentifierIn *II,\n"
6202 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006203 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006204 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006205 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006206 " const SomeType<string, SomeOtherTemplateParameter>\n"
6207 " &ReallyReallyLongParameterName,\n"
6208 " const SomeType<string, SomeOtherTemplateParameter>\n"
6209 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006210 verifyFormat("template <typename A>\n"
6211 "SomeLoooooooooooooooooooooongType<\n"
6212 " typename some_namespace::SomeOtherType<A>::Type>\n"
6213 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006214
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006215 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006216 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6217 " aaaaaaaaaaaaaaaaaaaaaaa;");
6218 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006219 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6220 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006221 verifyGoogleFormat(
6222 "some_namespace::LongReturnType\n"
6223 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006224 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006225
6226 verifyGoogleFormat("template <typename T>\n"
6227 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006228 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006229 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6230 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006231
6232 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006233 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6234 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006235 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6236 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6237 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6238 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6239 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6240 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6241 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006242}
6243
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006244TEST_F(FormatTest, FormatsArrays) {
6245 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6246 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006247 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6248 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006249 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6250 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006251 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6252 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6253 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6254 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6255 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6256 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6257 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6258 verifyFormat(
6259 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6260 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6261 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006262 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6263 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006264
6265 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6266 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006267 verifyFormat(
6268 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6269 " .aaaaaaa[0]\n"
6270 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006271 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006272
6273 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006274
6275 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6276 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006277}
6278
Daniel Jaspere9de2602012-12-06 09:56:08 +00006279TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6280 verifyFormat("(a)->b();");
6281 verifyFormat("--a;");
6282}
6283
Daniel Jasper8b529712012-12-04 13:02:32 +00006284TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006285 verifyFormat("#include <string>\n"
6286 "#include <a/b/c.h>\n"
6287 "#include \"a/b/string\"\n"
6288 "#include \"string.h\"\n"
6289 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006290 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006291 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006292 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006293 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006294 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006295 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6296 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006297 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6298 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006299
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006300 verifyFormat("#import <string>");
6301 verifyFormat("#import <a/b/c.h>");
6302 verifyFormat("#import \"a/b/string\"");
6303 verifyFormat("#import \"string.h\"");
6304 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006305 verifyFormat("#if __has_include(<strstream>)\n"
6306 "#include <strstream>\n"
6307 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006308
Daniel Jasper343643b2014-08-13 08:29:18 +00006309 verifyFormat("#define MY_IMPORT <a/b>");
6310
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006311 // Protocol buffer definition or missing "#".
6312 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6313 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006314
6315 FormatStyle Style = getLLVMStyle();
6316 Style.AlwaysBreakBeforeMultilineStrings = true;
6317 Style.ColumnLimit = 0;
6318 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006319
6320 // But 'import' might also be a regular C++ namespace.
6321 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6322 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006323}
6324
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006325//===----------------------------------------------------------------------===//
6326// Error recovery tests.
6327//===----------------------------------------------------------------------===//
6328
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006329TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006330 FormatStyle NoBinPacking = getLLVMStyle();
6331 NoBinPacking.BinPackParameters = false;
6332 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6333 " double *min_x,\n"
6334 " double *max_x,\n"
6335 " double *min_y,\n"
6336 " double *max_y,\n"
6337 " double *min_z,\n"
6338 " double *max_z, ) {}",
6339 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006340}
6341
Daniel Jasper83a54d22013-01-10 09:26:47 +00006342TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006343 verifyFormat("void f() { return; }\n42");
6344 verifyFormat("void f() {\n"
6345 " if (0)\n"
6346 " return;\n"
6347 "}\n"
6348 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006349 verifyFormat("void f() { return }\n42");
6350 verifyFormat("void f() {\n"
6351 " if (0)\n"
6352 " return\n"
6353 "}\n"
6354 "42");
6355}
6356
6357TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6358 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6359 EXPECT_EQ("void f() {\n"
6360 " if (a)\n"
6361 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006362 "}",
6363 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006364 EXPECT_EQ("namespace N {\n"
6365 "void f()\n"
6366 "}",
6367 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006368 EXPECT_EQ("namespace N {\n"
6369 "void f() {}\n"
6370 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006371 "}",
6372 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006373}
6374
Daniel Jasper2df93312013-01-09 10:16:05 +00006375TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6376 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006377 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006378 " b;",
6379 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006380 verifyFormat("function(\n"
6381 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006382 " LoooooooooooongArgument);\n",
6383 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006384}
6385
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006386TEST_F(FormatTest, IncorrectAccessSpecifier) {
6387 verifyFormat("public:");
6388 verifyFormat("class A {\n"
6389 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006390 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006391 "};");
6392 verifyFormat("public\n"
6393 "int qwerty;");
6394 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006395 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006396 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006397 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006398 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006399 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006400}
Daniel Jasperf7935112012-12-03 18:12:45 +00006401
Daniel Jasper291f9362013-03-20 15:58:10 +00006402TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6403 verifyFormat("{");
6404 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006405 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006406}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006407
6408TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006409 verifyFormat("do {\n}");
6410 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006411 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006412 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006413 "wheeee(fun);");
6414 verifyFormat("do {\n"
6415 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006416 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006417}
6418
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006419TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006420 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006421 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006422 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006423 verifyFormat("while {\n foo;\n foo();\n}");
6424 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006425}
6426
Daniel Jasperc0880a92013-01-04 18:52:56 +00006427TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006428 verifyIncompleteFormat("namespace {\n"
6429 "class Foo { Foo (\n"
6430 "};\n"
6431 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006432}
6433
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006434TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006435 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006436 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6437 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006438 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006439
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006440 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006441 " {\n"
6442 " breakme(\n"
6443 " qwe);\n"
6444 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006445 format("{\n"
6446 " {\n"
6447 " breakme(qwe);\n"
6448 "}\n",
6449 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006450}
6451
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006452TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006453 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006454 " avariable,\n"
6455 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006456 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006457}
6458
Manuel Klimek762dd182013-01-21 10:07:49 +00006459TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006460 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006461}
6462
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006463TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006464 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006465 verifyFormat("vector<int> x{\n"
6466 " 1, 2, 3, 4,\n"
6467 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006468 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6469 verifyFormat("f({1, 2});");
6470 verifyFormat("auto v = Foo{-1};");
6471 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6472 verifyFormat("Class::Class : member{1, 2, 3} {}");
6473 verifyFormat("new vector<int>{1, 2, 3};");
6474 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006475 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006476 verifyFormat("return {arg1, arg2};");
6477 verifyFormat("return {arg1, SomeType{parameter}};");
6478 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6479 verifyFormat("new T{arg1, arg2};");
6480 verifyFormat("f(MyMap[{composite, key}]);");
6481 verifyFormat("class Class {\n"
6482 " T member = {arg1, arg2};\n"
6483 "};");
6484 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006485 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6486 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006487
Daniel Jasper438059e2014-05-22 12:11:13 +00006488 verifyFormat("int foo(int i) { return fo1{}(i); }");
6489 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006490 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006491 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006492 verifyFormat("Node n{1, Node{1000}, //\n"
6493 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006494 verifyFormat("Aaaa aaaaaaa{\n"
6495 " {\n"
6496 " aaaa,\n"
6497 " },\n"
6498 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006499 verifyFormat("class C : public D {\n"
6500 " SomeClass SC{2};\n"
6501 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006502 verifyFormat("class C : public A {\n"
6503 " class D : public B {\n"
6504 " void f() { int i{2}; }\n"
6505 " };\n"
6506 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006507 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006508
Daniel Jasper08434342015-05-26 07:26:26 +00006509 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006510 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006511 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006512 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6513 " bbbbb,\n"
6514 " ccccc,\n"
6515 " ddddd,\n"
6516 " eeeee,\n"
6517 " ffffff,\n"
6518 " ggggg,\n"
6519 " hhhhhh,\n"
6520 " iiiiii,\n"
6521 " jjjjjj,\n"
6522 " kkkkkk};",
6523 NoBinPacking);
6524 verifyFormat("const Aaaaaa aaaaa = {\n"
6525 " aaaaa,\n"
6526 " bbbbb,\n"
6527 " ccccc,\n"
6528 " ddddd,\n"
6529 " eeeee,\n"
6530 " ffffff,\n"
6531 " ggggg,\n"
6532 " hhhhhh,\n"
6533 " iiiiii,\n"
6534 " jjjjjj,\n"
6535 " kkkkkk,\n"
6536 "};",
6537 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006538 verifyFormat(
6539 "const Aaaaaa aaaaa = {\n"
6540 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6541 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6542 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6543 "};",
6544 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006545
Chandler Carruthf8b72662014-03-02 12:37:31 +00006546 // FIXME: The alignment of these trailing comments might be bad. Then again,
6547 // this might be utterly useless in real code.
6548 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006549 " : some_value{ //\n"
6550 " aaaaaaa, //\n"
6551 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006552
Chandler Carruthf8b72662014-03-02 12:37:31 +00006553 // In braced lists, the first comment is always assumed to belong to the
6554 // first element. Thus, it can be moved to the next or previous line as
6555 // appropriate.
6556 EXPECT_EQ("function({// First element:\n"
6557 " 1,\n"
6558 " // Second element:\n"
6559 " 2});",
6560 format("function({\n"
6561 " // First element:\n"
6562 " 1,\n"
6563 " // Second element:\n"
6564 " 2});"));
6565 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6566 " // First element:\n"
6567 " 1,\n"
6568 " // Second element:\n"
6569 " 2};",
6570 format("std::vector<int> MyNumbers{// First element:\n"
6571 " 1,\n"
6572 " // Second element:\n"
6573 " 2};",
6574 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00006575 // A trailing comma should still lead to an enforced line break.
6576 EXPECT_EQ("vector<int> SomeVector = {\n"
6577 " // aaa\n"
6578 " 1, 2,\n"
6579 "};",
6580 format("vector<int> SomeVector = { // aaa\n"
6581 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006582
Chandler Carruthf8b72662014-03-02 12:37:31 +00006583 FormatStyle ExtraSpaces = getLLVMStyle();
6584 ExtraSpaces.Cpp11BracedListStyle = false;
6585 ExtraSpaces.ColumnLimit = 75;
6586 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6587 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6588 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6589 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6590 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6591 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6592 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6593 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6594 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6595 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6596 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6597 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6598 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6599 verifyFormat("class Class {\n"
6600 " T member = { arg1, arg2 };\n"
6601 "};",
6602 ExtraSpaces);
6603 verifyFormat(
6604 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6605 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6606 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6607 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6608 ExtraSpaces);
6609 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006610 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006611 ExtraSpaces);
6612 verifyFormat(
6613 "someFunction(OtherParam,\n"
6614 " BracedList{ // comment 1 (Forcing interesting break)\n"
6615 " param1, param2,\n"
6616 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006617 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006618 ExtraSpaces);
6619 verifyFormat(
6620 "std::this_thread::sleep_for(\n"
6621 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6622 ExtraSpaces);
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006623 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaa{\n"
6624 " aaaaaaa,\n"
6625 " aaaaaaaaaa,\n"
6626 " aaaaa,\n"
6627 " aaaaaaaaaaaaaaa,\n"
6628 " aaa,\n"
6629 " aaaaaaaaaa,\n"
6630 " a,\n"
6631 " aaaaaaaaaaaaaaaaaaaaa,\n"
6632 " aaaaaaaaaaaa,\n"
6633 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6634 " aaaaaaa,\n"
6635 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006636 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006637}
6638
Daniel Jasper33b909c2013-10-25 14:29:37 +00006639TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006640 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6641 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6642 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6643 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6644 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6645 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006646 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006647 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006648 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006649 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6650 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006651 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006652 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6653 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6654 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6655 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6656 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6657 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6658 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006659 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006660 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6661 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006662 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6663 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6664 " // Separating comment.\n"
6665 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6666 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6667 " // Leading comment\n"
6668 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6669 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006670 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6671 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006672 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006673 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6674 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006675 getLLVMStyleWithColumns(38));
6676 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006677 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6678 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006679 verifyFormat(
6680 "static unsigned SomeValues[10][3] = {\n"
6681 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6682 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6683 verifyFormat("static auto fields = new vector<string>{\n"
6684 " \"aaaaaaaaaaaaa\",\n"
6685 " \"aaaaaaaaaaaaa\",\n"
6686 " \"aaaaaaaaaaaa\",\n"
6687 " \"aaaaaaaaaaaaaa\",\n"
6688 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6689 " \"aaaaaaaaaaaa\",\n"
6690 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6691 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006692 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6693 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6694 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6695 " 3, cccccccccccccccccccccc};",
6696 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006697
6698 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006699 verifyFormat("vector<int> x = {\n"
6700 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6701 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006702 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006703 verifyFormat("vector<int> x = {\n"
6704 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006705 "};",
6706 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006707 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6708 " 1, 1, 1, 1,\n"
6709 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006710 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006711
Daniel Jasper60c27072015-05-13 08:16:00 +00006712 // Trailing comment in the first line.
6713 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6714 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6715 " 111111111, 222222222, 3333333333, 444444444, //\n"
6716 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006717 // Trailing comment in the last line.
6718 verifyFormat("int aaaaa[] = {\n"
6719 " 1, 2, 3, // comment\n"
6720 " 4, 5, 6 // comment\n"
6721 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006722
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006723 // With nested lists, we should either format one item per line or all nested
6724 // lists one on line.
6725 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006726 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6727 " {aaaaaaaaaaaaaaaaaaa},\n"
6728 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6729 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006730 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006731 verifyFormat(
6732 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006733 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6734 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6735 " {aaa, aaa},\n"
6736 " {aaa, aaa},\n"
6737 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6738 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6739 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006740
6741 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006742 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
6743 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006744
6745 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006746
Daniel Jaspereb65e912015-12-21 18:31:15 +00006747 // No braced initializer here.
6748 verifyFormat("void f() {\n"
6749 " struct Dummy {};\n"
6750 " f(v);\n"
6751 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006752
6753 // Long lists should be formatted in columns even if they are nested.
6754 verifyFormat(
6755 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6756 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6757 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6758 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6759 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6760 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006761}
6762
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006763TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006764 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006765 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006766
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006767 verifyFormat("void f() { return 42; }");
6768 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006769 " return 42;\n"
6770 "}",
6771 DoNotMerge);
6772 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006773 " // Comment\n"
6774 "}");
6775 verifyFormat("{\n"
6776 "#error {\n"
6777 " int a;\n"
6778 "}");
6779 verifyFormat("{\n"
6780 " int a;\n"
6781 "#error {\n"
6782 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006783 verifyFormat("void f() {} // comment");
6784 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006785 verifyFormat("void f() {\n"
6786 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006787 DoNotMerge);
6788 verifyFormat("void f() {\n"
6789 " int a;\n"
6790 "} // comment",
6791 DoNotMerge);
6792 verifyFormat("void f() {\n"
6793 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006794 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006795
6796 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6797 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6798
6799 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6800 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006801 verifyFormat("class C {\n"
6802 " C()\n"
6803 " : iiiiiiii(nullptr),\n"
6804 " kkkkkkk(nullptr),\n"
6805 " mmmmmmm(nullptr),\n"
6806 " nnnnnnn(nullptr) {}\n"
6807 "};",
6808 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006809
6810 FormatStyle NoColumnLimit = getLLVMStyle();
6811 NoColumnLimit.ColumnLimit = 0;
6812 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6813 EXPECT_EQ("class C {\n"
6814 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006815 "};",
6816 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006817 EXPECT_EQ("A()\n"
6818 " : b(0) {\n"
6819 "}",
6820 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6821
6822 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006823 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6824 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006825 EXPECT_EQ("A()\n"
6826 " : b(0) {\n"
6827 "}",
6828 format("A():b(0){}", DoNotMergeNoColumnLimit));
6829 EXPECT_EQ("A()\n"
6830 " : b(0) {\n"
6831 "}",
6832 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006833
6834 verifyFormat("#define A \\\n"
6835 " void f() { \\\n"
6836 " int i; \\\n"
6837 " }",
6838 getLLVMStyleWithColumns(20));
6839 verifyFormat("#define A \\\n"
6840 " void f() { int i; }",
6841 getLLVMStyleWithColumns(21));
6842 verifyFormat("#define A \\\n"
6843 " void f() { \\\n"
6844 " int i; \\\n"
6845 " } \\\n"
6846 " int j;",
6847 getLLVMStyleWithColumns(22));
6848 verifyFormat("#define A \\\n"
6849 " void f() { int i; } \\\n"
6850 " int j;",
6851 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006852}
6853
Daniel Jasperd74cf402014-04-08 12:46:38 +00006854TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6855 FormatStyle MergeInlineOnly = getLLVMStyle();
6856 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6857 verifyFormat("class C {\n"
6858 " int f() { return 42; }\n"
6859 "};",
6860 MergeInlineOnly);
6861 verifyFormat("int f() {\n"
6862 " return 42;\n"
6863 "}",
6864 MergeInlineOnly);
6865}
6866
Manuel Klimeke01bab52013-01-15 13:38:33 +00006867TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6868 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006869 verifyFormat("struct foo a = {bar};\nint n;");
6870 verifyFormat("class foo a = {bar};\nint n;");
6871 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006872
6873 // Elaborate types inside function definitions.
6874 verifyFormat("struct foo f() {}\nint n;");
6875 verifyFormat("class foo f() {}\nint n;");
6876 verifyFormat("union foo f() {}\nint n;");
6877
6878 // Templates.
6879 verifyFormat("template <class X> void f() {}\nint n;");
6880 verifyFormat("template <struct X> void f() {}\nint n;");
6881 verifyFormat("template <union X> void f() {}\nint n;");
6882
6883 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006884 verifyFormat("struct {\n} n;");
6885 verifyFormat(
6886 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006887 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006888 verifyFormat("class MACRO Z {\n} n;");
6889 verifyFormat("class MACRO(X) Z {\n} n;");
6890 verifyFormat("class __attribute__(X) Z {\n} n;");
6891 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006892 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006893 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006894 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6895 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006896
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006897 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006898 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006899
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006900 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006901 verifyFormat(
6902 "template <typename F>\n"
6903 "Matcher(const Matcher<F> &Other,\n"
6904 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6905 " !is_same<F, T>::value>::type * = 0)\n"
6906 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6907
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006908 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006909 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006910 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006911
6912 // FIXME:
6913 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006914 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006915
Manuel Klimeke01bab52013-01-15 13:38:33 +00006916 // Elaborate types where incorrectly parsing the structural element would
6917 // break the indent.
6918 verifyFormat("if (true)\n"
6919 " class X x;\n"
6920 "else\n"
6921 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006922
6923 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006924 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006925}
6926
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006927TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00006928 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
6929 format("#error Leave all white!!!!! space* alone!\n"));
6930 EXPECT_EQ(
6931 "#warning Leave all white!!!!! space* alone!\n",
6932 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006933 EXPECT_EQ("#error 1", format(" # error 1"));
6934 EXPECT_EQ("#warning 1", format(" # warning 1"));
6935}
6936
Daniel Jasper4431aa92013-04-23 13:54:04 +00006937TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00006938 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00006939 verifyFormat("#if (AAAA && BBBB)");
6940 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00006941 // FIXME: Come up with a better indentation for #elif.
6942 verifyFormat(
6943 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
6944 " defined(BBBBBBBB)\n"
6945 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
6946 " defined(BBBBBBBB)\n"
6947 "#endif",
6948 getLLVMStyleWithColumns(65));
6949}
6950
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006951TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
6952 FormatStyle AllowsMergedIf = getGoogleStyle();
6953 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
6954 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
6955 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00006956 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
6957 EXPECT_EQ("if (true) return 42;",
6958 format("if (true)\nreturn 42;", AllowsMergedIf));
6959 FormatStyle ShortMergedIf = AllowsMergedIf;
6960 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006961 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006962 " if (true) return 42;",
6963 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006964 verifyFormat("#define A \\\n"
6965 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006966 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006967 "#define B",
6968 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006969 verifyFormat("#define A \\\n"
6970 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006971 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006972 "g();",
6973 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00006974 verifyFormat("{\n"
6975 "#ifdef A\n"
6976 " // Comment\n"
6977 " if (true) continue;\n"
6978 "#endif\n"
6979 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00006980 " if (true) continue;\n"
6981 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006982 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00006983 ShortMergedIf.ColumnLimit = 29;
6984 verifyFormat("#define A \\\n"
6985 " if (aaaaaaaaaa) return 1; \\\n"
6986 " return 2;",
6987 ShortMergedIf);
6988 ShortMergedIf.ColumnLimit = 28;
6989 verifyFormat("#define A \\\n"
6990 " if (aaaaaaaaaa) \\\n"
6991 " return 1; \\\n"
6992 " return 2;",
6993 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006994}
6995
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00006996TEST_F(FormatTest, BlockCommentsInControlLoops) {
6997 verifyFormat("if (0) /* a comment in a strange place */ {\n"
6998 " f();\n"
6999 "}");
7000 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7001 " f();\n"
7002 "} /* another comment */ else /* comment #3 */ {\n"
7003 " g();\n"
7004 "}");
7005 verifyFormat("while (0) /* a comment in a strange place */ {\n"
7006 " f();\n"
7007 "}");
7008 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
7009 " f();\n"
7010 "}");
7011 verifyFormat("do /* a comment in a strange place */ {\n"
7012 " f();\n"
7013 "} /* another comment */ while (0);");
7014}
7015
7016TEST_F(FormatTest, BlockComments) {
7017 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7018 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007019 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007020 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007021 " b\n"
7022 "/* */\n"
7023 "someCall(\n"
7024 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007025 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007026 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007027 "someCall(parameter);",
7028 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007029
7030 EXPECT_EQ("#define A\n"
7031 "/* */ someCall(\n"
7032 " parameter);",
7033 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007034 "/* */someCall(parameter);",
7035 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007036 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007037 EXPECT_EQ("/*\n"
7038 "*\n"
7039 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007040 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007041 "*/",
7042 format("/*\n"
7043 "*\n"
7044 " * aaaaaa aaaaaa\n"
7045 "*/",
7046 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007047 EXPECT_EQ("/*\n"
7048 "**\n"
7049 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007050 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007051 "*/",
7052 format("/*\n"
7053 "**\n"
7054 "* aaaaaa aaaaaa\n"
7055 "*/",
7056 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007057 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7058 " /* line 1\n"
7059 " bbbbbbbbbbbb */\n"
7060 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7061 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7062 " /* line 1\n"
7063 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7064 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007065
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007066 FormatStyle NoBinPacking = getLLVMStyle();
7067 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007068 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7069 " 2, /* comment 2 */\n"
7070 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007071 " aaaa,\n"
7072 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007073 format("someFunction (1, /* comment 1 */\n"
7074 " 2, /* comment 2 */ \n"
7075 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007076 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007077 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007078 verifyFormat(
7079 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7080 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7081 EXPECT_EQ(
7082 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7083 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7084 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7085 format(
7086 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7087 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7088 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007089 EXPECT_EQ(
7090 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7091 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7092 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7093 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7094 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7095 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007096
7097 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007098
7099 EXPECT_EQ("/*\n"
7100 " **\n"
7101 " */",
7102 format("/*\n"
7103 " **\n"
7104 " */"));
7105 EXPECT_EQ("/*\n"
7106 " *q\n"
7107 " */",
7108 format("/*\n"
7109 " *q\n"
7110 " */"));
7111 EXPECT_EQ("/*\n"
7112 " * q\n"
7113 " */",
7114 format("/*\n"
7115 " * q\n"
7116 " */"));
7117 EXPECT_EQ("/*\n"
7118 " **/",
7119 format("/*\n"
7120 " **/"));
7121 EXPECT_EQ("/*\n"
7122 " ***/",
7123 format("/*\n"
7124 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007125}
7126
Manuel Klimek82b836a2013-02-06 16:40:56 +00007127TEST_F(FormatTest, BlockCommentsInMacros) {
7128 EXPECT_EQ("#define A \\\n"
7129 " { \\\n"
7130 " /* one line */ \\\n"
7131 " someCall();",
7132 format("#define A { \\\n"
7133 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007134 " someCall();",
7135 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007136 EXPECT_EQ("#define A \\\n"
7137 " { \\\n"
7138 " /* previous */ \\\n"
7139 " /* one line */ \\\n"
7140 " someCall();",
7141 format("#define A { \\\n"
7142 " /* previous */ \\\n"
7143 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007144 " someCall();",
7145 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007146}
7147
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007148TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7149 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007150 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007151 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007152 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007153 "};",
7154 getLLVMStyleWithColumns(15)));
7155 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007156 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007157 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007158 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007159 "};",
7160 getLLVMStyleWithColumns(15)));
7161
7162 // FIXME: The formatting is still wrong here.
7163 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007164 " 1111 /* a\n"
7165 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007166 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007167 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007168 "};",
7169 getLLVMStyleWithColumns(15)));
7170}
7171
Manuel Klimek82b836a2013-02-06 16:40:56 +00007172TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007173 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007174 " // a\n"
7175 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007176}
7177
Manuel Klimekd33516e2013-01-23 10:09:28 +00007178TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007179 verifyFormat("void f(int *a);");
7180 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007181 verifyFormat("class A {\n void f(int *a);\n};");
7182 verifyFormat("class A {\n int *a;\n};");
7183 verifyFormat("namespace a {\n"
7184 "namespace b {\n"
7185 "class A {\n"
7186 " void f() {}\n"
7187 " int *a;\n"
7188 "};\n"
7189 "}\n"
7190 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007191}
7192
Manuel Klimekd33516e2013-01-23 10:09:28 +00007193TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7194 verifyFormat("while");
7195 verifyFormat("operator");
7196}
7197
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007198TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7199 // This code would be painfully slow to format if we didn't skip it.
7200 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
7201 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7202 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7203 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7204 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7205 "A(1, 1)\n"
7206 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7207 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7208 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7209 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7210 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7211 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7212 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7213 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7214 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7215 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7216 // Deeply nested part is untouched, rest is formatted.
7217 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7218 format(std::string("int i;\n") + Code + "int j;\n",
7219 getLLVMStyle(), IC_ExpectIncomplete));
7220}
7221
Nico Weber7e6a7a12013-01-08 17:56:31 +00007222//===----------------------------------------------------------------------===//
7223// Objective-C tests.
7224//===----------------------------------------------------------------------===//
7225
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007226TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7227 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7228 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7229 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007230 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007231 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7232 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7233 format("-(NSInteger)Method3:(id)anObject;"));
7234 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7235 format("-(NSInteger)Method4:(id)anObject;"));
7236 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7237 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7238 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7239 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007240 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7241 "forAllCells:(BOOL)flag;",
7242 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7243 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007244
7245 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007246 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7247 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007248 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7249 " inRange:(NSRange)range\n"
7250 " outRange:(NSRange)out_range\n"
7251 " outRange1:(NSRange)out_range1\n"
7252 " outRange2:(NSRange)out_range2\n"
7253 " outRange3:(NSRange)out_range3\n"
7254 " outRange4:(NSRange)out_range4\n"
7255 " outRange5:(NSRange)out_range5\n"
7256 " outRange6:(NSRange)out_range6\n"
7257 " outRange7:(NSRange)out_range7\n"
7258 " outRange8:(NSRange)out_range8\n"
7259 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007260
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007261 // When the function name has to be wrapped.
7262 FormatStyle Style = getLLVMStyle();
7263 Style.IndentWrappedFunctionNames = false;
7264 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7265 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7266 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7267 "}",
7268 Style);
7269 Style.IndentWrappedFunctionNames = true;
7270 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7271 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7272 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7273 "}",
7274 Style);
7275
Nico Weberd6f962f2013-01-10 20:18:33 +00007276 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007277 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007278 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7279 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007280 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007281
Daniel Jasper37194282013-05-28 08:33:00 +00007282 verifyFormat("- (int (*)())foo:(int (*)())f;");
7283 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007284
7285 // If there's no return type (very rare in practice!), LLVM and Google style
7286 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007287 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007288 verifyFormat("- foo:(int)f;");
7289 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007290}
7291
Nico Weber7eecf4b2013-01-09 20:25:35 +00007292TEST_F(FormatTest, FormatObjCInterface) {
Nico Webera6087752013-01-10 20:12:55 +00007293 verifyFormat("@interface Foo : NSObject <NSSomeDelegate> {\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007294 "@public\n"
7295 " int field1;\n"
7296 "@protected\n"
7297 " int field2;\n"
7298 "@private\n"
7299 " int field3;\n"
7300 "@package\n"
7301 " int field4;\n"
7302 "}\n"
7303 "+ (id)init;\n"
7304 "@end");
7305
Nico Weber7eecf4b2013-01-09 20:25:35 +00007306 verifyGoogleFormat("@interface Foo : NSObject<NSSomeDelegate> {\n"
7307 " @public\n"
7308 " int field1;\n"
7309 " @protected\n"
7310 " int field2;\n"
7311 " @private\n"
7312 " int field3;\n"
7313 " @package\n"
7314 " int field4;\n"
7315 "}\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007316 "+ (id)init;\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007317 "@end");
7318
Nico Weber6029d4f2013-01-22 16:53:59 +00007319 verifyFormat("@interface /* wait for it */ Foo\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007320 "+ (id)init;\n"
7321 "// Look, a comment!\n"
7322 "- (int)answerWith:(int)i;\n"
7323 "@end");
7324
7325 verifyFormat("@interface Foo\n"
Nico Weberd8ffe752013-01-09 21:42:32 +00007326 "@end\n"
7327 "@interface Bar\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007328 "@end");
7329
7330 verifyFormat("@interface Foo : Bar\n"
7331 "+ (id)init;\n"
7332 "@end");
7333
Nico Weber6029d4f2013-01-22 16:53:59 +00007334 verifyFormat("@interface Foo : /**/ Bar /**/ <Baz, /**/ Quux>\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007335 "+ (id)init;\n"
7336 "@end");
7337
Nico Webera6087752013-01-10 20:12:55 +00007338 verifyGoogleFormat("@interface Foo : Bar<Baz, Quux>\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007339 "+ (id)init;\n"
Nico Webera6087752013-01-10 20:12:55 +00007340 "@end");
7341
Nico Weber2bb00742013-01-10 19:19:14 +00007342 verifyFormat("@interface Foo (HackStuff)\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007343 "+ (id)init;\n"
7344 "@end");
7345
Nico Weber2bb00742013-01-10 19:19:14 +00007346 verifyFormat("@interface Foo ()\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007347 "+ (id)init;\n"
7348 "@end");
7349
Nico Webera6087752013-01-10 20:12:55 +00007350 verifyFormat("@interface Foo (HackStuff) <MyProtocol>\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007351 "+ (id)init;\n"
7352 "@end");
7353
Daniel Jasper20e15562015-04-16 07:02:19 +00007354 verifyGoogleFormat("@interface Foo (HackStuff)<MyProtocol>\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007355 "+ (id)init;\n"
Nico Webera6087752013-01-10 20:12:55 +00007356 "@end");
7357
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007358 verifyFormat("@interface Foo {\n"
7359 " int _i;\n"
7360 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007361 "+ (id)init;\n"
7362 "@end");
7363
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007364 verifyFormat("@interface Foo : Bar {\n"
7365 " int _i;\n"
7366 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007367 "+ (id)init;\n"
7368 "@end");
7369
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007370 verifyFormat("@interface Foo : Bar <Baz, Quux> {\n"
7371 " int _i;\n"
7372 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007373 "+ (id)init;\n"
7374 "@end");
7375
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007376 verifyFormat("@interface Foo (HackStuff) {\n"
7377 " int _i;\n"
7378 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007379 "+ (id)init;\n"
7380 "@end");
7381
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007382 verifyFormat("@interface Foo () {\n"
7383 " int _i;\n"
7384 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007385 "+ (id)init;\n"
7386 "@end");
7387
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007388 verifyFormat("@interface Foo (HackStuff) <MyProtocol> {\n"
7389 " int _i;\n"
7390 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007391 "+ (id)init;\n"
7392 "@end");
Daniel Jasper437c3f52014-04-28 07:34:48 +00007393
7394 FormatStyle OnePerLine = getGoogleStyle();
7395 OnePerLine.BinPackParameters = false;
Daniel Jasper20e15562015-04-16 07:02:19 +00007396 verifyFormat("@interface aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ()<\n"
Daniel Jasper437c3f52014-04-28 07:34:48 +00007397 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7398 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7399 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7400 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
7401 "}",
7402 OnePerLine);
Nico Weber7eecf4b2013-01-09 20:25:35 +00007403}
7404
Nico Weber2ce0ac52013-01-09 23:25:37 +00007405TEST_F(FormatTest, FormatObjCImplementation) {
7406 verifyFormat("@implementation Foo : NSObject {\n"
7407 "@public\n"
7408 " int field1;\n"
7409 "@protected\n"
7410 " int field2;\n"
7411 "@private\n"
7412 " int field3;\n"
7413 "@package\n"
7414 " int field4;\n"
7415 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007416 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007417 "@end");
7418
7419 verifyGoogleFormat("@implementation Foo : NSObject {\n"
7420 " @public\n"
7421 " int field1;\n"
7422 " @protected\n"
7423 " int field2;\n"
7424 " @private\n"
7425 " int field3;\n"
7426 " @package\n"
7427 " int field4;\n"
7428 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007429 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007430 "@end");
7431
7432 verifyFormat("@implementation Foo\n"
7433 "+ (id)init {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +00007434 " if (true)\n"
7435 " return nil;\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007436 "}\n"
7437 "// Look, a comment!\n"
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007438 "- (int)answerWith:(int)i {\n"
7439 " return i;\n"
7440 "}\n"
Nico Webera21aaae2013-01-11 21:14:08 +00007441 "+ (int)answerWith:(int)i {\n"
7442 " return i;\n"
7443 "}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007444 "@end");
7445
7446 verifyFormat("@implementation Foo\n"
7447 "@end\n"
7448 "@implementation Bar\n"
7449 "@end");
7450
Daniel Jasper91b032a2014-05-22 12:46:38 +00007451 EXPECT_EQ("@implementation Foo : Bar\n"
7452 "+ (id)init {\n}\n"
7453 "- (void)foo {\n}\n"
7454 "@end",
7455 format("@implementation Foo : Bar\n"
7456 "+(id)init{}\n"
7457 "-(void)foo{}\n"
7458 "@end"));
Nico Weber2ce0ac52013-01-09 23:25:37 +00007459
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007460 verifyFormat("@implementation Foo {\n"
7461 " int _i;\n"
7462 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007463 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007464 "@end");
7465
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007466 verifyFormat("@implementation Foo : Bar {\n"
7467 " int _i;\n"
7468 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007469 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007470 "@end");
7471
Nico Weber2bb00742013-01-10 19:19:14 +00007472 verifyFormat("@implementation Foo (HackStuff)\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007473 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007474 "@end");
Daniel Jaspera15da302013-08-28 08:04:23 +00007475 verifyFormat("@implementation ObjcClass\n"
7476 "- (void)method;\n"
7477 "{}\n"
7478 "@end");
Nico Weber2ce0ac52013-01-09 23:25:37 +00007479}
7480
Nico Weber8696a8d2013-01-09 21:15:03 +00007481TEST_F(FormatTest, FormatObjCProtocol) {
7482 verifyFormat("@protocol Foo\n"
7483 "@property(weak) id delegate;\n"
7484 "- (NSUInteger)numberOfThings;\n"
7485 "@end");
7486
Nico Webera6087752013-01-10 20:12:55 +00007487 verifyFormat("@protocol MyProtocol <NSObject>\n"
Nico Weber8696a8d2013-01-09 21:15:03 +00007488 "- (NSUInteger)numberOfThings;\n"
7489 "@end");
7490
Nico Webera6087752013-01-10 20:12:55 +00007491 verifyGoogleFormat("@protocol MyProtocol<NSObject>\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007492 "- (NSUInteger)numberOfThings;\n"
Nico Webera6087752013-01-10 20:12:55 +00007493 "@end");
7494
Nico Weber8696a8d2013-01-09 21:15:03 +00007495 verifyFormat("@protocol Foo;\n"
7496 "@protocol Bar;\n");
Nico Weberd8ffe752013-01-09 21:42:32 +00007497
7498 verifyFormat("@protocol Foo\n"
7499 "@end\n"
7500 "@protocol Bar\n"
7501 "@end");
Nico Weber51306d22013-01-10 00:25:19 +00007502
7503 verifyFormat("@protocol myProtocol\n"
7504 "- (void)mandatoryWithInt:(int)i;\n"
7505 "@optional\n"
7506 "- (void)optional;\n"
7507 "@required\n"
7508 "- (void)required;\n"
Nico Weberbbe28b32013-01-10 00:42:07 +00007509 "@optional\n"
7510 "@property(assign) int madProp;\n"
Nico Weber51306d22013-01-10 00:25:19 +00007511 "@end\n");
Daniel Jasper9688ff12013-08-01 13:46:58 +00007512
7513 verifyFormat("@property(nonatomic, assign, readonly)\n"
7514 " int *looooooooooooooooooooooooooooongNumber;\n"
7515 "@property(nonatomic, assign, readonly)\n"
7516 " NSString *looooooooooooooooooooooooooooongName;");
Benjamin Kramere21cb742014-01-08 15:59:42 +00007517
7518 verifyFormat("@implementation PR18406\n"
7519 "}\n"
7520 "@end");
Nico Weber8696a8d2013-01-09 21:15:03 +00007521}
7522
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007523TEST_F(FormatTest, FormatObjCMethodDeclarations) {
7524 verifyFormat("- (void)doSomethingWith:(GTMFoo *)theFoo\n"
7525 " rect:(NSRect)theRect\n"
7526 " interval:(float)theInterval {\n"
7527 "}");
7528 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
Daniel Jasper06a26952016-01-04 07:29:07 +00007529 " longKeyword:(NSRect)theRect\n"
7530 " longerKeyword:(float)theInterval\n"
7531 " error:(NSError **)theError {\n"
7532 "}");
7533 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007534 " longKeyword:(NSRect)theRect\n"
7535 " evenLongerKeyword:(float)theInterval\n"
7536 " error:(NSError **)theError {\n"
7537 "}");
Daniel Jasperec8e8382014-10-11 08:24:56 +00007538 verifyFormat("- (instancetype)initXxxxxx:(id<x>)x\n"
7539 " y:(id<yyyyyyyyyyyyyyyyyyyy>)y\n"
7540 " NS_DESIGNATED_INITIALIZER;",
7541 getLLVMStyleWithColumns(60));
Daniel Jasper3c44c222015-07-16 22:58:24 +00007542
7543 // Continuation indent width should win over aligning colons if the function
7544 // name is long.
7545 FormatStyle continuationStyle = getGoogleStyle();
7546 continuationStyle.ColumnLimit = 40;
7547 continuationStyle.IndentWrappedFunctionNames = true;
7548 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
7549 " dontAlignNamef:(NSRect)theRect {\n"
7550 "}",
7551 continuationStyle);
7552
7553 // Make sure we don't break aligning for short parameter names.
7554 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
7555 " aShortf:(NSRect)theRect {\n"
7556 "}",
7557 continuationStyle);
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007558}
7559
Nico Webera7252d82013-01-12 06:18:40 +00007560TEST_F(FormatTest, FormatObjCMethodExpr) {
7561 verifyFormat("[foo bar:baz];");
7562 verifyFormat("return [foo bar:baz];");
Daniel Jasperea772b4d2014-10-16 08:38:51 +00007563 verifyFormat("return (a)[foo bar:baz];");
Nico Webera7252d82013-01-12 06:18:40 +00007564 verifyFormat("f([foo bar:baz]);");
7565 verifyFormat("f(2, [foo bar:baz]);");
7566 verifyFormat("f(2, a ? b : c);");
7567 verifyFormat("[[self initWithInt:4] bar:[baz quux:arrrr]];");
7568
Nico Weberb76de882013-02-05 16:21:00 +00007569 // Unary operators.
7570 verifyFormat("int a = +[foo bar:baz];");
7571 verifyFormat("int a = -[foo bar:baz];");
7572 verifyFormat("int a = ![foo bar:baz];");
7573 verifyFormat("int a = ~[foo bar:baz];");
7574 verifyFormat("int a = ++[foo bar:baz];");
7575 verifyFormat("int a = --[foo bar:baz];");
7576 verifyFormat("int a = sizeof [foo bar:baz];");
Alexander Kornienko1e808872013-06-28 12:51:24 +00007577 verifyFormat("int a = alignof [foo bar:baz];", getGoogleStyle());
Nico Weber5d2624e2013-02-06 06:20:11 +00007578 verifyFormat("int a = &[foo bar:baz];");
7579 verifyFormat("int a = *[foo bar:baz];");
Nico Weberb76de882013-02-05 16:21:00 +00007580 // FIXME: Make casts work, without breaking f()[4].
Daniel Jaspera44991332015-04-29 13:06:49 +00007581 // verifyFormat("int a = (int)[foo bar:baz];");
7582 // verifyFormat("return (int)[foo bar:baz];");
7583 // verifyFormat("(void)[foo bar:baz];");
Nico Webera7892392013-02-13 03:48:27 +00007584 verifyFormat("return (MyType *)[self.tableView cellForRowAtIndexPath:cell];");
Nico Weberb76de882013-02-05 16:21:00 +00007585
7586 // Binary operators.
Nico Webera7252d82013-01-12 06:18:40 +00007587 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] : [foo bar:baz];");
7600 verifyFormat("[foo bar:baz] || [foo bar:baz];");
7601 verifyFormat("[foo bar:baz] && [foo bar:baz];");
7602 verifyFormat("[foo bar:baz] | [foo bar:baz];");
7603 verifyFormat("[foo bar:baz] ^ [foo bar:baz];");
7604 verifyFormat("[foo bar:baz] & [foo bar:baz];");
7605 verifyFormat("[foo bar:baz] == [foo bar:baz];");
7606 verifyFormat("[foo bar:baz] != [foo bar:baz];");
7607 verifyFormat("[foo bar:baz] >= [foo bar:baz];");
7608 verifyFormat("[foo bar:baz] <= [foo bar:baz];");
7609 verifyFormat("[foo bar:baz] > [foo bar:baz];");
7610 verifyFormat("[foo bar:baz] < [foo bar:baz];");
7611 verifyFormat("[foo bar:baz] >> [foo bar:baz];");
7612 verifyFormat("[foo bar:baz] << [foo bar:baz];");
7613 verifyFormat("[foo bar:baz] - [foo bar:baz];");
7614 verifyFormat("[foo bar:baz] + [foo bar:baz];");
7615 verifyFormat("[foo bar:baz] * [foo bar:baz];");
7616 verifyFormat("[foo bar:baz] / [foo bar:baz];");
7617 verifyFormat("[foo bar:baz] % [foo bar:baz];");
7618 // Whew!
7619
Nico Weber29f9dea2013-02-11 15:32:15 +00007620 verifyFormat("return in[42];");
Daniel Jasper3a623db2014-12-18 12:11:01 +00007621 verifyFormat("for (auto v : in[1]) {\n}");
Daniel Jasper2b1865c2015-04-15 07:26:18 +00007622 verifyFormat("for (int i = 0; i < in[a]; ++i) {\n}");
7623 verifyFormat("for (int i = 0; in[a] < i; ++i) {\n}");
7624 verifyFormat("for (int i = 0; i < n; ++i, ++in[a]) {\n}");
7625 verifyFormat("for (int i = 0; i < n; ++i, in[a]++) {\n}");
7626 verifyFormat("for (int i = 0; i < f(in[a]); ++i, in[a]++) {\n}");
Nico Weber29f9dea2013-02-11 15:32:15 +00007627 verifyFormat("for (id foo in [self getStuffFor:bla]) {\n"
7628 "}");
Daniel Jasper78580792014-10-20 12:01:45 +00007629 verifyFormat("[self aaaaa:MACRO(a, b:, c:)];");
Daniel Jaspercdb58b22015-05-15 09:05:31 +00007630 verifyFormat("[self aaaaa:(1 + 2) bbbbb:3];");
7631 verifyFormat("[self aaaaa:(Type)a bbbbb:3];");
Nico Weber29f9dea2013-02-11 15:32:15 +00007632
Nico Webera7252d82013-01-12 06:18:40 +00007633 verifyFormat("[self stuffWithInt:(4 + 2) float:4.5];");
7634 verifyFormat("[self stuffWithInt:a ? b : c float:4.5];");
7635 verifyFormat("[self stuffWithInt:a ? [self foo:bar] : c];");
7636 verifyFormat("[self stuffWithInt:a ? (e ? f : g) : c];");
7637 verifyFormat("[cond ? obj1 : obj2 methodWithParam:param]");
Nico Weber5c8709b2013-01-12 23:41:33 +00007638 verifyFormat("[button setAction:@selector(zoomOut:)];");
Nico Weber2827a7e2013-01-12 23:48:49 +00007639 verifyFormat("[color getRed:&r green:&g blue:&b alpha:&a];");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007640
Nico Webera7252d82013-01-12 06:18:40 +00007641 verifyFormat("arr[[self indexForFoo:a]];");
7642 verifyFormat("throw [self errorFor:a];");
7643 verifyFormat("@throw [self errorFor:a];");
7644
Nico Weberec9e4102013-06-25 00:55:57 +00007645 verifyFormat("[(id)foo bar:(id)baz quux:(id)snorf];");
7646 verifyFormat("[(id)foo bar:(id) ? baz : quux];");
7647 verifyFormat("4 > 4 ? (id)a : (id)baz;");
7648
Nico Weberc9d73612013-01-12 22:48:47 +00007649 // This tests that the formatter doesn't break after "backing" but before ":",
7650 // which would be at 80 columns.
Nico Webera7252d82013-01-12 06:18:40 +00007651 verifyFormat(
7652 "void f() {\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007653 " if ((self = [super initWithContentRect:contentRect\n"
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007654 " styleMask:styleMask ?: otherMask\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007655 " backing:NSBackingStoreBuffered\n"
7656 " defer:YES]))");
7657
Daniel Jasperc697ad22013-02-06 10:05:46 +00007658 verifyFormat(
7659 "[foo checkThatBreakingAfterColonWorksOk:\n"
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007660 " [bar ifItDoes:reduceOverallLineLengthLikeInThisCase]];");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007661
7662 verifyFormat("[myObj short:arg1 // Force line break\n"
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007663 " longKeyword:arg2 != nil ? arg2 : @\"longKeyword\"\n"
7664 " evenLongerKeyword:arg3 ?: @\"evenLongerKeyword\"\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007665 " error:arg4];");
7666 verifyFormat(
7667 "void f() {\n"
7668 " popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
7669 " initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n"
7670 " pos.width(), pos.height())\n"
7671 " styleMask:NSBorderlessWindowMask\n"
7672 " backing:NSBackingStoreBuffered\n"
7673 " defer:NO]);\n"
7674 "}");
Daniel Jasper4478e522013-11-08 17:33:24 +00007675 verifyFormat(
7676 "void f() {\n"
7677 " popup_wdow_.reset([[RenderWidgetPopupWindow alloc]\n"
7678 " iniithContentRect:NSMakRet(origin_global.x, origin_global.y,\n"
7679 " pos.width(), pos.height())\n"
7680 " syeMask:NSBorderlessWindowMask\n"
7681 " bking:NSBackingStoreBuffered\n"
7682 " der:NO]);\n"
7683 "}",
7684 getLLVMStyleWithColumns(70));
Daniel Jasper18210d72014-10-09 09:52:05 +00007685 verifyFormat(
7686 "void f() {\n"
7687 " popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
7688 " initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n"
7689 " pos.width(), pos.height())\n"
7690 " styleMask:NSBorderlessWindowMask\n"
7691 " backing:NSBackingStoreBuffered\n"
7692 " defer:NO]);\n"
7693 "}",
7694 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasperc697ad22013-02-06 10:05:46 +00007695 verifyFormat("[contentsContainer replaceSubview:[subviews objectAtIndex:0]\n"
7696 " with:contentsNativeView];");
7697
7698 verifyFormat(
7699 "[pboard addTypes:[NSArray arrayWithObject:kBookmarkButtonDragType]\n"
7700 " owner:nillllll];");
7701
Daniel Jasperc697ad22013-02-06 10:05:46 +00007702 verifyFormat(
Daniel Jasperacc33662013-02-08 08:22:00 +00007703 "[pboard setData:[NSData dataWithBytes:&button length:sizeof(button)]\n"
Daniel Jasperc697ad22013-02-06 10:05:46 +00007704 " forType:kBookmarkButtonDragType];");
7705
7706 verifyFormat("[defaultCenter addObserver:self\n"
7707 " selector:@selector(willEnterFullscreen)\n"
7708 " name:kWillEnterFullscreenNotification\n"
7709 " object:nil];");
Daniel Jasperc485b4e2013-02-06 16:00:26 +00007710 verifyFormat("[image_rep drawInRect:drawRect\n"
7711 " fromRect:NSZeroRect\n"
7712 " operation:NSCompositeCopy\n"
7713 " fraction:1.0\n"
7714 " respectFlipped:NO\n"
7715 " hints:nil];");
Daniel Jaspereb536682015-05-06 12:48:06 +00007716 verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7717 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasper9c950132015-05-07 14:19:59 +00007718 verifyFormat("[aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
7719 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jaspera7b14262015-05-13 10:23:03 +00007720 verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaa[aaaaaaaaaaaaaaaaaaaaa]\n"
7721 " aaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasper00492f92016-01-05 13:03:50 +00007722 verifyFormat("[call aaaaaaaa.aaaaaa.aaaaaaaa.aaaaaaaa.aaaaaaaa.aaaaaaaa\n"
7723 " .aaaaaaaa];", // FIXME: Indentation seems off.
Daniel Jaspered41f772015-05-19 11:06:33 +00007724 getLLVMStyleWithColumns(60));
Nico Weberac9bde22013-02-06 16:54:35 +00007725
7726 verifyFormat(
7727 "scoped_nsobject<NSTextField> message(\n"
7728 " // The frame will be fixed up when |-setMessageText:| is called.\n"
7729 " [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 0, 0)]);");
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007730 verifyFormat("[self aaaaaa:bbbbbbbbbbbbb\n"
7731 " aaaaaaaaaa:bbbbbbbbbbbbbbbbb\n"
7732 " aaaaa:bbbbbbbbbbb + bbbbbbbbbbbb\n"
7733 " aaaa:bbb];");
Daniel Jasper4478e522013-11-08 17:33:24 +00007734 verifyFormat("[self param:function( //\n"
7735 " parameter)]");
Daniel Jasperf48b5ab2013-11-07 19:23:49 +00007736 verifyFormat(
7737 "[self aaaaaaaaaa:aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |\n"
7738 " aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |\n"
7739 " aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa];");
Daniel Jaspera1ea4cb2013-10-26 17:00:22 +00007740
Daniel Jasper2746a302015-05-06 13:13:03 +00007741 // FIXME: This violates the column limit.
7742 verifyFormat(
7743 "[aaaaaaaaaaaaaaaaaaaaaaaaa\n"
7744 " aaaaaaaaaaaaaaaaa:aaaaaaaa\n"
7745 " aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];",
7746 getLLVMStyleWithColumns(60));
7747
Daniel Jaspera1ea4cb2013-10-26 17:00:22 +00007748 // Variadic parameters.
7749 verifyFormat(
7750 "NSArray *myStrings = [NSArray stringarray:@\"a\", @\"b\", nil];");
Daniel Jasperf48b5ab2013-11-07 19:23:49 +00007751 verifyFormat(
7752 "[self aaaaaaaaaaaaa:aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
7753 " aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
7754 " aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa];");
Daniel Jasperb302f9a2013-11-08 02:08:01 +00007755 verifyFormat("[self // break\n"
7756 " a:a\n"
7757 " aaa:aaa];");
Daniel Jasper3460b252013-12-18 07:08:51 +00007758 verifyFormat("bool a = ([aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaa ||\n"
7759 " [aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaaaaa);");
Nico Webera7252d82013-01-12 06:18:40 +00007760}
7761
Nico Weber12d5bab2013-01-07 15:56:25 +00007762TEST_F(FormatTest, ObjCAt) {
Nico Weber803d61d2013-01-07 16:07:07 +00007763 verifyFormat("@autoreleasepool");
Nico Webere89c42f2013-01-07 16:14:28 +00007764 verifyFormat("@catch");
7765 verifyFormat("@class");
Nico Weber803d61d2013-01-07 16:07:07 +00007766 verifyFormat("@compatibility_alias");
7767 verifyFormat("@defs");
Nico Webera8876502013-01-07 15:17:23 +00007768 verifyFormat("@dynamic");
Nico Weber803d61d2013-01-07 16:07:07 +00007769 verifyFormat("@encode");
7770 verifyFormat("@end");
7771 verifyFormat("@finally");
7772 verifyFormat("@implementation");
7773 verifyFormat("@import");
7774 verifyFormat("@interface");
7775 verifyFormat("@optional");
7776 verifyFormat("@package");
Nico Webere89c42f2013-01-07 16:14:28 +00007777 verifyFormat("@private");
Nico Weber803d61d2013-01-07 16:07:07 +00007778 verifyFormat("@property");
Nico Webere89c42f2013-01-07 16:14:28 +00007779 verifyFormat("@protected");
Nico Weber803d61d2013-01-07 16:07:07 +00007780 verifyFormat("@protocol");
Nico Webere89c42f2013-01-07 16:14:28 +00007781 verifyFormat("@public");
Nico Weber803d61d2013-01-07 16:07:07 +00007782 verifyFormat("@required");
7783 verifyFormat("@selector");
7784 verifyFormat("@synchronized");
7785 verifyFormat("@synthesize");
Nico Webere89c42f2013-01-07 16:14:28 +00007786 verifyFormat("@throw");
7787 verifyFormat("@try");
Nico Weber803d61d2013-01-07 16:07:07 +00007788
Nico Weber12d5bab2013-01-07 15:56:25 +00007789 EXPECT_EQ("@interface", format("@ interface"));
7790
7791 // The precise formatting of this doesn't matter, nobody writes code like
7792 // this.
7793 verifyFormat("@ /*foo*/ interface");
Nico Webera8876502013-01-07 15:17:23 +00007794}
7795
Nico Weberd8cdb532013-01-08 19:15:23 +00007796TEST_F(FormatTest, ObjCSnippets) {
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007797 verifyFormat("@autoreleasepool {\n"
7798 " foo();\n"
7799 "}");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007800 verifyFormat("@class Foo, Bar;");
Nico Weberd8cdb532013-01-08 19:15:23 +00007801 verifyFormat("@compatibility_alias AliasName ExistingClass;");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007802 verifyFormat("@dynamic textColor;");
Nico Webere3025672013-01-18 05:11:47 +00007803 verifyFormat("char *buf1 = @encode(int *);");
7804 verifyFormat("char *buf1 = @encode(typeof(4 * 5));");
Nico Weber44449172013-02-12 16:17:07 +00007805 verifyFormat("char *buf1 = @encode(int **);");
Nico Weber4cc98742013-01-08 20:16:23 +00007806 verifyFormat("Protocol *proto = @protocol(p1);");
Nico Weber250fe712013-01-18 02:43:57 +00007807 verifyFormat("SEL s = @selector(foo:);");
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007808 verifyFormat("@synchronized(self) {\n"
7809 " f();\n"
7810 "}");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007811
Nico Webera2a84952013-01-10 21:30:42 +00007812 verifyFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
7813 verifyGoogleFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
7814
Nico Weber7e6a7a12013-01-08 17:56:31 +00007815 verifyFormat("@property(assign, nonatomic) CGFloat hoverAlpha;");
Nico Webera2a84952013-01-10 21:30:42 +00007816 verifyFormat("@property(assign, getter=isEditable) BOOL editable;");
7817 verifyGoogleFormat("@property(assign, getter=isEditable) BOOL editable;");
Daniel Jaspere9beea22014-01-28 15:20:33 +00007818 verifyFormat("@property (assign, getter=isEditable) BOOL editable;",
7819 getMozillaStyle());
7820 verifyFormat("@property BOOL editable;", getMozillaStyle());
7821 verifyFormat("@property (assign, getter=isEditable) BOOL editable;",
7822 getWebKitStyle());
7823 verifyFormat("@property BOOL editable;", getWebKitStyle());
Nico Webere8d78242013-06-25 00:25:40 +00007824
7825 verifyFormat("@import foo.bar;\n"
7826 "@import baz;");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007827}
7828
Daniel Jasper9cb1ac282015-10-07 15:09:08 +00007829TEST_F(FormatTest, ObjCForIn) {
7830 verifyFormat("- (void)test {\n"
7831 " for (NSString *n in arrayOfStrings) {\n"
7832 " foo(n);\n"
7833 " }\n"
7834 "}");
7835 verifyFormat("- (void)test {\n"
7836 " for (NSString *n in (__bridge NSArray *)arrayOfStrings) {\n"
7837 " foo(n);\n"
7838 " }\n"
7839 "}");
7840}
7841
Nico Weber0588b502013-02-07 00:19:29 +00007842TEST_F(FormatTest, ObjCLiterals) {
7843 verifyFormat("@\"String\"");
7844 verifyFormat("@1");
7845 verifyFormat("@+4.8");
7846 verifyFormat("@-4");
7847 verifyFormat("@1LL");
7848 verifyFormat("@.5");
7849 verifyFormat("@'c'");
7850 verifyFormat("@true");
7851
7852 verifyFormat("NSNumber *smallestInt = @(-INT_MAX - 1);");
7853 verifyFormat("NSNumber *piOverTwo = @(M_PI / 2);");
7854 verifyFormat("NSNumber *favoriteColor = @(Green);");
7855 verifyFormat("NSString *path = @(getenv(\"PATH\"));");
Daniel Jasperb1c19f82014-01-10 07:44:53 +00007856
7857 verifyFormat("[dictionary setObject:@(1) forKey:@\"number\"];");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007858}
Nico Weber0588b502013-02-07 00:19:29 +00007859
Daniel Jasperb596fb22013-10-24 10:31:50 +00007860TEST_F(FormatTest, ObjCDictLiterals) {
Nico Weber0588b502013-02-07 00:19:29 +00007861 verifyFormat("@{");
Nico Weber372d8dc2013-02-10 20:35:35 +00007862 verifyFormat("@{}");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007863 verifyFormat("@{@\"one\" : @1}");
7864 verifyFormat("return @{@\"one\" : @1;");
Daniel Jaspera125d532014-03-21 12:38:57 +00007865 verifyFormat("@{@\"one\" : @1}");
Manuel Klimek1a18c402013-04-12 14:13:36 +00007866
Chandler Carruthf8b72662014-03-02 12:37:31 +00007867 verifyFormat("@{@\"one\" : @{@2 : @1}}");
Daniel Jaspera125d532014-03-21 12:38:57 +00007868 verifyFormat("@{\n"
7869 " @\"one\" : @{@2 : @1},\n"
7870 "}");
Manuel Klimek1a18c402013-04-12 14:13:36 +00007871
Chandler Carruthf8b72662014-03-02 12:37:31 +00007872 verifyFormat("@{1 > 2 ? @\"one\" : @\"two\" : 1 > 2 ? @1 : @2}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007873 verifyIncompleteFormat("[self setDict:@{}");
7874 verifyIncompleteFormat("[self setDict:@{@1 : @2}");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007875 verifyFormat("NSLog(@\"%@\", @{@1 : @2, @2 : @3}[@1]);");
Nico Weber372d8dc2013-02-10 20:35:35 +00007876 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007877 "NSDictionary *masses = @{@\"H\" : @1.0078, @\"He\" : @4.0026};");
Nico Weber33c68e92013-02-10 20:39:05 +00007878 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007879 "NSDictionary *settings = @{AVEncoderKey : @(AVAudioQualityMax)};");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007880
Daniel Jaspera44991332015-04-29 13:06:49 +00007881 verifyFormat("NSDictionary *d = @{\n"
7882 " @\"nam\" : NSUserNam(),\n"
7883 " @\"dte\" : [NSDate date],\n"
7884 " @\"processInfo\" : [NSProcessInfo processInfo]\n"
7885 "};");
Nico Weberced7d412013-05-26 05:39:26 +00007886 verifyFormat(
Daniel Jasperd489dd32013-10-20 16:45:46 +00007887 "@{\n"
7888 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee : "
7889 "regularFont,\n"
7890 "};");
Daniel Jasperb8f61682013-10-22 15:45:58 +00007891 verifyGoogleFormat(
7892 "@{\n"
7893 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee : "
7894 "regularFont,\n"
7895 "};");
Daniel Jasper1fd6f1f2014-03-17 14:32:47 +00007896 verifyFormat(
7897 "@{\n"
7898 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee :\n"
7899 " reeeeeeeeeeeeeeeeeeeeeeeegularFont,\n"
7900 "};");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007901
7902 // We should try to be robust in case someone forgets the "@".
Daniel Jaspera44991332015-04-29 13:06:49 +00007903 verifyFormat("NSDictionary *d = {\n"
7904 " @\"nam\" : NSUserNam(),\n"
7905 " @\"dte\" : [NSDate date],\n"
7906 " @\"processInfo\" : [NSProcessInfo processInfo]\n"
7907 "};");
Daniel Jasper335ff262014-05-28 09:11:53 +00007908 verifyFormat("NSMutableDictionary *dictionary =\n"
7909 " [NSMutableDictionary dictionaryWithDictionary:@{\n"
7910 " aaaaaaaaaaaaaaaaaaaaa : aaaaaaaaaaaaa,\n"
7911 " bbbbbbbbbbbbbbbbbb : bbbbb,\n"
7912 " cccccccccccccccc : ccccccccccccccc\n"
7913 " }];");
Daniel Jasper4d724492015-10-12 03:19:07 +00007914
7915 // Ensure that casts before the key are kept on the same line as the key.
7916 verifyFormat(
7917 "NSDictionary *d = @{\n"
7918 " (aaaaaaaa id)aaaaaaaaa : (aaaaaaaa id)aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7919 " (aaaaaaaa id)aaaaaaaaaaaaaa : (aaaaaaaa id)aaaaaaaaaaaaaa,\n"
7920 "};");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007921}
7922
7923TEST_F(FormatTest, ObjCArrayLiterals) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007924 verifyIncompleteFormat("@[");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007925 verifyFormat("@[]");
7926 verifyFormat(
7927 "NSArray *array = @[ @\" Hey \", NSApp, [NSNumber numberWithInt:42] ];");
7928 verifyFormat("return @[ @3, @[], @[ @4, @5 ] ];");
7929 verifyFormat("NSArray *array = @[ [foo description] ];");
7930
7931 verifyFormat(
7932 "NSArray *some_variable = @[\n"
7933 " aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" : @\"aaaaaaaaaaaaaa\",\n"
7934 " @\"aaaaaaaaaaaaaaaaa\",\n"
7935 " @\"aaaaaaaaaaaaaaaaa\",\n"
Daniel Jasper50780ce2016-01-13 16:41:34 +00007936 " @\"aaaaaaaaaaaaaaaaa\",\n"
7937 "];");
7938 verifyFormat(
7939 "NSArray *some_variable = @[\n"
7940 " aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" : @\"aaaaaaaaaaaaaa\",\n"
7941 " @\"aaaaaaaaaaaaaaaa\", @\"aaaaaaaaaaaaaaaa\", @\"aaaaaaaaaaaaaaaa\"\n"
Daniel Jasperb8f61682013-10-22 15:45:58 +00007942 "];");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007943 verifyFormat("NSArray *some_variable = @[\n"
7944 " @\"aaaaaaaaaaaaaaaaa\",\n"
7945 " @\"aaaaaaaaaaaaaaaaa\",\n"
7946 " @\"aaaaaaaaaaaaaaaaa\",\n"
7947 " @\"aaaaaaaaaaaaaaaaa\",\n"
7948 "];");
Daniel Jasper308062b2015-02-27 08:41:05 +00007949 verifyFormat("NSArray *array = @[\n"
7950 " @\"a\",\n"
7951 " @\"a\",\n" // Trailing comma -> one per line.
7952 "];");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007953
7954 // We should try to be robust in case someone forgets the "@".
7955 verifyFormat("NSArray *some_variable = [\n"
7956 " @\"aaaaaaaaaaaaaaaaa\",\n"
7957 " @\"aaaaaaaaaaaaaaaaa\",\n"
7958 " @\"aaaaaaaaaaaaaaaaa\",\n"
7959 " @\"aaaaaaaaaaaaaaaaa\",\n"
7960 "];");
Daniel Jasper4bf0d802013-11-23 14:27:27 +00007961 verifyFormat(
7962 "- (NSAttributedString *)attributedStringForSegment:(NSUInteger)segment\n"
7963 " index:(NSUInteger)index\n"
7964 " nonDigitAttributes:\n"
7965 " (NSDictionary *)noDigitAttributes;");
Daniel Jasperf841d3a2015-05-28 07:21:50 +00007966 verifyFormat("[someFunction someLooooooooooooongParameter:@[\n"
7967 " NSBundle.mainBundle.infoDictionary[@\"a\"]\n"
7968 "]];");
Nico Weber0588b502013-02-07 00:19:29 +00007969}
7970
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007971TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007972 EXPECT_EQ("\"some text \"\n"
7973 "\"other\";",
7974 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007975 EXPECT_EQ("\"some text \"\n"
7976 "\"other\";",
7977 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007978 EXPECT_EQ(
7979 "#define A \\\n"
7980 " \"some \" \\\n"
7981 " \"text \" \\\n"
7982 " \"other\";",
7983 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7984 EXPECT_EQ(
7985 "#define A \\\n"
7986 " \"so \" \\\n"
7987 " \"text \" \\\n"
7988 " \"other\";",
7989 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7990
7991 EXPECT_EQ("\"some text\"",
7992 format("\"some text\"", getLLVMStyleWithColumns(1)));
7993 EXPECT_EQ("\"some text\"",
7994 format("\"some text\"", getLLVMStyleWithColumns(11)));
7995 EXPECT_EQ("\"some \"\n"
7996 "\"text\"",
7997 format("\"some text\"", getLLVMStyleWithColumns(10)));
7998 EXPECT_EQ("\"some \"\n"
7999 "\"text\"",
8000 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00008001 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008002 "\" tex\"\n"
8003 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008004 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00008005 EXPECT_EQ("\"some\"\n"
8006 "\" tex\"\n"
8007 "\" and\"",
8008 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
8009 EXPECT_EQ("\"some\"\n"
8010 "\"/tex\"\n"
8011 "\"/and\"",
8012 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008013
8014 EXPECT_EQ("variable =\n"
8015 " \"long string \"\n"
8016 " \"literal\";",
8017 format("variable = \"long string literal\";",
8018 getLLVMStyleWithColumns(20)));
8019
8020 EXPECT_EQ("variable = f(\n"
8021 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00008022 " \"literal\",\n"
8023 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00008024 " loooooooooooooooooooong);",
8025 format("variable = f(\"long string literal\", short, "
8026 "loooooooooooooooooooong);",
8027 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008028
Daniel Jaspera44991332015-04-29 13:06:49 +00008029 EXPECT_EQ(
8030 "f(g(\"long string \"\n"
8031 " \"literal\"),\n"
8032 " b);",
8033 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008034 EXPECT_EQ("f(g(\"long string \"\n"
8035 " \"literal\",\n"
8036 " a),\n"
8037 " b);",
8038 format("f(g(\"long string literal\", a), b);",
8039 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008040 EXPECT_EQ(
8041 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00008042 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008043 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8044 EXPECT_EQ("f(\"one two three four five six \"\n"
8045 " \"seven\".split(\n"
8046 " really_looooong_variable));",
8047 format("f(\"one two three four five six seven\"."
8048 "split(really_looooong_variable));",
8049 getLLVMStyleWithColumns(33)));
8050
8051 EXPECT_EQ("f(\"some \"\n"
8052 " \"text\",\n"
8053 " other);",
8054 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008055
8056 // Only break as a last resort.
8057 verifyFormat(
8058 "aaaaaaaaaaaaaaaaaaaa(\n"
8059 " aaaaaaaaaaaaaaaaaaaa,\n"
8060 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008061
Daniel Jaspera44991332015-04-29 13:06:49 +00008062 EXPECT_EQ("\"splitmea\"\n"
8063 "\"trandomp\"\n"
8064 "\"oint\"",
8065 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008066
Daniel Jaspera44991332015-04-29 13:06:49 +00008067 EXPECT_EQ("\"split/\"\n"
8068 "\"pathat/\"\n"
8069 "\"slashes\"",
8070 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008071
Daniel Jaspera44991332015-04-29 13:06:49 +00008072 EXPECT_EQ("\"split/\"\n"
8073 "\"pathat/\"\n"
8074 "\"slashes\"",
8075 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008076 EXPECT_EQ("\"split at \"\n"
8077 "\"spaces/at/\"\n"
8078 "\"slashes.at.any$\"\n"
8079 "\"non-alphanumeric%\"\n"
8080 "\"1111111111characte\"\n"
8081 "\"rs\"",
8082 format("\"split at "
8083 "spaces/at/"
8084 "slashes.at."
8085 "any$non-"
8086 "alphanumeric%"
8087 "1111111111characte"
8088 "rs\"",
8089 getLLVMStyleWithColumns(20)));
8090
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008091 // Verify that splitting the strings understands
8092 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008093 EXPECT_EQ(
8094 "aaaaaaaaaaaa(\n"
8095 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8096 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8097 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8098 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8099 "aaaaaaaaaaaaaaaaaaaaaa\");",
8100 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008101 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8102 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8103 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8104 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8105 "aaaaaaaaaaaaaaaaaaaaaa\";",
8106 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008107 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8108 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8109 format("llvm::outs() << "
8110 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8111 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008112 EXPECT_EQ("ffff(\n"
8113 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8114 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8115 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8116 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8117 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008118
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008119 FormatStyle Style = getLLVMStyleWithColumns(12);
8120 Style.BreakStringLiterals = false;
8121 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8122
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008123 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8124 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00008125 EXPECT_EQ("#define A \\\n"
8126 " \"some \" \\\n"
8127 " \"text \" \\\n"
8128 " \"other\";",
8129 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008130}
8131
Manuel Klimek9e321992015-07-28 15:50:24 +00008132TEST_F(FormatTest, FullyRemoveEmptyLines) {
8133 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8134 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8135 EXPECT_EQ("int i = a(b());",
8136 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8137}
8138
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008139TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8140 EXPECT_EQ(
8141 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8142 "(\n"
8143 " \"x\t\");",
8144 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8145 "aaaaaaa("
8146 "\"x\t\");"));
8147}
8148
Daniel Jasper174b0122014-01-09 14:18:12 +00008149TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008150 EXPECT_EQ(
8151 "u8\"utf8 string \"\n"
8152 "u8\"literal\";",
8153 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8154 EXPECT_EQ(
8155 "u\"utf16 string \"\n"
8156 "u\"literal\";",
8157 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8158 EXPECT_EQ(
8159 "U\"utf32 string \"\n"
8160 "U\"literal\";",
8161 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8162 EXPECT_EQ("L\"wide string \"\n"
8163 "L\"literal\";",
8164 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008165 EXPECT_EQ("@\"NSString \"\n"
8166 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008167 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008168
8169 // This input makes clang-format try to split the incomplete unicode escape
8170 // sequence, which used to lead to a crasher.
8171 verifyNoCrash(
8172 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8173 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008174}
8175
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008176TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8177 FormatStyle Style = getGoogleStyleWithColumns(15);
8178 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8179 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8180 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8181 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8182 EXPECT_EQ("u8R\"x(raw literal)x\";",
8183 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008184}
8185
8186TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8187 FormatStyle Style = getLLVMStyleWithColumns(20);
8188 EXPECT_EQ(
8189 "_T(\"aaaaaaaaaaaaaa\")\n"
8190 "_T(\"aaaaaaaaaaaaaa\")\n"
8191 "_T(\"aaaaaaaaaaaa\")",
8192 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8193 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
8194 " _T(\"aaaaaa\"),\n"
8195 " z);",
8196 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8197
8198 // FIXME: Handle embedded spaces in one iteration.
8199 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8200 // "_T(\"aaaaaaaaaaaaa\")\n"
8201 // "_T(\"aaaaaaaaaaaaa\")\n"
8202 // "_T(\"a\")",
8203 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8204 // getLLVMStyleWithColumns(20)));
8205 EXPECT_EQ(
8206 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8207 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008208 EXPECT_EQ("f(\n"
8209 "#if !TEST\n"
8210 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8211 "#endif\n"
8212 " );",
8213 format("f(\n"
8214 "#if !TEST\n"
8215 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8216 "#endif\n"
8217 ");"));
8218 EXPECT_EQ("f(\n"
8219 "\n"
8220 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8221 format("f(\n"
8222 "\n"
8223 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008224}
8225
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008226TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008227 EXPECT_EQ(
8228 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8229 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8230 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8231 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8232 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8233 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8234}
8235
8236TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8237 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008238 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008239 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8240 "multiline raw string literal xxxxxxxxxxxxxx\n"
8241 ")x\",\n"
8242 " a),\n"
8243 " b);",
8244 format("fffffffffff(g(R\"x(\n"
8245 "multiline raw string literal xxxxxxxxxxxxxx\n"
8246 ")x\", a), b);",
8247 getGoogleStyleWithColumns(20)));
8248 EXPECT_EQ("fffffffffff(\n"
8249 " g(R\"x(qqq\n"
8250 "multiline raw string literal xxxxxxxxxxxxxx\n"
8251 ")x\",\n"
8252 " a),\n"
8253 " b);",
8254 format("fffffffffff(g(R\"x(qqq\n"
8255 "multiline raw string literal xxxxxxxxxxxxxx\n"
8256 ")x\", a), b);",
8257 getGoogleStyleWithColumns(20)));
8258
8259 EXPECT_EQ("fffffffffff(R\"x(\n"
8260 "multiline raw string literal xxxxxxxxxxxxxx\n"
8261 ")x\");",
8262 format("fffffffffff(R\"x(\n"
8263 "multiline raw string literal xxxxxxxxxxxxxx\n"
8264 ")x\");",
8265 getGoogleStyleWithColumns(20)));
8266 EXPECT_EQ("fffffffffff(R\"x(\n"
8267 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008268 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008269 format("fffffffffff(R\"x(\n"
8270 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008271 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008272 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008273 EXPECT_EQ("fffffffffff(\n"
8274 " R\"x(\n"
8275 "multiline raw string literal xxxxxxxxxxxxxx\n"
8276 ")x\" +\n"
8277 " bbbbbb);",
8278 format("fffffffffff(\n"
8279 " R\"x(\n"
8280 "multiline raw string literal xxxxxxxxxxxxxx\n"
8281 ")x\" + bbbbbb);",
8282 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008283}
8284
Alexander Kornienkobe633902013-06-14 11:46:10 +00008285TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008286 verifyFormat("string a = \"unterminated;");
8287 EXPECT_EQ("function(\"unterminated,\n"
8288 " OtherParameter);",
8289 format("function( \"unterminated,\n"
8290 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008291}
8292
8293TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008294 FormatStyle Style = getLLVMStyle();
8295 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008296 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008297 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008298}
8299
Daniel Jaspera44991332015-04-29 13:06:49 +00008300TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008301
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008302TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8303 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8304 " \"ddeeefff\");",
8305 format("someFunction(\"aaabbbcccdddeeefff\");",
8306 getLLVMStyleWithColumns(25)));
8307 EXPECT_EQ("someFunction1234567890(\n"
8308 " \"aaabbbcccdddeeefff\");",
8309 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8310 getLLVMStyleWithColumns(26)));
8311 EXPECT_EQ("someFunction1234567890(\n"
8312 " \"aaabbbcccdddeeeff\"\n"
8313 " \"f\");",
8314 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8315 getLLVMStyleWithColumns(25)));
8316 EXPECT_EQ("someFunction1234567890(\n"
8317 " \"aaabbbcccdddeeeff\"\n"
8318 " \"f\");",
8319 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8320 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008321 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8322 " \"ddde \"\n"
8323 " \"efff\");",
8324 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008325 getLLVMStyleWithColumns(25)));
8326 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8327 " \"ddeeefff\");",
8328 format("someFunction(\"aaabbbccc ddeeefff\");",
8329 getLLVMStyleWithColumns(25)));
8330 EXPECT_EQ("someFunction1234567890(\n"
8331 " \"aaabb \"\n"
8332 " \"cccdddeeefff\");",
8333 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8334 getLLVMStyleWithColumns(25)));
8335 EXPECT_EQ("#define A \\\n"
8336 " string s = \\\n"
8337 " \"123456789\" \\\n"
8338 " \"0\"; \\\n"
8339 " int i;",
8340 format("#define A string s = \"1234567890\"; int i;",
8341 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008342 // FIXME: Put additional penalties on breaking at non-whitespace locations.
8343 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8344 " \"dddeeeff\"\n"
8345 " \"f\");",
8346 format("someFunction(\"aaabbbcc dddeeefff\");",
8347 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008348}
8349
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008350TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008351 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8352 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008353 EXPECT_EQ("\"test\"\n"
8354 "\"\\n\"",
8355 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8356 EXPECT_EQ("\"tes\\\\\"\n"
8357 "\"n\"",
8358 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8359 EXPECT_EQ("\"\\\\\\\\\"\n"
8360 "\"\\n\"",
8361 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008362 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008363 EXPECT_EQ("\"\\uff01\"\n"
8364 "\"test\"",
8365 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8366 EXPECT_EQ("\"\\Uff01ff02\"",
8367 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8368 EXPECT_EQ("\"\\x000000000001\"\n"
8369 "\"next\"",
8370 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8371 EXPECT_EQ("\"\\x000000000001next\"",
8372 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8373 EXPECT_EQ("\"\\x000000000001\"",
8374 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8375 EXPECT_EQ("\"test\"\n"
8376 "\"\\000000\"\n"
8377 "\"000001\"",
8378 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8379 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008380 "\"00000000\"\n"
8381 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008382 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008383}
8384
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008385TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8386 verifyFormat("void f() {\n"
8387 " return g() {}\n"
8388 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008389 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008390 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008391 "}");
8392}
8393
Manuel Klimek421147e2014-01-24 09:25:23 +00008394TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8395 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008396 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008397}
8398
Manuel Klimek13b97d82013-05-13 08:42:42 +00008399TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8400 verifyFormat("class X {\n"
8401 " void f() {\n"
8402 " }\n"
8403 "};",
8404 getLLVMStyleWithColumns(12));
8405}
8406
8407TEST_F(FormatTest, ConfigurableIndentWidth) {
8408 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8409 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008410 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008411 verifyFormat("void f() {\n"
8412 " someFunction();\n"
8413 " if (true) {\n"
8414 " f();\n"
8415 " }\n"
8416 "}",
8417 EightIndent);
8418 verifyFormat("class X {\n"
8419 " void f() {\n"
8420 " }\n"
8421 "};",
8422 EightIndent);
8423 verifyFormat("int x[] = {\n"
8424 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008425 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008426 EightIndent);
8427}
8428
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008429TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008430 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008431 "f();",
8432 getLLVMStyleWithColumns(8));
8433}
8434
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008435TEST_F(FormatTest, ConfigurableUseOfTab) {
8436 FormatStyle Tab = getLLVMStyleWithColumns(42);
8437 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008438 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008439 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008440
8441 EXPECT_EQ("if (aaaaaaaa && // q\n"
8442 " bb)\t\t// w\n"
8443 "\t;",
8444 format("if (aaaaaaaa &&// q\n"
8445 "bb)// w\n"
8446 ";",
8447 Tab));
8448 EXPECT_EQ("if (aaa && bbb) // w\n"
8449 "\t;",
8450 format("if(aaa&&bbb)// w\n"
8451 ";",
8452 Tab));
8453
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008454 verifyFormat("class X {\n"
8455 "\tvoid f() {\n"
8456 "\t\tsomeFunction(parameter1,\n"
8457 "\t\t\t parameter2);\n"
8458 "\t}\n"
8459 "};",
8460 Tab);
8461 verifyFormat("#define A \\\n"
8462 "\tvoid f() { \\\n"
8463 "\t\tsomeFunction( \\\n"
8464 "\t\t parameter1, \\\n"
8465 "\t\t parameter2); \\\n"
8466 "\t}",
8467 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008468
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008469 Tab.TabWidth = 4;
8470 Tab.IndentWidth = 8;
8471 verifyFormat("class TabWidth4Indent8 {\n"
8472 "\t\tvoid f() {\n"
8473 "\t\t\t\tsomeFunction(parameter1,\n"
8474 "\t\t\t\t\t\t\t parameter2);\n"
8475 "\t\t}\n"
8476 "};",
8477 Tab);
8478
8479 Tab.TabWidth = 4;
8480 Tab.IndentWidth = 4;
8481 verifyFormat("class TabWidth4Indent4 {\n"
8482 "\tvoid f() {\n"
8483 "\t\tsomeFunction(parameter1,\n"
8484 "\t\t\t\t\t parameter2);\n"
8485 "\t}\n"
8486 "};",
8487 Tab);
8488
8489 Tab.TabWidth = 8;
8490 Tab.IndentWidth = 4;
8491 verifyFormat("class TabWidth8Indent4 {\n"
8492 " void f() {\n"
8493 "\tsomeFunction(parameter1,\n"
8494 "\t\t parameter2);\n"
8495 " }\n"
8496 "};",
8497 Tab);
8498
Alexander Kornienko39856b72013-09-10 09:38:25 +00008499 Tab.TabWidth = 8;
8500 Tab.IndentWidth = 8;
8501 EXPECT_EQ("/*\n"
8502 "\t a\t\tcomment\n"
8503 "\t in multiple lines\n"
8504 " */",
8505 format(" /*\t \t \n"
8506 " \t \t a\t\tcomment\t \t\n"
8507 " \t \t in multiple lines\t\n"
8508 " \t */",
8509 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008510
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008511 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008512 verifyFormat("{\n"
8513 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8514 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8515 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8516 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8517 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8518 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008519 "};",
8520 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008521 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008522 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008523 "\ta2,\n"
8524 "\ta3\n"
8525 "};",
8526 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008527 EXPECT_EQ("if (aaaaaaaa && // q\n"
8528 " bb) // w\n"
8529 "\t;",
8530 format("if (aaaaaaaa &&// q\n"
8531 "bb)// w\n"
8532 ";",
8533 Tab));
8534 verifyFormat("class X {\n"
8535 "\tvoid f() {\n"
8536 "\t\tsomeFunction(parameter1,\n"
8537 "\t\t parameter2);\n"
8538 "\t}\n"
8539 "};",
8540 Tab);
8541 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008542 "\tQ(\n"
8543 "\t {\n"
8544 "\t\t int a;\n"
8545 "\t\t someFunction(aaaaaaaa,\n"
8546 "\t\t bbbbbbb);\n"
8547 "\t },\n"
8548 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008549 "}",
8550 Tab);
8551 EXPECT_EQ("{\n"
8552 "\t/* aaaa\n"
8553 "\t bbbb */\n"
8554 "}",
8555 format("{\n"
8556 "/* aaaa\n"
8557 " bbbb */\n"
8558 "}",
8559 Tab));
8560 EXPECT_EQ("{\n"
8561 "\t/*\n"
8562 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8563 "\t bbbbbbbbbbbbb\n"
8564 "\t*/\n"
8565 "}",
8566 format("{\n"
8567 "/*\n"
8568 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8569 "*/\n"
8570 "}",
8571 Tab));
8572 EXPECT_EQ("{\n"
8573 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8574 "\t// bbbbbbbbbbbbb\n"
8575 "}",
8576 format("{\n"
8577 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8578 "}",
8579 Tab));
8580 EXPECT_EQ("{\n"
8581 "\t/*\n"
8582 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8583 "\t bbbbbbbbbbbbb\n"
8584 "\t*/\n"
8585 "}",
8586 format("{\n"
8587 "\t/*\n"
8588 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8589 "\t*/\n"
8590 "}",
8591 Tab));
8592 EXPECT_EQ("{\n"
8593 "\t/*\n"
8594 "\n"
8595 "\t*/\n"
8596 "}",
8597 format("{\n"
8598 "\t/*\n"
8599 "\n"
8600 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008601 "}",
8602 Tab));
8603 EXPECT_EQ("{\n"
8604 "\t/*\n"
8605 " asdf\n"
8606 "\t*/\n"
8607 "}",
8608 format("{\n"
8609 "\t/*\n"
8610 " asdf\n"
8611 "\t*/\n"
8612 "}",
8613 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008614
8615 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008616 EXPECT_EQ("/*\n"
8617 " a\t\tcomment\n"
8618 " in multiple lines\n"
8619 " */",
8620 format(" /*\t \t \n"
8621 " \t \t a\t\tcomment\t \t\n"
8622 " \t \t in multiple lines\t\n"
8623 " \t */",
8624 Tab));
8625 EXPECT_EQ("/* some\n"
8626 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008627 format(" \t \t /* some\n"
8628 " \t \t comment */",
8629 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008630 EXPECT_EQ("int a; /* some\n"
8631 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008632 format(" \t \t int a; /* some\n"
8633 " \t \t comment */",
8634 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008635
Alexander Kornienko39856b72013-09-10 09:38:25 +00008636 EXPECT_EQ("int a; /* some\n"
8637 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008638 format(" \t \t int\ta; /* some\n"
8639 " \t \t comment */",
8640 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008641 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8642 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008643 format(" \t \t f(\"\t\t\"); /* some\n"
8644 " \t \t comment */",
8645 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008646 EXPECT_EQ("{\n"
8647 " /*\n"
8648 " * Comment\n"
8649 " */\n"
8650 " int i;\n"
8651 "}",
8652 format("{\n"
8653 "\t/*\n"
8654 "\t * Comment\n"
8655 "\t */\n"
8656 "\t int i;\n"
8657 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008658
8659 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8660 Tab.TabWidth = 8;
8661 Tab.IndentWidth = 8;
8662 EXPECT_EQ("if (aaaaaaaa && // q\n"
8663 " bb) // w\n"
8664 "\t;",
8665 format("if (aaaaaaaa &&// q\n"
8666 "bb)// w\n"
8667 ";",
8668 Tab));
8669 EXPECT_EQ("if (aaa && bbb) // w\n"
8670 "\t;",
8671 format("if(aaa&&bbb)// w\n"
8672 ";",
8673 Tab));
8674 verifyFormat("class X {\n"
8675 "\tvoid f() {\n"
8676 "\t\tsomeFunction(parameter1,\n"
8677 "\t\t\t parameter2);\n"
8678 "\t}\n"
8679 "};",
8680 Tab);
8681 verifyFormat("#define A \\\n"
8682 "\tvoid f() { \\\n"
8683 "\t\tsomeFunction( \\\n"
8684 "\t\t parameter1, \\\n"
8685 "\t\t parameter2); \\\n"
8686 "\t}",
8687 Tab);
8688 Tab.TabWidth = 4;
8689 Tab.IndentWidth = 8;
8690 verifyFormat("class TabWidth4Indent8 {\n"
8691 "\t\tvoid f() {\n"
8692 "\t\t\t\tsomeFunction(parameter1,\n"
8693 "\t\t\t\t\t\t\t parameter2);\n"
8694 "\t\t}\n"
8695 "};",
8696 Tab);
8697 Tab.TabWidth = 4;
8698 Tab.IndentWidth = 4;
8699 verifyFormat("class TabWidth4Indent4 {\n"
8700 "\tvoid f() {\n"
8701 "\t\tsomeFunction(parameter1,\n"
8702 "\t\t\t\t\t parameter2);\n"
8703 "\t}\n"
8704 "};",
8705 Tab);
8706 Tab.TabWidth = 8;
8707 Tab.IndentWidth = 4;
8708 verifyFormat("class TabWidth8Indent4 {\n"
8709 " void f() {\n"
8710 "\tsomeFunction(parameter1,\n"
8711 "\t\t parameter2);\n"
8712 " }\n"
8713 "};",
8714 Tab);
8715 Tab.TabWidth = 8;
8716 Tab.IndentWidth = 8;
8717 EXPECT_EQ("/*\n"
8718 "\t a\t\tcomment\n"
8719 "\t in multiple lines\n"
8720 " */",
8721 format(" /*\t \t \n"
8722 " \t \t a\t\tcomment\t \t\n"
8723 " \t \t in multiple lines\t\n"
8724 " \t */",
8725 Tab));
8726 verifyFormat("{\n"
8727 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8728 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8729 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8730 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8731 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8732 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8733 "};",
8734 Tab);
8735 verifyFormat("enum AA {\n"
8736 "\ta1, // Force multiple lines\n"
8737 "\ta2,\n"
8738 "\ta3\n"
8739 "};",
8740 Tab);
8741 EXPECT_EQ("if (aaaaaaaa && // q\n"
8742 " bb) // w\n"
8743 "\t;",
8744 format("if (aaaaaaaa &&// q\n"
8745 "bb)// w\n"
8746 ";",
8747 Tab));
8748 verifyFormat("class X {\n"
8749 "\tvoid f() {\n"
8750 "\t\tsomeFunction(parameter1,\n"
8751 "\t\t\t parameter2);\n"
8752 "\t}\n"
8753 "};",
8754 Tab);
8755 verifyFormat("{\n"
8756 "\tQ(\n"
8757 "\t {\n"
8758 "\t\t int a;\n"
8759 "\t\t someFunction(aaaaaaaa,\n"
8760 "\t\t\t\t bbbbbbb);\n"
8761 "\t },\n"
8762 "\t p);\n"
8763 "}",
8764 Tab);
8765 EXPECT_EQ("{\n"
8766 "\t/* aaaa\n"
8767 "\t bbbb */\n"
8768 "}",
8769 format("{\n"
8770 "/* aaaa\n"
8771 " bbbb */\n"
8772 "}",
8773 Tab));
8774 EXPECT_EQ("{\n"
8775 "\t/*\n"
8776 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8777 "\t bbbbbbbbbbbbb\n"
8778 "\t*/\n"
8779 "}",
8780 format("{\n"
8781 "/*\n"
8782 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8783 "*/\n"
8784 "}",
8785 Tab));
8786 EXPECT_EQ("{\n"
8787 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8788 "\t// bbbbbbbbbbbbb\n"
8789 "}",
8790 format("{\n"
8791 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8792 "}",
8793 Tab));
8794 EXPECT_EQ("{\n"
8795 "\t/*\n"
8796 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8797 "\t bbbbbbbbbbbbb\n"
8798 "\t*/\n"
8799 "}",
8800 format("{\n"
8801 "\t/*\n"
8802 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8803 "\t*/\n"
8804 "}",
8805 Tab));
8806 EXPECT_EQ("{\n"
8807 "\t/*\n"
8808 "\n"
8809 "\t*/\n"
8810 "}",
8811 format("{\n"
8812 "\t/*\n"
8813 "\n"
8814 "\t*/\n"
8815 "}",
8816 Tab));
8817 EXPECT_EQ("{\n"
8818 "\t/*\n"
8819 " asdf\n"
8820 "\t*/\n"
8821 "}",
8822 format("{\n"
8823 "\t/*\n"
8824 " asdf\n"
8825 "\t*/\n"
8826 "}",
8827 Tab));
8828 EXPECT_EQ("/*\n"
8829 "\t a\t\tcomment\n"
8830 "\t in multiple lines\n"
8831 " */",
8832 format(" /*\t \t \n"
8833 " \t \t a\t\tcomment\t \t\n"
8834 " \t \t in multiple lines\t\n"
8835 " \t */",
8836 Tab));
8837 EXPECT_EQ("/* some\n"
8838 " comment */",
8839 format(" \t \t /* some\n"
8840 " \t \t comment */",
8841 Tab));
8842 EXPECT_EQ("int a; /* some\n"
8843 " comment */",
8844 format(" \t \t int a; /* some\n"
8845 " \t \t comment */",
8846 Tab));
8847 EXPECT_EQ("int a; /* some\n"
8848 "comment */",
8849 format(" \t \t int\ta; /* some\n"
8850 " \t \t comment */",
8851 Tab));
8852 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8853 " comment */",
8854 format(" \t \t f(\"\t\t\"); /* some\n"
8855 " \t \t comment */",
8856 Tab));
8857 EXPECT_EQ("{\n"
8858 " /*\n"
8859 " * Comment\n"
8860 " */\n"
8861 " int i;\n"
8862 "}",
8863 format("{\n"
8864 "\t/*\n"
8865 "\t * Comment\n"
8866 "\t */\n"
8867 "\t int i;\n"
8868 "}"));
8869 Tab.AlignConsecutiveAssignments = true;
8870 Tab.AlignConsecutiveDeclarations = true;
8871 Tab.TabWidth = 4;
8872 Tab.IndentWidth = 4;
8873 verifyFormat("class Assign {\n"
8874 "\tvoid f() {\n"
8875 "\t\tint x = 123;\n"
8876 "\t\tint random = 4;\n"
8877 "\t\tstd::string alphabet =\n"
8878 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8879 "\t}\n"
8880 "};",
8881 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008882}
8883
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008884TEST_F(FormatTest, CalculatesOriginalColumn) {
8885 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8886 "q\"; /* some\n"
8887 " comment */",
8888 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8889 "q\"; /* some\n"
8890 " comment */",
8891 getLLVMStyle()));
8892 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8893 "/* some\n"
8894 " comment */",
8895 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8896 " /* some\n"
8897 " comment */",
8898 getLLVMStyle()));
8899 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8900 "qqq\n"
8901 "/* some\n"
8902 " comment */",
8903 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8904 "qqq\n"
8905 " /* some\n"
8906 " comment */",
8907 getLLVMStyle()));
8908 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8909 "wwww; /* some\n"
8910 " comment */",
8911 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8912 "wwww; /* some\n"
8913 " comment */",
8914 getLLVMStyle()));
8915}
8916
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008917TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008918 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008919 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008920
8921 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008922 " continue;",
8923 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008924 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008925 " continue;",
8926 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008927 verifyFormat("if(true)\n"
8928 " f();\n"
8929 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008930 " f();",
8931 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008932 verifyFormat("do {\n"
8933 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008934 "} while(something());",
8935 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008936 verifyFormat("switch(x) {\n"
8937 "default:\n"
8938 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008939 "}",
8940 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008941 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008942 verifyFormat("size_t x = sizeof(x);", NoSpace);
8943 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8944 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8945 verifyFormat("alignas(128) char a[128];", NoSpace);
8946 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8947 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8948 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008949 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008950 verifyFormat("T A::operator()();", NoSpace);
8951 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008952
8953 FormatStyle Space = getLLVMStyle();
8954 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8955
8956 verifyFormat("int f ();", Space);
8957 verifyFormat("void f (int a, T b) {\n"
8958 " while (true)\n"
8959 " continue;\n"
8960 "}",
8961 Space);
8962 verifyFormat("if (true)\n"
8963 " f ();\n"
8964 "else if (true)\n"
8965 " f ();",
8966 Space);
8967 verifyFormat("do {\n"
8968 " do_something ();\n"
8969 "} while (something ());",
8970 Space);
8971 verifyFormat("switch (x) {\n"
8972 "default:\n"
8973 " break;\n"
8974 "}",
8975 Space);
8976 verifyFormat("A::A () : a (1) {}", Space);
8977 verifyFormat("void f () __attribute__ ((asdf));", Space);
8978 verifyFormat("*(&a + 1);\n"
8979 "&((&a)[1]);\n"
8980 "a[(b + c) * d];\n"
8981 "(((a + 1) * 2) + 3) * 4;",
8982 Space);
8983 verifyFormat("#define A(x) x", Space);
8984 verifyFormat("#define A (x) x", Space);
8985 verifyFormat("#if defined(x)\n"
8986 "#endif",
8987 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008988 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008989 verifyFormat("size_t x = sizeof (x);", Space);
8990 verifyFormat("auto f (int x) -> decltype (x);", Space);
8991 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8992 verifyFormat("alignas (128) char a[128];", Space);
8993 verifyFormat("size_t x = alignof (MyType);", Space);
8994 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8995 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008996 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008997 verifyFormat("T A::operator() ();", Space);
8998 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008999}
9000
9001TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
9002 FormatStyle Spaces = getLLVMStyle();
9003
9004 Spaces.SpacesInParentheses = true;
9005 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009006 verifyFormat("call();", Spaces);
9007 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009008 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
9009 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009010 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009011 " continue;",
9012 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009013 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009014 " continue;",
9015 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009016 verifyFormat("if ( true )\n"
9017 " f();\n"
9018 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009019 " f();",
9020 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009021 verifyFormat("do {\n"
9022 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009023 "} while ( something() );",
9024 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009025 verifyFormat("switch ( x ) {\n"
9026 "default:\n"
9027 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009028 "}",
9029 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009030
9031 Spaces.SpacesInParentheses = false;
9032 Spaces.SpacesInCStyleCastParentheses = true;
9033 verifyFormat("Type *A = ( Type * )P;", Spaces);
9034 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9035 verifyFormat("x = ( int32 )y;", Spaces);
9036 verifyFormat("int a = ( int )(2.0f);", Spaces);
9037 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9038 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9039 verifyFormat("#define x (( int )-1)", Spaces);
9040
Daniel Jasper92e09822015-03-18 12:59:19 +00009041 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00009042 Spaces.SpacesInParentheses = false;
9043 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009044 Spaces.SpacesInCStyleCastParentheses = true;
9045 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009046 verifyFormat("call( );", Spaces);
9047 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009048 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009049 " continue;",
9050 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009051 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009052 " continue;",
9053 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009054 verifyFormat("if (true)\n"
9055 " f( );\n"
9056 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009057 " f( );",
9058 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009059 verifyFormat("do {\n"
9060 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009061 "} while (something( ));",
9062 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009063 verifyFormat("switch (x) {\n"
9064 "default:\n"
9065 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009066 "}",
9067 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009068
Daniel Jasper92e09822015-03-18 12:59:19 +00009069 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009070 Spaces.SpaceAfterCStyleCast = true;
9071 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009072 verifyFormat("call( );", Spaces);
9073 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009074 verifyFormat("while (( bool ) 1)\n"
9075 " continue;",
9076 Spaces);
9077 verifyFormat("for (;;)\n"
9078 " continue;",
9079 Spaces);
9080 verifyFormat("if (true)\n"
9081 " f( );\n"
9082 "else if (true)\n"
9083 " f( );",
9084 Spaces);
9085 verifyFormat("do {\n"
9086 " do_something(( int ) i);\n"
9087 "} while (something( ));",
9088 Spaces);
9089 verifyFormat("switch (x) {\n"
9090 "default:\n"
9091 " break;\n"
9092 "}",
9093 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009094
9095 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009096 Spaces.SpacesInCStyleCastParentheses = false;
9097 Spaces.SpaceAfterCStyleCast = true;
9098 verifyFormat("while ((bool) 1)\n"
9099 " continue;",
9100 Spaces);
9101 verifyFormat("do {\n"
9102 " do_something((int) i);\n"
9103 "} while (something( ));",
9104 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009105}
9106
Daniel Jasperad981f82014-08-26 11:41:14 +00009107TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9108 verifyFormat("int a[5];");
9109 verifyFormat("a[3] += 42;");
9110
9111 FormatStyle Spaces = getLLVMStyle();
9112 Spaces.SpacesInSquareBrackets = true;
9113 // Lambdas unchanged.
9114 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9115 verifyFormat("return [i, args...] {};", Spaces);
9116
9117 // Not lambdas.
9118 verifyFormat("int a[ 5 ];", Spaces);
9119 verifyFormat("a[ 3 ] += 42;", Spaces);
9120 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9121 verifyFormat("double &operator[](int i) { return 0; }\n"
9122 "int i;",
9123 Spaces);
9124 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9125 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9126 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9127}
9128
Daniel Jasperd94bff32013-09-25 15:15:02 +00009129TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9130 verifyFormat("int a = 5;");
9131 verifyFormat("a += 42;");
9132 verifyFormat("a or_eq 8;");
9133
9134 FormatStyle Spaces = getLLVMStyle();
9135 Spaces.SpaceBeforeAssignmentOperators = false;
9136 verifyFormat("int a= 5;", Spaces);
9137 verifyFormat("a+= 42;", Spaces);
9138 verifyFormat("a or_eq 8;", Spaces);
9139}
9140
Daniel Jaspera44991332015-04-29 13:06:49 +00009141TEST_F(FormatTest, AlignConsecutiveAssignments) {
9142 FormatStyle Alignment = getLLVMStyle();
9143 Alignment.AlignConsecutiveAssignments = false;
9144 verifyFormat("int a = 5;\n"
9145 "int oneTwoThree = 123;",
9146 Alignment);
9147 verifyFormat("int a = 5;\n"
9148 "int oneTwoThree = 123;",
9149 Alignment);
9150
9151 Alignment.AlignConsecutiveAssignments = true;
9152 verifyFormat("int a = 5;\n"
9153 "int oneTwoThree = 123;",
9154 Alignment);
9155 verifyFormat("int a = method();\n"
9156 "int oneTwoThree = 133;",
9157 Alignment);
9158 verifyFormat("a &= 5;\n"
9159 "bcd *= 5;\n"
9160 "ghtyf += 5;\n"
9161 "dvfvdb -= 5;\n"
9162 "a /= 5;\n"
9163 "vdsvsv %= 5;\n"
9164 "sfdbddfbdfbb ^= 5;\n"
9165 "dvsdsv |= 5;\n"
9166 "int dsvvdvsdvvv = 123;",
9167 Alignment);
9168 verifyFormat("int i = 1, j = 10;\n"
9169 "something = 2000;",
9170 Alignment);
9171 verifyFormat("something = 2000;\n"
9172 "int i = 1, j = 10;\n",
9173 Alignment);
9174 verifyFormat("something = 2000;\n"
9175 "another = 911;\n"
9176 "int i = 1, j = 10;\n"
9177 "oneMore = 1;\n"
9178 "i = 2;",
9179 Alignment);
9180 verifyFormat("int a = 5;\n"
9181 "int one = 1;\n"
9182 "method();\n"
9183 "int oneTwoThree = 123;\n"
9184 "int oneTwo = 12;",
9185 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009186 verifyFormat("int oneTwoThree = 123;\n"
9187 "int oneTwo = 12;\n"
9188 "method();\n",
9189 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009190 verifyFormat("int oneTwoThree = 123; // comment\n"
9191 "int oneTwo = 12; // comment",
9192 Alignment);
9193 EXPECT_EQ("int a = 5;\n"
9194 "\n"
9195 "int oneTwoThree = 123;",
9196 format("int a = 5;\n"
9197 "\n"
9198 "int oneTwoThree= 123;",
9199 Alignment));
9200 EXPECT_EQ("int a = 5;\n"
9201 "int one = 1;\n"
9202 "\n"
9203 "int oneTwoThree = 123;",
9204 format("int a = 5;\n"
9205 "int one = 1;\n"
9206 "\n"
9207 "int oneTwoThree = 123;",
9208 Alignment));
9209 EXPECT_EQ("int a = 5;\n"
9210 "int one = 1;\n"
9211 "\n"
9212 "int oneTwoThree = 123;\n"
9213 "int oneTwo = 12;",
9214 format("int a = 5;\n"
9215 "int one = 1;\n"
9216 "\n"
9217 "int oneTwoThree = 123;\n"
9218 "int oneTwo = 12;",
9219 Alignment));
9220 Alignment.AlignEscapedNewlinesLeft = true;
9221 verifyFormat("#define A \\\n"
9222 " int aaaa = 12; \\\n"
9223 " int b = 23; \\\n"
9224 " int ccc = 234; \\\n"
9225 " int dddddddddd = 2345;",
9226 Alignment);
9227 Alignment.AlignEscapedNewlinesLeft = false;
9228 verifyFormat("#define A "
9229 " \\\n"
9230 " int aaaa = 12; "
9231 " \\\n"
9232 " int b = 23; "
9233 " \\\n"
9234 " int ccc = 234; "
9235 " \\\n"
9236 " int dddddddddd = 2345;",
9237 Alignment);
9238 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9239 "k = 4, int l = 5,\n"
9240 " int m = 6) {\n"
9241 " int j = 10;\n"
9242 " otherThing = 1;\n"
9243 "}",
9244 Alignment);
9245 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9246 " int i = 1;\n"
9247 " int j = 2;\n"
9248 " int big = 10000;\n"
9249 "}",
9250 Alignment);
9251 verifyFormat("class C {\n"
9252 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009253 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009254 " virtual void f() = 0;\n"
9255 "};",
9256 Alignment);
9257 verifyFormat("int i = 1;\n"
9258 "if (SomeType t = getSomething()) {\n"
9259 "}\n"
9260 "int j = 2;\n"
9261 "int big = 10000;",
9262 Alignment);
9263 verifyFormat("int j = 7;\n"
9264 "for (int k = 0; k < N; ++k) {\n"
9265 "}\n"
9266 "int j = 2;\n"
9267 "int big = 10000;\n"
9268 "}",
9269 Alignment);
9270 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9271 verifyFormat("int i = 1;\n"
9272 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9273 " = someLooooooooooooooooongFunction();\n"
9274 "int j = 2;",
9275 Alignment);
9276 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9277 verifyFormat("int i = 1;\n"
9278 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9279 " someLooooooooooooooooongFunction();\n"
9280 "int j = 2;",
9281 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009282
9283 verifyFormat("auto lambda = []() {\n"
9284 " auto i = 0;\n"
9285 " return 0;\n"
9286 "};\n"
9287 "int i = 0;\n"
9288 "auto v = type{\n"
9289 " i = 1, //\n"
9290 " (i = 2), //\n"
9291 " i = 3 //\n"
9292 "};",
9293 Alignment);
9294
Daniel Jaspera44991332015-04-29 13:06:49 +00009295 // FIXME: Should align all three assignments
9296 verifyFormat(
9297 "int i = 1;\n"
9298 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9299 " loooooooooooooooooooooongParameterB);\n"
9300 "int j = 2;",
9301 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009302
9303 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9304 " typename B = very_long_type_name_1,\n"
9305 " typename T_2 = very_long_type_name_2>\n"
9306 "auto foo() {}\n",
9307 Alignment);
9308 verifyFormat("int a, b = 1;\n"
9309 "int c = 2;\n"
9310 "int dd = 3;\n",
9311 Alignment);
9312 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9313 "float b[1][] = {{3.f}};\n",
9314 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009315}
9316
Daniel Jaspere12597c2015-10-01 10:06:54 +00009317TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9318 FormatStyle Alignment = getLLVMStyle();
9319 Alignment.AlignConsecutiveDeclarations = false;
9320 verifyFormat("float const a = 5;\n"
9321 "int oneTwoThree = 123;",
9322 Alignment);
9323 verifyFormat("int a = 5;\n"
9324 "float const oneTwoThree = 123;",
9325 Alignment);
9326
9327 Alignment.AlignConsecutiveDeclarations = true;
9328 verifyFormat("float const a = 5;\n"
9329 "int oneTwoThree = 123;",
9330 Alignment);
9331 verifyFormat("int a = method();\n"
9332 "float const oneTwoThree = 133;",
9333 Alignment);
9334 verifyFormat("int i = 1, j = 10;\n"
9335 "something = 2000;",
9336 Alignment);
9337 verifyFormat("something = 2000;\n"
9338 "int i = 1, j = 10;\n",
9339 Alignment);
9340 verifyFormat("float something = 2000;\n"
9341 "double another = 911;\n"
9342 "int i = 1, j = 10;\n"
9343 "const int *oneMore = 1;\n"
9344 "unsigned i = 2;",
9345 Alignment);
9346 verifyFormat("float a = 5;\n"
9347 "int one = 1;\n"
9348 "method();\n"
9349 "const double oneTwoThree = 123;\n"
9350 "const unsigned int oneTwo = 12;",
9351 Alignment);
9352 verifyFormat("int oneTwoThree{0}; // comment\n"
9353 "unsigned oneTwo; // comment",
9354 Alignment);
9355 EXPECT_EQ("float const a = 5;\n"
9356 "\n"
9357 "int oneTwoThree = 123;",
9358 format("float const a = 5;\n"
9359 "\n"
9360 "int oneTwoThree= 123;",
9361 Alignment));
9362 EXPECT_EQ("float a = 5;\n"
9363 "int one = 1;\n"
9364 "\n"
9365 "unsigned oneTwoThree = 123;",
9366 format("float a = 5;\n"
9367 "int one = 1;\n"
9368 "\n"
9369 "unsigned oneTwoThree = 123;",
9370 Alignment));
9371 EXPECT_EQ("float a = 5;\n"
9372 "int one = 1;\n"
9373 "\n"
9374 "unsigned oneTwoThree = 123;\n"
9375 "int oneTwo = 12;",
9376 format("float a = 5;\n"
9377 "int one = 1;\n"
9378 "\n"
9379 "unsigned oneTwoThree = 123;\n"
9380 "int oneTwo = 12;",
9381 Alignment));
9382 Alignment.AlignConsecutiveAssignments = true;
9383 verifyFormat("float something = 2000;\n"
9384 "double another = 911;\n"
9385 "int i = 1, j = 10;\n"
9386 "const int *oneMore = 1;\n"
9387 "unsigned i = 2;",
9388 Alignment);
9389 verifyFormat("int oneTwoThree = {0}; // comment\n"
9390 "unsigned oneTwo = 0; // comment",
9391 Alignment);
9392 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9393 " int const i = 1;\n"
9394 " int * j = 2;\n"
9395 " int big = 10000;\n"
9396 "\n"
9397 " unsigned oneTwoThree = 123;\n"
9398 " int oneTwo = 12;\n"
9399 " method();\n"
9400 " float k = 2;\n"
9401 " int ll = 10000;\n"
9402 "}",
9403 format("void SomeFunction(int parameter= 0) {\n"
9404 " int const i= 1;\n"
9405 " int *j=2;\n"
9406 " int big = 10000;\n"
9407 "\n"
9408 "unsigned oneTwoThree =123;\n"
9409 "int oneTwo = 12;\n"
9410 " method();\n"
9411 "float k= 2;\n"
9412 "int ll=10000;\n"
9413 "}",
9414 Alignment));
9415 Alignment.AlignConsecutiveAssignments = false;
9416 Alignment.AlignEscapedNewlinesLeft = true;
9417 verifyFormat("#define A \\\n"
9418 " int aaaa = 12; \\\n"
9419 " float b = 23; \\\n"
9420 " const int ccc = 234; \\\n"
9421 " unsigned dddddddddd = 2345;",
9422 Alignment);
9423 Alignment.AlignEscapedNewlinesLeft = false;
9424 Alignment.ColumnLimit = 30;
9425 verifyFormat("#define A \\\n"
9426 " int aaaa = 12; \\\n"
9427 " float b = 23; \\\n"
9428 " const int ccc = 234; \\\n"
9429 " int dddddddddd = 2345;",
9430 Alignment);
9431 Alignment.ColumnLimit = 80;
9432 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9433 "k = 4, int l = 5,\n"
9434 " int m = 6) {\n"
9435 " const int j = 10;\n"
9436 " otherThing = 1;\n"
9437 "}",
9438 Alignment);
9439 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9440 " int const i = 1;\n"
9441 " int * j = 2;\n"
9442 " int big = 10000;\n"
9443 "}",
9444 Alignment);
9445 verifyFormat("class C {\n"
9446 "public:\n"
9447 " int i = 1;\n"
9448 " virtual void f() = 0;\n"
9449 "};",
9450 Alignment);
9451 verifyFormat("float i = 1;\n"
9452 "if (SomeType t = getSomething()) {\n"
9453 "}\n"
9454 "const unsigned j = 2;\n"
9455 "int big = 10000;",
9456 Alignment);
9457 verifyFormat("float j = 7;\n"
9458 "for (int k = 0; k < N; ++k) {\n"
9459 "}\n"
9460 "unsigned j = 2;\n"
9461 "int big = 10000;\n"
9462 "}",
9463 Alignment);
9464 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9465 verifyFormat("float i = 1;\n"
9466 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9467 " = someLooooooooooooooooongFunction();\n"
9468 "int j = 2;",
9469 Alignment);
9470 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9471 verifyFormat("int i = 1;\n"
9472 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9473 " someLooooooooooooooooongFunction();\n"
9474 "int j = 2;",
9475 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009476
9477 Alignment.AlignConsecutiveAssignments = true;
9478 verifyFormat("auto lambda = []() {\n"
9479 " auto ii = 0;\n"
9480 " float j = 0;\n"
9481 " return 0;\n"
9482 "};\n"
9483 "int i = 0;\n"
9484 "float i2 = 0;\n"
9485 "auto v = type{\n"
9486 " i = 1, //\n"
9487 " (i = 2), //\n"
9488 " i = 3 //\n"
9489 "};",
9490 Alignment);
9491 Alignment.AlignConsecutiveAssignments = false;
9492
Daniel Jaspere12597c2015-10-01 10:06:54 +00009493 // FIXME: Should align all three declarations
9494 verifyFormat(
9495 "int i = 1;\n"
9496 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9497 " loooooooooooooooooooooongParameterB);\n"
9498 "int j = 2;",
9499 Alignment);
9500
9501 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9502 // We expect declarations and assignments to align, as long as it doesn't
9503 // exceed the column limit, starting a new alignemnt sequence whenever it
9504 // happens.
9505 Alignment.AlignConsecutiveAssignments = true;
9506 Alignment.ColumnLimit = 30;
9507 verifyFormat("float ii = 1;\n"
9508 "unsigned j = 2;\n"
9509 "int someVerylongVariable = 1;\n"
9510 "AnotherLongType ll = 123456;\n"
9511 "VeryVeryLongType k = 2;\n"
9512 "int myvar = 1;",
9513 Alignment);
9514 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009515 Alignment.AlignConsecutiveAssignments = false;
9516
9517 verifyFormat(
9518 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9519 " typename LongType, typename B>\n"
9520 "auto foo() {}\n",
9521 Alignment);
9522 verifyFormat("float a, b = 1;\n"
9523 "int c = 2;\n"
9524 "int dd = 3;\n",
9525 Alignment);
9526 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9527 "float b[1][] = {{3.f}};\n",
9528 Alignment);
9529 Alignment.AlignConsecutiveAssignments = true;
9530 verifyFormat("float a, b = 1;\n"
9531 "int c = 2;\n"
9532 "int dd = 3;\n",
9533 Alignment);
9534 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9535 "float b[1][] = {{3.f}};\n",
9536 Alignment);
9537 Alignment.AlignConsecutiveAssignments = false;
9538
9539 Alignment.ColumnLimit = 30;
9540 Alignment.BinPackParameters = false;
9541 verifyFormat("void foo(float a,\n"
9542 " float b,\n"
9543 " int c,\n"
9544 " uint32_t *d) {\n"
9545 " int * e = 0;\n"
9546 " float f = 0;\n"
9547 " double g = 0;\n"
9548 "}\n"
9549 "void bar(ino_t a,\n"
9550 " int b,\n"
9551 " uint32_t *c,\n"
9552 " bool d) {}\n",
9553 Alignment);
9554 Alignment.BinPackParameters = true;
9555 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009556}
9557
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009558TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009559 FormatStyle LinuxBraceStyle = getLLVMStyle();
9560 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009561 verifyFormat("namespace a\n"
9562 "{\n"
9563 "class A\n"
9564 "{\n"
9565 " void f()\n"
9566 " {\n"
9567 " if (true) {\n"
9568 " a();\n"
9569 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009570 " } else {\n"
9571 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009572 " }\n"
9573 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009574 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009575 "};\n"
9576 "struct B {\n"
9577 " int x;\n"
9578 "};\n"
9579 "}\n",
9580 LinuxBraceStyle);
9581 verifyFormat("enum X {\n"
9582 " Y = 0,\n"
9583 "}\n",
9584 LinuxBraceStyle);
9585 verifyFormat("struct S {\n"
9586 " int Type;\n"
9587 " union {\n"
9588 " int x;\n"
9589 " double y;\n"
9590 " } Value;\n"
9591 " class C\n"
9592 " {\n"
9593 " MyFavoriteType Value;\n"
9594 " } Class;\n"
9595 "}\n",
9596 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009597}
9598
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009599TEST_F(FormatTest, MozillaBraceBreaking) {
9600 FormatStyle MozillaBraceStyle = getLLVMStyle();
9601 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9602 verifyFormat("namespace a {\n"
9603 "class A\n"
9604 "{\n"
9605 " void f()\n"
9606 " {\n"
9607 " if (true) {\n"
9608 " a();\n"
9609 " b();\n"
9610 " }\n"
9611 " }\n"
9612 " void g() { return; }\n"
9613 "};\n"
9614 "enum E\n"
9615 "{\n"
9616 " A,\n"
9617 " // foo\n"
9618 " B,\n"
9619 " C\n"
9620 "};\n"
9621 "struct B\n"
9622 "{\n"
9623 " int x;\n"
9624 "};\n"
9625 "}\n",
9626 MozillaBraceStyle);
9627 verifyFormat("struct S\n"
9628 "{\n"
9629 " int Type;\n"
9630 " union\n"
9631 " {\n"
9632 " int x;\n"
9633 " double y;\n"
9634 " } Value;\n"
9635 " class C\n"
9636 " {\n"
9637 " MyFavoriteType Value;\n"
9638 " } Class;\n"
9639 "}\n",
9640 MozillaBraceStyle);
9641}
9642
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009643TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009644 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9645 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009646 verifyFormat("namespace a {\n"
9647 "class A {\n"
9648 " void f()\n"
9649 " {\n"
9650 " if (true) {\n"
9651 " a();\n"
9652 " b();\n"
9653 " }\n"
9654 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009655 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009656 "};\n"
9657 "struct B {\n"
9658 " int x;\n"
9659 "};\n"
9660 "}\n",
9661 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009662
Daniel Jasperd9670872014-08-05 12:06:20 +00009663 verifyFormat("void foo()\n"
9664 "{\n"
9665 " if (a) {\n"
9666 " a();\n"
9667 " }\n"
9668 " else {\n"
9669 " b();\n"
9670 " }\n"
9671 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009672 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009673
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009674 verifyFormat("#ifdef _DEBUG\n"
9675 "int foo(int i = 0)\n"
9676 "#else\n"
9677 "int foo(int i = 5)\n"
9678 "#endif\n"
9679 "{\n"
9680 " return i;\n"
9681 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009682 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009683
9684 verifyFormat("void foo() {}\n"
9685 "void bar()\n"
9686 "#ifdef _DEBUG\n"
9687 "{\n"
9688 " foo();\n"
9689 "}\n"
9690 "#else\n"
9691 "{\n"
9692 "}\n"
9693 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009694 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009695
9696 verifyFormat("void foobar() { int i = 5; }\n"
9697 "#ifdef _DEBUG\n"
9698 "void bar() {}\n"
9699 "#else\n"
9700 "void bar() { foobar(); }\n"
9701 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009702 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009703}
9704
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009705TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009706 FormatStyle AllmanBraceStyle = getLLVMStyle();
9707 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009708 verifyFormat("namespace a\n"
9709 "{\n"
9710 "class A\n"
9711 "{\n"
9712 " void f()\n"
9713 " {\n"
9714 " if (true)\n"
9715 " {\n"
9716 " a();\n"
9717 " b();\n"
9718 " }\n"
9719 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009720 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009721 "};\n"
9722 "struct B\n"
9723 "{\n"
9724 " int x;\n"
9725 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009726 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009727 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009728
9729 verifyFormat("void f()\n"
9730 "{\n"
9731 " if (true)\n"
9732 " {\n"
9733 " a();\n"
9734 " }\n"
9735 " else if (false)\n"
9736 " {\n"
9737 " b();\n"
9738 " }\n"
9739 " else\n"
9740 " {\n"
9741 " c();\n"
9742 " }\n"
9743 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009744 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009745
9746 verifyFormat("void f()\n"
9747 "{\n"
9748 " for (int i = 0; i < 10; ++i)\n"
9749 " {\n"
9750 " a();\n"
9751 " }\n"
9752 " while (false)\n"
9753 " {\n"
9754 " b();\n"
9755 " }\n"
9756 " do\n"
9757 " {\n"
9758 " c();\n"
9759 " } while (false)\n"
9760 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009761 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009762
9763 verifyFormat("void f(int a)\n"
9764 "{\n"
9765 " switch (a)\n"
9766 " {\n"
9767 " case 0:\n"
9768 " break;\n"
9769 " case 1:\n"
9770 " {\n"
9771 " break;\n"
9772 " }\n"
9773 " case 2:\n"
9774 " {\n"
9775 " }\n"
9776 " break;\n"
9777 " default:\n"
9778 " break;\n"
9779 " }\n"
9780 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009781 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009782
9783 verifyFormat("enum X\n"
9784 "{\n"
9785 " Y = 0,\n"
9786 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009787 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009788 verifyFormat("enum X\n"
9789 "{\n"
9790 " Y = 0\n"
9791 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009792 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009793
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009794 verifyFormat("@interface BSApplicationController ()\n"
9795 "{\n"
9796 "@private\n"
9797 " id _extraIvar;\n"
9798 "}\n"
9799 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009800 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009801
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009802 verifyFormat("#ifdef _DEBUG\n"
9803 "int foo(int i = 0)\n"
9804 "#else\n"
9805 "int foo(int i = 5)\n"
9806 "#endif\n"
9807 "{\n"
9808 " return i;\n"
9809 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009810 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009811
9812 verifyFormat("void foo() {}\n"
9813 "void bar()\n"
9814 "#ifdef _DEBUG\n"
9815 "{\n"
9816 " foo();\n"
9817 "}\n"
9818 "#else\n"
9819 "{\n"
9820 "}\n"
9821 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009822 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009823
9824 verifyFormat("void foobar() { int i = 5; }\n"
9825 "#ifdef _DEBUG\n"
9826 "void bar() {}\n"
9827 "#else\n"
9828 "void bar() { foobar(); }\n"
9829 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009830 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009831
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009832 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009833 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009834 " // ...\n"
9835 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009836 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009837 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009838 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009839 " // ...\n"
9840 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009841 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009842 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009843 // .. or dict literals.
9844 verifyFormat("void f()\n"
9845 "{\n"
9846 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9847 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009848 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009849 verifyFormat("int f()\n"
9850 "{ // comment\n"
9851 " return 42;\n"
9852 "}",
9853 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009854
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009855 AllmanBraceStyle.ColumnLimit = 19;
9856 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9857 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009858 verifyFormat("void f()\n"
9859 "{\n"
9860 " int i;\n"
9861 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009862 AllmanBraceStyle);
9863 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009864
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009865 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009866 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9867 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9868 verifyFormat("void f(bool b)\n"
9869 "{\n"
9870 " if (b)\n"
9871 " {\n"
9872 " return;\n"
9873 " }\n"
9874 "}\n",
9875 BreakBeforeBraceShortIfs);
9876 verifyFormat("void f(bool b)\n"
9877 "{\n"
9878 " if (b) return;\n"
9879 "}\n",
9880 BreakBeforeBraceShortIfs);
9881 verifyFormat("void f(bool b)\n"
9882 "{\n"
9883 " while (b)\n"
9884 " {\n"
9885 " return;\n"
9886 " }\n"
9887 "}\n",
9888 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009889}
9890
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009891TEST_F(FormatTest, GNUBraceBreaking) {
9892 FormatStyle GNUBraceStyle = getLLVMStyle();
9893 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9894 verifyFormat("namespace a\n"
9895 "{\n"
9896 "class A\n"
9897 "{\n"
9898 " void f()\n"
9899 " {\n"
9900 " int a;\n"
9901 " {\n"
9902 " int b;\n"
9903 " }\n"
9904 " if (true)\n"
9905 " {\n"
9906 " a();\n"
9907 " b();\n"
9908 " }\n"
9909 " }\n"
9910 " void g() { return; }\n"
9911 "}\n"
9912 "}",
9913 GNUBraceStyle);
9914
9915 verifyFormat("void f()\n"
9916 "{\n"
9917 " if (true)\n"
9918 " {\n"
9919 " a();\n"
9920 " }\n"
9921 " else if (false)\n"
9922 " {\n"
9923 " b();\n"
9924 " }\n"
9925 " else\n"
9926 " {\n"
9927 " c();\n"
9928 " }\n"
9929 "}\n",
9930 GNUBraceStyle);
9931
9932 verifyFormat("void f()\n"
9933 "{\n"
9934 " for (int i = 0; i < 10; ++i)\n"
9935 " {\n"
9936 " a();\n"
9937 " }\n"
9938 " while (false)\n"
9939 " {\n"
9940 " b();\n"
9941 " }\n"
9942 " do\n"
9943 " {\n"
9944 " c();\n"
9945 " }\n"
9946 " while (false);\n"
9947 "}\n",
9948 GNUBraceStyle);
9949
9950 verifyFormat("void f(int a)\n"
9951 "{\n"
9952 " switch (a)\n"
9953 " {\n"
9954 " case 0:\n"
9955 " break;\n"
9956 " case 1:\n"
9957 " {\n"
9958 " break;\n"
9959 " }\n"
9960 " case 2:\n"
9961 " {\n"
9962 " }\n"
9963 " break;\n"
9964 " default:\n"
9965 " break;\n"
9966 " }\n"
9967 "}\n",
9968 GNUBraceStyle);
9969
9970 verifyFormat("enum X\n"
9971 "{\n"
9972 " Y = 0,\n"
9973 "}\n",
9974 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009975
9976 verifyFormat("@interface BSApplicationController ()\n"
9977 "{\n"
9978 "@private\n"
9979 " id _extraIvar;\n"
9980 "}\n"
9981 "@end\n",
9982 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009983
9984 verifyFormat("#ifdef _DEBUG\n"
9985 "int foo(int i = 0)\n"
9986 "#else\n"
9987 "int foo(int i = 5)\n"
9988 "#endif\n"
9989 "{\n"
9990 " return i;\n"
9991 "}",
9992 GNUBraceStyle);
9993
9994 verifyFormat("void foo() {}\n"
9995 "void bar()\n"
9996 "#ifdef _DEBUG\n"
9997 "{\n"
9998 " foo();\n"
9999 "}\n"
10000 "#else\n"
10001 "{\n"
10002 "}\n"
10003 "#endif",
10004 GNUBraceStyle);
10005
10006 verifyFormat("void foobar() { int i = 5; }\n"
10007 "#ifdef _DEBUG\n"
10008 "void bar() {}\n"
10009 "#else\n"
10010 "void bar() { foobar(); }\n"
10011 "#endif",
10012 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010013}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010014
10015TEST_F(FormatTest, WebKitBraceBreaking) {
10016 FormatStyle WebKitBraceStyle = getLLVMStyle();
10017 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
10018 verifyFormat("namespace a {\n"
10019 "class A {\n"
10020 " void f()\n"
10021 " {\n"
10022 " if (true) {\n"
10023 " a();\n"
10024 " b();\n"
10025 " }\n"
10026 " }\n"
10027 " void g() { return; }\n"
10028 "};\n"
10029 "enum E {\n"
10030 " A,\n"
10031 " // foo\n"
10032 " B,\n"
10033 " C\n"
10034 "};\n"
10035 "struct B {\n"
10036 " int x;\n"
10037 "};\n"
10038 "}\n",
10039 WebKitBraceStyle);
10040 verifyFormat("struct S {\n"
10041 " int Type;\n"
10042 " union {\n"
10043 " int x;\n"
10044 " double y;\n"
10045 " } Value;\n"
10046 " class C {\n"
10047 " MyFavoriteType Value;\n"
10048 " } Class;\n"
10049 "};\n",
10050 WebKitBraceStyle);
10051}
10052
Manuel Klimekd5735502013-08-12 03:51:17 +000010053TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10054 verifyFormat("void f() {\n"
10055 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010056 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010057 " }\n"
10058 "}\n",
10059 getLLVMStyle());
10060}
10061
Daniel Jasper9613c812013-08-07 16:29:23 +000010062TEST_F(FormatTest, UnderstandsPragmas) {
10063 verifyFormat("#pragma omp reduction(| : var)");
10064 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010065
10066 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10067 "(including parentheses).",
10068 format("#pragma mark Any non-hyphenated or hyphenated string "
10069 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010070}
10071
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010072TEST_F(FormatTest, UnderstandPragmaOption) {
10073 verifyFormat("#pragma option -C -A");
10074
10075 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10076}
10077
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010078#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10079 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010080 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10081 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010082
10083TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010084 SmallVector<FormatStyle, 3> Styles;
10085 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010086
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010087 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010088 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10089 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10090 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010091
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010092 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010093 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10094 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10095 EXPECT_ALL_STYLES_EQUAL(Styles);
10096
Nico Weber514ecc82014-02-02 20:50:45 +000010097 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010098 EXPECT_TRUE(
10099 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10100 EXPECT_TRUE(
10101 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10102 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010103
Nico Weber514ecc82014-02-02 20:50:45 +000010104 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010105 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10106 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10107 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010108
10109 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010110 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10111 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10112 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010113
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010114 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010115 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10116 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10117 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010118
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010119 Styles[0] = getGNUStyle();
10120 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10121 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10122 EXPECT_ALL_STYLES_EQUAL(Styles);
10123
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010124 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10125}
10126
10127TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10128 SmallVector<FormatStyle, 8> Styles;
10129 Styles.resize(2);
10130
10131 Styles[0] = getGoogleStyle();
10132 Styles[1] = getLLVMStyle();
10133 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10134 EXPECT_ALL_STYLES_EQUAL(Styles);
10135
10136 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010137 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010138 Styles[1] = getLLVMStyle();
10139 Styles[1].Language = FormatStyle::LK_JavaScript;
10140 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10141
10142 Styles[2] = getLLVMStyle();
10143 Styles[2].Language = FormatStyle::LK_JavaScript;
10144 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10145 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010146 &Styles[2])
10147 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010148
10149 Styles[3] = getLLVMStyle();
10150 Styles[3].Language = FormatStyle::LK_JavaScript;
10151 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10152 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010153 &Styles[3])
10154 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010155
10156 Styles[4] = getLLVMStyle();
10157 Styles[4].Language = FormatStyle::LK_JavaScript;
10158 EXPECT_EQ(0, parseConfiguration("---\n"
10159 "BasedOnStyle: LLVM\n"
10160 "IndentWidth: 123\n"
10161 "---\n"
10162 "BasedOnStyle: Google\n"
10163 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010164 &Styles[4])
10165 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010166 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010167}
10168
Daniel Jasper91881d92014-09-29 08:07:46 +000010169#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010170 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010171 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010172 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010173 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010174 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010175
Daniel Jasper91881d92014-09-29 08:07:46 +000010176#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10177
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010178#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10179 Style.STRUCT.FIELD = false; \
10180 EXPECT_EQ(0, \
10181 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10182 .value()); \
10183 EXPECT_TRUE(Style.STRUCT.FIELD); \
10184 EXPECT_EQ(0, \
10185 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10186 .value()); \
10187 EXPECT_FALSE(Style.STRUCT.FIELD);
10188
10189#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10190 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10191
Daniel Jasper00853002014-09-16 16:22:30 +000010192#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10193 EXPECT_NE(VALUE, Style.FIELD); \
10194 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10195 EXPECT_EQ(VALUE, Style.FIELD)
10196
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010197TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010198 FormatStyle Style = {};
10199 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010200 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +000010201 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010202 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010203 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010204 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010205 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010206 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010207 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010208 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010209 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010210 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010211 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010212 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010213 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010214 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +000010215 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010216 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010217 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010218 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010219 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010220 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010221 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010222 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010223 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010224 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010225 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010226 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010227 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010228 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010229 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010230 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010231 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010232 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010233 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010234 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010235 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010236 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010237 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010238
10239 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10240 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10241 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10242 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10243 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10244 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10245 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10246 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
10247 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10248 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10249 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010250}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010251
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010252#undef CHECK_PARSE_BOOL
10253
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010254TEST_F(FormatTest, ParsesConfiguration) {
10255 FormatStyle Style = {};
10256 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010257 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010258 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10259 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010260 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010261 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10262 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010263 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10264 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010265 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10266 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10267 PenaltyReturnTypeOnItsOwnLine, 1234u);
10268 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10269 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010270 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010271 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010272 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010273
Daniel Jasper553d4872014-06-17 12:40:34 +000010274 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010275 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10276 FormatStyle::PAS_Left);
10277 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10278 FormatStyle::PAS_Right);
10279 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10280 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010281 // For backward compatibility:
10282 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10283 FormatStyle::PAS_Left);
10284 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10285 FormatStyle::PAS_Right);
10286 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10287 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010288
Alexander Kornienkod6538332013-05-07 15:32:14 +000010289 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010290 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10291 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010292 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10293 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10294 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10295
Daniel Jasperac043c92014-09-15 11:11:00 +000010296 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010297 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10298 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010299 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10300 FormatStyle::BOS_None);
10301 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10302 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010303 // For backward compatibility:
10304 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10305 FormatStyle::BOS_None);
10306 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10307 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010308
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010309 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10310 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10311 FormatStyle::BAS_Align);
10312 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10313 FormatStyle::BAS_DontAlign);
10314 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10315 FormatStyle::BAS_AlwaysBreak);
10316 // For backward compatibility:
10317 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10318 FormatStyle::BAS_DontAlign);
10319 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10320 FormatStyle::BAS_Align);
10321
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010322 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010323 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10324 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10325 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010326 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10327 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010328 // For backward compatibility:
10329 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10330 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010331
Daniel Jasperd74cf402014-04-08 12:46:38 +000010332 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010333 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10334 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10335 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10336 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010337 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10338 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010339 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10340 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010341 // For backward compatibility:
10342 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10343 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10344 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10345 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010346
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010347 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10348 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10349 FormatStyle::SBPO_Never);
10350 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10351 FormatStyle::SBPO_Always);
10352 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10353 FormatStyle::SBPO_ControlStatements);
10354 // For backward compatibility:
10355 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10356 FormatStyle::SBPO_Never);
10357 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10358 FormatStyle::SBPO_ControlStatements);
10359
Alexander Kornienkod6538332013-05-07 15:32:14 +000010360 Style.ColumnLimit = 123;
10361 FormatStyle BaseStyle = getLLVMStyle();
10362 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10363 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10364
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010365 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10366 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10367 FormatStyle::BS_Attach);
10368 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10369 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010370 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10371 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010372 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10373 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010374 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10375 FormatStyle::BS_Allman);
10376 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010377 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10378 FormatStyle::BS_WebKit);
10379 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10380 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010381
Zachary Turner448592e2015-12-18 22:20:15 +000010382 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10383 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10384 FormatStyle::RTBS_None);
10385 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10386 FormatStyle::RTBS_All);
10387 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010388 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010389 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10390 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10391 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10392 AlwaysBreakAfterReturnType,
10393 FormatStyle::RTBS_TopLevelDefinitions);
10394
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010395 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10396 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10397 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10398 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10399 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10400 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10401 AlwaysBreakAfterDefinitionReturnType,
10402 FormatStyle::DRTBS_TopLevel);
10403
Daniel Jasper65ee3472013-07-31 23:16:02 +000010404 Style.NamespaceIndentation = FormatStyle::NI_All;
10405 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10406 FormatStyle::NI_None);
10407 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10408 FormatStyle::NI_Inner);
10409 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10410 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010411
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010412 // FIXME: This is required because parsing a configuration simply overwrites
10413 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010414 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010415 std::vector<std::string> BoostForeach;
10416 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010417 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010418 std::vector<std::string> BoostAndQForeach;
10419 BoostAndQForeach.push_back("BOOST_FOREACH");
10420 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010421 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10422 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010423
10424 Style.IncludeCategories.clear();
10425 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10426 {".*", 1}};
10427 CHECK_PARSE("IncludeCategories:\n"
10428 " - Regex: abc/.*\n"
10429 " Priority: 2\n"
10430 " - Regex: .*\n"
10431 " Priority: 1",
10432 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010433 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010434}
10435
10436TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10437 FormatStyle Style = {};
10438 Style.Language = FormatStyle::LK_Cpp;
10439 CHECK_PARSE("Language: Cpp\n"
10440 "IndentWidth: 12",
10441 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010442 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10443 "IndentWidth: 34",
10444 &Style),
10445 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010446 EXPECT_EQ(12u, Style.IndentWidth);
10447 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10448 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10449
10450 Style.Language = FormatStyle::LK_JavaScript;
10451 CHECK_PARSE("Language: JavaScript\n"
10452 "IndentWidth: 12",
10453 IndentWidth, 12u);
10454 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010455 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10456 "IndentWidth: 34",
10457 &Style),
10458 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010459 EXPECT_EQ(23u, Style.IndentWidth);
10460 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10461 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10462
10463 CHECK_PARSE("BasedOnStyle: LLVM\n"
10464 "IndentWidth: 67",
10465 IndentWidth, 67u);
10466
10467 CHECK_PARSE("---\n"
10468 "Language: JavaScript\n"
10469 "IndentWidth: 12\n"
10470 "---\n"
10471 "Language: Cpp\n"
10472 "IndentWidth: 34\n"
10473 "...\n",
10474 IndentWidth, 12u);
10475
10476 Style.Language = FormatStyle::LK_Cpp;
10477 CHECK_PARSE("---\n"
10478 "Language: JavaScript\n"
10479 "IndentWidth: 12\n"
10480 "---\n"
10481 "Language: Cpp\n"
10482 "IndentWidth: 34\n"
10483 "...\n",
10484 IndentWidth, 34u);
10485 CHECK_PARSE("---\n"
10486 "IndentWidth: 78\n"
10487 "---\n"
10488 "Language: JavaScript\n"
10489 "IndentWidth: 56\n"
10490 "...\n",
10491 IndentWidth, 78u);
10492
10493 Style.ColumnLimit = 123;
10494 Style.IndentWidth = 234;
10495 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10496 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010497 EXPECT_FALSE(parseConfiguration("---\n"
10498 "IndentWidth: 456\n"
10499 "BreakBeforeBraces: Allman\n"
10500 "---\n"
10501 "Language: JavaScript\n"
10502 "IndentWidth: 111\n"
10503 "TabWidth: 111\n"
10504 "---\n"
10505 "Language: Cpp\n"
10506 "BreakBeforeBraces: Stroustrup\n"
10507 "TabWidth: 789\n"
10508 "...\n",
10509 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010510 EXPECT_EQ(123u, Style.ColumnLimit);
10511 EXPECT_EQ(456u, Style.IndentWidth);
10512 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10513 EXPECT_EQ(789u, Style.TabWidth);
10514
Rafael Espindola1f243172014-06-12 11:35:17 +000010515 EXPECT_EQ(parseConfiguration("---\n"
10516 "Language: JavaScript\n"
10517 "IndentWidth: 56\n"
10518 "---\n"
10519 "IndentWidth: 78\n"
10520 "...\n",
10521 &Style),
10522 ParseError::Error);
10523 EXPECT_EQ(parseConfiguration("---\n"
10524 "Language: JavaScript\n"
10525 "IndentWidth: 56\n"
10526 "---\n"
10527 "Language: JavaScript\n"
10528 "IndentWidth: 78\n"
10529 "...\n",
10530 &Style),
10531 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010532
10533 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10534}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010535
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010536#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010537
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010538TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10539 FormatStyle Style = {};
10540 Style.Language = FormatStyle::LK_JavaScript;
10541 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010542 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010543 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010544
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010545 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010546 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010547 "BasedOnStyle: Google\n"
10548 "---\n"
10549 "Language: JavaScript\n"
10550 "IndentWidth: 76\n"
10551 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010552 &Style)
10553 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010554 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010555 EXPECT_EQ(76u, Style.IndentWidth);
10556 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10557}
10558
Alexander Kornienkod6538332013-05-07 15:32:14 +000010559TEST_F(FormatTest, ConfigurationRoundTripTest) {
10560 FormatStyle Style = getLLVMStyle();
10561 std::string YAML = configurationAsText(Style);
10562 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010563 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010564 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10565 EXPECT_EQ(Style, ParsedStyle);
10566}
10567
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010568TEST_F(FormatTest, WorksFor8bitEncodings) {
10569 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10570 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10571 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10572 "\"\xef\xee\xf0\xf3...\"",
10573 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10574 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10575 "\xef\xee\xf0\xf3...\"",
10576 getLLVMStyleWithColumns(12)));
10577}
10578
Alexander Kornienko393e3082013-11-13 14:04:17 +000010579TEST_F(FormatTest, HandlesUTF8BOM) {
10580 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10581 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10582 format("\xef\xbb\xbf#include <iostream>"));
10583 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10584 format("\xef\xbb\xbf\n#include <iostream>"));
10585}
10586
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010587// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10588#if !defined(_MSC_VER)
10589
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010590TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10591 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10592 getLLVMStyleWithColumns(35));
10593 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010594 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010595 verifyFormat("// Однажды в студёную зимнюю пору...",
10596 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010597 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010598 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10599 getLLVMStyleWithColumns(39));
10600 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010601 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010602}
10603
10604TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010605 // Non-printable characters' width is currently considered to be the length in
10606 // bytes in UTF8. The characters can be displayed in very different manner
10607 // (zero-width, single width with a substitution glyph, expanded to their code
10608 // (e.g. "<8d>"), so there's no single correct way to handle them.
10609 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010610 "\"\xc2\x8d\";",
10611 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010612 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010613 "\"\xc2\x8d\";",
10614 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010615 EXPECT_EQ("\"Однажды, в \"\n"
10616 "\"студёную \"\n"
10617 "\"зимнюю \"\n"
10618 "\"пору,\"",
10619 format("\"Однажды, в студёную зимнюю пору,\"",
10620 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010621 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010622 "\"一 二 三 \"\n"
10623 "\"四 五六 \"\n"
10624 "\"七 八 九 \"\n"
10625 "\"十\"",
10626 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010627 EXPECT_EQ("\"一\t二 \"\n"
10628 "\"\t三 \"\n"
10629 "\"四 五\t六 \"\n"
10630 "\"\t七 \"\n"
10631 "\"八九十\tqq\"",
10632 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10633 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010634
10635 // UTF8 character in an escape sequence.
10636 EXPECT_EQ("\"aaaaaa\"\n"
10637 "\"\\\xC2\x8D\"",
10638 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010639}
10640
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010641TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10642 EXPECT_EQ("const char *sssss =\n"
10643 " \"一二三四五六七八\\\n"
10644 " 九 十\";",
10645 format("const char *sssss = \"一二三四五六七八\\\n"
10646 " 九 十\";",
10647 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010648}
10649
10650TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010651 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10652 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010653 EXPECT_EQ("// Я из лесу\n"
10654 "// вышел; был\n"
10655 "// сильный\n"
10656 "// мороз.",
10657 format("// Я из лесу вышел; был сильный мороз.",
10658 getLLVMStyleWithColumns(13)));
10659 EXPECT_EQ("// 一二三\n"
10660 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010661 "// 八 九\n"
10662 "// 十",
10663 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010664}
10665
10666TEST_F(FormatTest, SplitsUTF8BlockComments) {
10667 EXPECT_EQ("/* Гляжу,\n"
10668 " * поднимается\n"
10669 " * медленно в\n"
10670 " * гору\n"
10671 " * Лошадка,\n"
10672 " * везущая\n"
10673 " * хворосту\n"
10674 " * воз. */",
10675 format("/* Гляжу, поднимается медленно в гору\n"
10676 " * Лошадка, везущая хворосту воз. */",
10677 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010678 EXPECT_EQ(
10679 "/* 一二三\n"
10680 " * 四五六七\n"
10681 " * 八 九\n"
10682 " * 十 */",
10683 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010684 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10685 " * 𝕓𝕪𝕥𝕖\n"
10686 " * 𝖀𝕿𝕱-𝟠 */",
10687 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010688}
10689
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010690#endif // _MSC_VER
10691
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010692TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10693 FormatStyle Style = getLLVMStyle();
10694
10695 Style.ConstructorInitializerIndentWidth = 4;
10696 verifyFormat(
10697 "SomeClass::Constructor()\n"
10698 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10699 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10700 Style);
10701
10702 Style.ConstructorInitializerIndentWidth = 2;
10703 verifyFormat(
10704 "SomeClass::Constructor()\n"
10705 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10706 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10707 Style);
10708
10709 Style.ConstructorInitializerIndentWidth = 0;
10710 verifyFormat(
10711 "SomeClass::Constructor()\n"
10712 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10713 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10714 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010715 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10716 verifyFormat(
10717 "SomeLongTemplateVariableName<\n"
10718 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10719 Style);
10720 verifyFormat(
10721 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10722 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10723 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010724}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010725
Daniel Jasper00853002014-09-16 16:22:30 +000010726TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10727 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010728 Style.BreakConstructorInitializersBeforeComma = true;
10729 Style.ConstructorInitializerIndentWidth = 4;
10730 verifyFormat("SomeClass::Constructor()\n"
10731 " : a(a)\n"
10732 " , b(b)\n"
10733 " , c(c) {}",
10734 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010735 verifyFormat("SomeClass::Constructor()\n"
10736 " : a(a) {}",
10737 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010738
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010739 Style.ColumnLimit = 0;
10740 verifyFormat("SomeClass::Constructor()\n"
10741 " : a(a) {}",
10742 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010743 verifyFormat("SomeClass::Constructor() noexcept\n"
10744 " : a(a) {}",
10745 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010746 verifyFormat("SomeClass::Constructor()\n"
10747 " : a(a)\n"
10748 " , b(b)\n"
10749 " , c(c) {}",
10750 Style);
10751 verifyFormat("SomeClass::Constructor()\n"
10752 " : a(a) {\n"
10753 " foo();\n"
10754 " bar();\n"
10755 "}",
10756 Style);
10757
Daniel Jasperd74cf402014-04-08 12:46:38 +000010758 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010759 verifyFormat("SomeClass::Constructor()\n"
10760 " : a(a)\n"
10761 " , b(b)\n"
10762 " , c(c) {\n}",
10763 Style);
10764 verifyFormat("SomeClass::Constructor()\n"
10765 " : a(a) {\n}",
10766 Style);
10767
10768 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010769 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010770 Style.ConstructorInitializerIndentWidth = 2;
10771 verifyFormat("SomeClass::Constructor()\n"
10772 " : a(a)\n"
10773 " , b(b)\n"
10774 " , c(c) {}",
10775 Style);
10776
10777 Style.ConstructorInitializerIndentWidth = 0;
10778 verifyFormat("SomeClass::Constructor()\n"
10779 ": a(a)\n"
10780 ", b(b)\n"
10781 ", c(c) {}",
10782 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010783
10784 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10785 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010786 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10787 verifyFormat(
10788 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10789 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010790 verifyFormat(
10791 "SomeClass::Constructor()\n"
10792 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10793 Style);
10794 Style.ConstructorInitializerIndentWidth = 4;
10795 Style.ColumnLimit = 60;
10796 verifyFormat("SomeClass::Constructor()\n"
10797 " : aaaaaaaa(aaaaaaaa)\n"
10798 " , aaaaaaaa(aaaaaaaa)\n"
10799 " , aaaaaaaa(aaaaaaaa) {}",
10800 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010801}
10802
Daniel Jasper38efc132014-10-21 07:51:54 +000010803TEST_F(FormatTest, Destructors) {
10804 verifyFormat("void F(int &i) { i.~int(); }");
10805 verifyFormat("void F(int &i) { i->~int(); }");
10806}
10807
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010808TEST_F(FormatTest, FormatsWithWebKitStyle) {
10809 FormatStyle Style = getWebKitStyle();
10810
10811 // Don't indent in outer namespaces.
10812 verifyFormat("namespace outer {\n"
10813 "int i;\n"
10814 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010815 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010816 "} // namespace inner\n"
10817 "} // namespace outer\n"
10818 "namespace other_outer {\n"
10819 "int i;\n"
10820 "}",
10821 Style);
10822
10823 // Don't indent case labels.
10824 verifyFormat("switch (variable) {\n"
10825 "case 1:\n"
10826 "case 2:\n"
10827 " doSomething();\n"
10828 " break;\n"
10829 "default:\n"
10830 " ++variable;\n"
10831 "}",
10832 Style);
10833
10834 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010835 EXPECT_EQ("void f()\n"
10836 "{\n"
10837 " if (aaaaaaaaaaaaaaaa\n"
10838 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10839 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10840 " return;\n"
10841 "}",
10842 format("void f() {\n"
10843 "if (aaaaaaaaaaaaaaaa\n"
10844 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10845 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10846 "return;\n"
10847 "}",
10848 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010849
Daniel Jasper35995672014-04-29 14:05:20 +000010850 // Allow functions on a single line.
10851 verifyFormat("void f() { return; }", Style);
10852
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010853 // Constructor initializers are formatted one per line with the "," on the
10854 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010855 verifyFormat("Constructor()\n"
10856 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10857 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010858 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010859 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10860 "{\n"
10861 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010862 Style);
10863 verifyFormat("SomeClass::Constructor()\n"
10864 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010865 "{\n"
10866 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010867 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010868 EXPECT_EQ("SomeClass::Constructor()\n"
10869 " : a(a)\n"
10870 "{\n"
10871 "}",
10872 format("SomeClass::Constructor():a(a){}", Style));
10873 verifyFormat("SomeClass::Constructor()\n"
10874 " : a(a)\n"
10875 " , b(b)\n"
10876 " , c(c)\n"
10877 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010878 "}",
10879 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010880 verifyFormat("SomeClass::Constructor()\n"
10881 " : a(a)\n"
10882 "{\n"
10883 " foo();\n"
10884 " bar();\n"
10885 "}",
10886 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010887
Daniel Jasper65ee3472013-07-31 23:16:02 +000010888 // Access specifiers should be aligned left.
10889 verifyFormat("class C {\n"
10890 "public:\n"
10891 " int i;\n"
10892 "};",
10893 Style);
10894
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010895 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010896 verifyFormat("int a; // Do not\n"
10897 "double b; // align comments.",
10898 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010899
Daniel Jasper3219e432014-12-02 13:24:51 +000010900 // Do not align operands.
10901 EXPECT_EQ("ASSERT(aaaa\n"
10902 " || bbbb);",
10903 format("ASSERT ( aaaa\n||bbbb);", Style));
10904
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010905 // Accept input's line breaks.
10906 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10907 " || bbbbbbbbbbbbbbb) {\n"
10908 " i++;\n"
10909 "}",
10910 format("if (aaaaaaaaaaaaaaa\n"
10911 "|| bbbbbbbbbbbbbbb) { i++; }",
10912 Style));
10913 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10914 " i++;\n"
10915 "}",
10916 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010917
10918 // Don't automatically break all macro definitions (llvm.org/PR17842).
10919 verifyFormat("#define aNumber 10", Style);
10920 // However, generally keep the line breaks that the user authored.
10921 EXPECT_EQ("#define aNumber \\\n"
10922 " 10",
10923 format("#define aNumber \\\n"
10924 " 10",
10925 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010926
10927 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010928 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10929 " copyItems:YES];",
10930 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10931 "copyItems:YES];",
10932 Style));
10933 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10934 " copyItems:YES];",
10935 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10936 " copyItems:YES];",
10937 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010938 // FIXME: This does not seem right, there should be more indentation before
10939 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010940 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010941 " @\"a\",\n"
10942 " @\"a\"\n"
10943 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010944 " copyItems:YES];",
10945 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10946 " @\"a\",\n"
10947 " @\"a\"\n"
10948 " ]\n"
10949 " copyItems:YES];",
10950 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010951 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010952 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10953 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010954 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10955 " copyItems:YES];",
10956 Style));
10957
10958 verifyFormat("[self.a b:c c:d];", Style);
10959 EXPECT_EQ("[self.a b:c\n"
10960 " c:d];",
10961 format("[self.a b:c\n"
10962 "c:d];",
10963 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010964}
10965
Manuel Klimekffdeb592013-09-03 15:10:01 +000010966TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010967 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10968 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10969 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10970 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10971 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010972 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010973 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010974 verifyFormat("void f() {\n"
10975 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10976 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010977 verifyFormat("void f() {\n"
10978 " other(x.begin(), //\n"
10979 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010980 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010981 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010982 verifyFormat("SomeFunction([]() { // A cool function...\n"
10983 " return 43;\n"
10984 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010985 EXPECT_EQ("SomeFunction([]() {\n"
10986 "#define A a\n"
10987 " return 43;\n"
10988 "});",
10989 format("SomeFunction([](){\n"
10990 "#define A a\n"
10991 "return 43;\n"
10992 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010993 verifyFormat("void f() {\n"
10994 " SomeFunction([](decltype(x), A *a) {});\n"
10995 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010996 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10997 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010998 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10999 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11000 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011001 verifyFormat("Constructor()\n"
11002 " : Field([] { // comment\n"
11003 " int i;\n"
11004 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011005 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11006 " return some_parameter.size();\n"
11007 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011008 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11009 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011010 verifyFormat("int i = aaaaaa ? 1 //\n"
11011 " : [] {\n"
11012 " return 2; //\n"
11013 " }();");
11014 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11015 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11016 " return x == 2; // force break\n"
11017 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011018 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
11019 " int iiiiiiiiiiii) {\n"
11020 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
11021 "});",
11022 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011023 verifyFormat("SomeFunction({[&] {\n"
11024 " // comment\n"
11025 " },\n"
11026 " [&] {\n"
11027 " // comment\n"
11028 " }});");
11029 verifyFormat("SomeFunction({[&] {\n"
11030 " // comment\n"
11031 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011032 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11033 " [&]() { return true; },\n"
11034 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011035
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011036 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011037 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011038 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011039 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11040 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011041 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011042 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011043 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11044 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011045 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011046 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11047 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011048 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011049 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011050 verifyFormat(
11051 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11052 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11053 " return aaaaaaaaaaaaaaaaa;\n"
11054 " });",
11055 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011056 verifyFormat("[]() //\n"
11057 " -> int {\n"
11058 " return 1; //\n"
11059 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011060
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011061 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011062 verifyFormat("SomeFunction(\n"
11063 " []() {\n"
11064 " int i = 42;\n"
11065 " return i;\n"
11066 " },\n"
11067 " []() {\n"
11068 " int j = 43;\n"
11069 " return j;\n"
11070 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011071
Daniel Jasperda18fd82014-06-10 06:39:03 +000011072 // More complex introducers.
11073 verifyFormat("return [i, args...] {};");
11074
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011075 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011076 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011077 verifyFormat("double &operator[](int i) { return 0; }\n"
11078 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011079 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011080 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011081 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011082
11083 // Other corner cases.
11084 verifyFormat("void f() {\n"
11085 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
11086 " );\n"
11087 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011088
11089 // Lambdas created through weird macros.
11090 verifyFormat("void f() {\n"
11091 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011092 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011093 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011094
11095 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11096 " doo_dah();\n"
11097 " doo_dah();\n"
11098 " })) {\n"
11099 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011100 verifyFormat("auto lambda = []() {\n"
11101 " int a = 2\n"
11102 "#if A\n"
11103 " + 2\n"
11104 "#endif\n"
11105 " ;\n"
11106 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011107}
11108
Manuel Klimek516e0542013-09-04 13:25:30 +000011109TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011110 FormatStyle ShortBlocks = getLLVMStyle();
11111 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11112 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11113 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11114 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11115 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11116 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11117 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011118
Daniel Jasper76284682014-10-22 09:12:44 +000011119 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11120 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11121 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011122
Daniel Jasper76284682014-10-22 09:12:44 +000011123 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011124 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011125 "}];");
11126 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011127 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011128 "}]};");
11129 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011130 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011131 "}];");
11132 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011133 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011134 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011135 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011136 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011137 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011138 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011139 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011140
11141 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011142 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011143 "}];",
11144 getLLVMStyleWithColumns(60));
11145 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011146 " NSString *path = [self sessionFilePath];\n"
11147 " if (path) {\n"
11148 " // ...\n"
11149 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011150 "});");
11151 verifyFormat("[[SessionService sharedService]\n"
11152 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011153 " if (window) {\n"
11154 " [self windowDidLoad:window];\n"
11155 " } else {\n"
11156 " [self errorLoadingWindow];\n"
11157 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011158 " }];");
11159 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011160 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011161 "};\n",
11162 getLLVMStyleWithColumns(40));
11163 verifyFormat("[[SessionService sharedService]\n"
11164 " loadWindowWithCompletionBlock: //\n"
11165 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011166 " if (window) {\n"
11167 " [self windowDidLoad:window];\n"
11168 " } else {\n"
11169 " [self errorLoadingWindow];\n"
11170 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011171 " }];",
11172 getLLVMStyleWithColumns(60));
11173 verifyFormat("[myObject doSomethingWith:arg1\n"
11174 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011175 " // ...\n"
11176 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011177 " }\n"
11178 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011179 " // ...\n"
11180 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011181 " }\n"
11182 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011183 " // ...\n"
11184 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011185 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011186 verifyFormat("[myObject doSomethingWith:arg1\n"
11187 " firstBlock:-1\n"
11188 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011189 " // ...\n"
11190 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011191 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011192
11193 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011194 " @autoreleasepool {\n"
11195 " if (a) {\n"
11196 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011197 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011198 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011199 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011200 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011201 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11202 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011203
11204 FormatStyle FourIndent = getLLVMStyle();
11205 FourIndent.ObjCBlockIndentWidth = 4;
11206 verifyFormat("[operation setCompletionBlock:^{\n"
11207 " [self onOperationDone];\n"
11208 "}];",
11209 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011210}
11211
Daniel Jasper289afc02015-04-23 09:23:17 +000011212TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11213 FormatStyle ZeroColumn = getLLVMStyle();
11214 ZeroColumn.ColumnLimit = 0;
11215
11216 verifyFormat("[[SessionService sharedService] "
11217 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11218 " if (window) {\n"
11219 " [self windowDidLoad:window];\n"
11220 " } else {\n"
11221 " [self errorLoadingWindow];\n"
11222 " }\n"
11223 "}];",
11224 ZeroColumn);
11225 EXPECT_EQ("[[SessionService sharedService]\n"
11226 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11227 " if (window) {\n"
11228 " [self windowDidLoad:window];\n"
11229 " } else {\n"
11230 " [self errorLoadingWindow];\n"
11231 " }\n"
11232 " }];",
11233 format("[[SessionService sharedService]\n"
11234 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11235 " if (window) {\n"
11236 " [self windowDidLoad:window];\n"
11237 " } else {\n"
11238 " [self errorLoadingWindow];\n"
11239 " }\n"
11240 "}];",
11241 ZeroColumn));
11242 verifyFormat("[myObject doSomethingWith:arg1\n"
11243 " firstBlock:^(Foo *a) {\n"
11244 " // ...\n"
11245 " int i;\n"
11246 " }\n"
11247 " secondBlock:^(Bar *b) {\n"
11248 " // ...\n"
11249 " int i;\n"
11250 " }\n"
11251 " thirdBlock:^Foo(Bar *b) {\n"
11252 " // ...\n"
11253 " int i;\n"
11254 " }];",
11255 ZeroColumn);
11256 verifyFormat("f(^{\n"
11257 " @autoreleasepool {\n"
11258 " if (a) {\n"
11259 " g();\n"
11260 " }\n"
11261 " }\n"
11262 "});",
11263 ZeroColumn);
11264 verifyFormat("void (^largeBlock)(void) = ^{\n"
11265 " // ...\n"
11266 "};",
11267 ZeroColumn);
11268
11269 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11270 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011271 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011272 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11273 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11274 " int i;\n"
11275 "};",
11276 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11277}
11278
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011279TEST_F(FormatTest, SupportsCRLF) {
11280 EXPECT_EQ("int a;\r\n"
11281 "int b;\r\n"
11282 "int c;\r\n",
11283 format("int a;\r\n"
11284 " int b;\r\n"
11285 " int c;\r\n",
11286 getLLVMStyle()));
11287 EXPECT_EQ("int a;\r\n"
11288 "int b;\r\n"
11289 "int c;\r\n",
11290 format("int a;\r\n"
11291 " int b;\n"
11292 " int c;\r\n",
11293 getLLVMStyle()));
11294 EXPECT_EQ("int a;\n"
11295 "int b;\n"
11296 "int c;\n",
11297 format("int a;\r\n"
11298 " int b;\n"
11299 " int c;\n",
11300 getLLVMStyle()));
11301 EXPECT_EQ("\"aaaaaaa \"\r\n"
11302 "\"bbbbbbb\";\r\n",
11303 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11304 EXPECT_EQ("#define A \\\r\n"
11305 " b; \\\r\n"
11306 " c; \\\r\n"
11307 " d;\r\n",
11308 format("#define A \\\r\n"
11309 " b; \\\r\n"
11310 " c; d; \r\n",
11311 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011312
11313 EXPECT_EQ("/*\r\n"
11314 "multi line block comments\r\n"
11315 "should not introduce\r\n"
11316 "an extra carriage return\r\n"
11317 "*/\r\n",
11318 format("/*\r\n"
11319 "multi line block comments\r\n"
11320 "should not introduce\r\n"
11321 "an extra carriage return\r\n"
11322 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011323}
11324
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011325TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11326 verifyFormat("MY_CLASS(C) {\n"
11327 " int i;\n"
11328 " int j;\n"
11329 "};");
11330}
11331
Daniel Jasper6633ab82013-10-18 10:38:14 +000011332TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11333 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11334 TwoIndent.ContinuationIndentWidth = 2;
11335
11336 EXPECT_EQ("int i =\n"
11337 " longFunction(\n"
11338 " arg);",
11339 format("int i = longFunction(arg);", TwoIndent));
11340
11341 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11342 SixIndent.ContinuationIndentWidth = 6;
11343
11344 EXPECT_EQ("int i =\n"
11345 " longFunction(\n"
11346 " arg);",
11347 format("int i = longFunction(arg);", SixIndent));
11348}
11349
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011350TEST_F(FormatTest, SpacesInAngles) {
11351 FormatStyle Spaces = getLLVMStyle();
11352 Spaces.SpacesInAngles = true;
11353
11354 verifyFormat("static_cast< int >(arg);", Spaces);
11355 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11356 verifyFormat("f< int, float >();", Spaces);
11357 verifyFormat("template <> g() {}", Spaces);
11358 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011359 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11360 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11361 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011362
11363 Spaces.Standard = FormatStyle::LS_Cpp03;
11364 Spaces.SpacesInAngles = true;
11365 verifyFormat("A< A< int > >();", Spaces);
11366
11367 Spaces.SpacesInAngles = false;
11368 verifyFormat("A<A<int> >();", Spaces);
11369
11370 Spaces.Standard = FormatStyle::LS_Cpp11;
11371 Spaces.SpacesInAngles = true;
11372 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011373
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011374 Spaces.SpacesInAngles = false;
11375 verifyFormat("A<A<int>>();", Spaces);
11376}
11377
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011378TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11379 FormatStyle Style = getLLVMStyle();
11380 Style.SpaceAfterTemplateKeyword = false;
11381 verifyFormat("template<int> void foo();", Style);
11382}
11383
Jacques Pienaarfc275112015-02-18 23:48:37 +000011384TEST_F(FormatTest, TripleAngleBrackets) {
11385 verifyFormat("f<<<1, 1>>>();");
11386 verifyFormat("f<<<1, 1, 1, s>>>();");
11387 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011388 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011389 verifyFormat("f<param><<<1, 1>>>();");
11390 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011391 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011392 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11393 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011394 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11395 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011396}
11397
11398TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011399 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011400 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011401 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11402 "aaallvm::outs() <<");
11403 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11404 "aaaallvm::outs()\n <<");
11405}
11406
Manuel Klimek819788d2014-03-18 11:22:45 +000011407TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11408 std::string code = "#if A\n"
11409 "#if B\n"
11410 "a.\n"
11411 "#endif\n"
11412 " a = 1;\n"
11413 "#else\n"
11414 "#endif\n"
11415 "#if C\n"
11416 "#else\n"
11417 "#endif\n";
11418 EXPECT_EQ(code, format(code));
11419}
11420
Manuel Klimek68b03042014-04-14 09:14:11 +000011421TEST_F(FormatTest, HandleConflictMarkers) {
11422 // Git/SVN conflict markers.
11423 EXPECT_EQ("int a;\n"
11424 "void f() {\n"
11425 " callme(some(parameter1,\n"
11426 "<<<<<<< text by the vcs\n"
11427 " parameter2),\n"
11428 "||||||| text by the vcs\n"
11429 " parameter2),\n"
11430 " parameter3,\n"
11431 "======= text by the vcs\n"
11432 " parameter2, parameter3),\n"
11433 ">>>>>>> text by the vcs\n"
11434 " otherparameter);\n",
11435 format("int a;\n"
11436 "void f() {\n"
11437 " callme(some(parameter1,\n"
11438 "<<<<<<< text by the vcs\n"
11439 " parameter2),\n"
11440 "||||||| text by the vcs\n"
11441 " parameter2),\n"
11442 " parameter3,\n"
11443 "======= text by the vcs\n"
11444 " parameter2,\n"
11445 " parameter3),\n"
11446 ">>>>>>> text by the vcs\n"
11447 " otherparameter);\n"));
11448
11449 // Perforce markers.
11450 EXPECT_EQ("void f() {\n"
11451 " function(\n"
11452 ">>>> text by the vcs\n"
11453 " parameter,\n"
11454 "==== text by the vcs\n"
11455 " parameter,\n"
11456 "==== text by the vcs\n"
11457 " parameter,\n"
11458 "<<<< text by the vcs\n"
11459 " parameter);\n",
11460 format("void f() {\n"
11461 " function(\n"
11462 ">>>> text by the vcs\n"
11463 " parameter,\n"
11464 "==== text by the vcs\n"
11465 " parameter,\n"
11466 "==== text by the vcs\n"
11467 " parameter,\n"
11468 "<<<< text by the vcs\n"
11469 " parameter);\n"));
11470
11471 EXPECT_EQ("<<<<<<<\n"
11472 "|||||||\n"
11473 "=======\n"
11474 ">>>>>>>",
11475 format("<<<<<<<\n"
11476 "|||||||\n"
11477 "=======\n"
11478 ">>>>>>>"));
11479
11480 EXPECT_EQ("<<<<<<<\n"
11481 "|||||||\n"
11482 "int i;\n"
11483 "=======\n"
11484 ">>>>>>>",
11485 format("<<<<<<<\n"
11486 "|||||||\n"
11487 "int i;\n"
11488 "=======\n"
11489 ">>>>>>>"));
11490
11491 // FIXME: Handle parsing of macros around conflict markers correctly:
11492 EXPECT_EQ("#define Macro \\\n"
11493 "<<<<<<<\n"
11494 "Something \\\n"
11495 "|||||||\n"
11496 "Else \\\n"
11497 "=======\n"
11498 "Other \\\n"
11499 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011500 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011501 format("#define Macro \\\n"
11502 "<<<<<<<\n"
11503 " Something \\\n"
11504 "|||||||\n"
11505 " Else \\\n"
11506 "=======\n"
11507 " Other \\\n"
11508 ">>>>>>>\n"
11509 " End\n"
11510 "int i;\n"));
11511}
11512
Daniel Jasper471894432014-08-06 13:40:26 +000011513TEST_F(FormatTest, DisableRegions) {
11514 EXPECT_EQ("int i;\n"
11515 "// clang-format off\n"
11516 " int j;\n"
11517 "// clang-format on\n"
11518 "int k;",
11519 format(" int i;\n"
11520 " // clang-format off\n"
11521 " int j;\n"
11522 " // clang-format on\n"
11523 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011524 EXPECT_EQ("int i;\n"
11525 "/* clang-format off */\n"
11526 " int j;\n"
11527 "/* clang-format on */\n"
11528 "int k;",
11529 format(" int i;\n"
11530 " /* clang-format off */\n"
11531 " int j;\n"
11532 " /* clang-format on */\n"
11533 " int k;"));
Daniel Jasper471894432014-08-06 13:40:26 +000011534}
11535
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011536TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11537 format("? ) =");
11538 verifyNoCrash("#define a\\\n /**/}");
11539}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011540
Daniel Jasper498f5582015-12-25 08:53:31 +000011541TEST_F(FormatTest, FormatsTableGenCode) {
11542 FormatStyle Style = getLLVMStyle();
11543 Style.Language = FormatStyle::LK_TableGen;
11544 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11545}
11546
Nico Weberb2673a12016-11-10 21:49:25 +000011547TEST_F(FormatTest, ArrayOfTemplates) {
11548 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11549 format("auto a = new unique_ptr<int > [ 10];"));
11550
11551 FormatStyle Spaces = getLLVMStyle();
11552 Spaces.SpacesInSquareBrackets = true;
11553 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11554 format("auto a = new unique_ptr<int > [10];", Spaces));
11555}
11556
11557TEST_F(FormatTest, ArrayAsTemplateType) {
11558 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11559 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11560
11561 FormatStyle Spaces = getLLVMStyle();
11562 Spaces.SpacesInSquareBrackets = true;
11563 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11564 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11565}
11566
Eric Liu547d8792016-03-24 13:22:42 +000011567// Since this test case uses UNIX-style file path. We disable it for MS
11568// compiler.
Eric Liuc13ca6a2016-03-24 14:59:39 +000011569#if !defined(_MSC_VER) && !defined(__MINGW32__)
Eric Liu547d8792016-03-24 13:22:42 +000011570
11571TEST(FormatStyle, GetStyleOfFile) {
11572 vfs::InMemoryFileSystem FS;
11573 // Test 1: format file in the same directory.
11574 ASSERT_TRUE(
11575 FS.addFile("/a/.clang-format", 0,
11576 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11577 ASSERT_TRUE(
11578 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11579 auto Style1 = getStyle("file", "/a/.clang-format", "Google", &FS);
11580 ASSERT_EQ(Style1, getLLVMStyle());
11581
11582 // Test 2: fallback to default.
11583 ASSERT_TRUE(
11584 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11585 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", &FS);
11586 ASSERT_EQ(Style2, getMozillaStyle());
11587
11588 // Test 3: format file in parent directory.
11589 ASSERT_TRUE(
11590 FS.addFile("/c/.clang-format", 0,
11591 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11592 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11593 llvm::MemoryBuffer::getMemBuffer("int i;")));
11594 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", &FS);
11595 ASSERT_EQ(Style3, getGoogleStyle());
11596}
11597
11598#endif // _MSC_VER
11599
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011600TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11601 // Column limit is 20.
11602 std::string Code = "Type *a =\n"
11603 " new Type();\n"
11604 "g(iiiii, 0, jjjjj,\n"
11605 " 0, kkkkk, 0, mm);\n"
11606 "int bad = format ;";
11607 std::string Expected = "auto a = new Type();\n"
11608 "g(iiiii, nullptr,\n"
11609 " jjjjj, nullptr,\n"
11610 " kkkkk, nullptr,\n"
11611 " mm);\n"
11612 "int bad = format ;";
11613 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011614 tooling::Replacements Replaces = toReplacements(
11615 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11616 "auto "),
11617 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11618 "nullptr"),
11619 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11620 "nullptr"),
11621 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11622 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011623
11624 format::FormatStyle Style = format::getLLVMStyle();
11625 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011626 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11627 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11628 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11629 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11630 EXPECT_TRUE(static_cast<bool>(Result));
11631 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011632}
11633
Eric Liubaf58c22016-05-18 13:43:48 +000011634TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11635 std::string Code = "#include \"a.h\"\n"
11636 "#include \"c.h\"\n"
11637 "\n"
11638 "int main() {\n"
11639 " return 0;\n"
11640 "}";
11641 std::string Expected = "#include \"a.h\"\n"
11642 "#include \"b.h\"\n"
11643 "#include \"c.h\"\n"
11644 "\n"
11645 "int main() {\n"
11646 " return 0;\n"
11647 "}";
11648 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011649 tooling::Replacements Replaces = toReplacements(
11650 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11651 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011652
11653 format::FormatStyle Style = format::getLLVMStyle();
11654 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011655 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11656 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11657 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11658 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11659 EXPECT_TRUE(static_cast<bool>(Result));
11660 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011661}
11662
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011663TEST_F(FormatTest, AllignTrailingComments) {
11664 EXPECT_EQ("#define MACRO(V) \\\n"
11665 " V(Rt2) /* one more char */ \\\n"
11666 " V(Rs) /* than here */ \\\n"
11667 "/* comment 3 */\n",
11668 format("#define MACRO(V)\\\n"
11669 "V(Rt2) /* one more char */ \\\n"
11670 "V(Rs) /* than here */ \\\n"
11671 "/* comment 3 */ \\\n",
11672 getLLVMStyleWithColumns(40)));
11673}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011674} // end namespace
11675} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011676} // end namespace clang