blob: e851bb2a5f5ed8d14845bc7232edc65f6cee7a2d [file] [log] [blame]
Daniel Jasperf7935112012-12-03 18:12:45 +00001//===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Chandler Carruth320d9662012-12-04 09:45:34 +000010#include "clang/Format/Format.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011
Eric Liu40ef2fb2016-08-01 10:16:37 +000012#include "../Tooling/ReplacementTest.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000013#include "FormatTestUtils.h"
14
15#include "clang/Frontend/TextDiagnosticPrinter.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000016#include "llvm/Support/Debug.h"
Eric Liu547d8792016-03-24 13:22:42 +000017#include "llvm/Support/MemoryBuffer.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000018#include "gtest/gtest.h"
Manuel Klimek24998102013-01-16 14:55:28 +000019
Chandler Carruth10346662014-04-22 03:17:02 +000020#define DEBUG_TYPE "format-test"
21
Eric Liu40ef2fb2016-08-01 10:16:37 +000022using clang::tooling::ReplacementTest;
23using clang::tooling::toReplacements;
24
Daniel Jasperf7935112012-12-03 18:12:45 +000025namespace clang {
26namespace format {
Daniel Jasperd246a5a2015-06-15 15:25:11 +000027namespace {
Daniel Jasperf7935112012-12-03 18:12:45 +000028
Daniel Jaspera44991332015-04-29 13:06:49 +000029FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
Nico Weber514ecc82014-02-02 20:50:45 +000030
Daniel Jasperf7935112012-12-03 18:12:45 +000031class FormatTest : public ::testing::Test {
32protected:
Manuel Klimekec5c3db2015-05-07 12:26:30 +000033 enum IncompleteCheck {
34 IC_ExpectComplete,
35 IC_ExpectIncomplete,
36 IC_DoNotCheck
37 };
38
Daniel Jasperd246a5a2015-06-15 15:25:11 +000039 std::string format(llvm::StringRef Code,
40 const FormatStyle &Style = getLLVMStyle(),
Manuel Klimekec5c3db2015-05-07 12:26:30 +000041 IncompleteCheck CheckIncomplete = IC_ExpectComplete) {
Manuel Klimek24998102013-01-16 14:55:28 +000042 DEBUG(llvm::errs() << "---\n");
Manuel Klimek71814b42013-10-11 21:25:45 +000043 DEBUG(llvm::errs() << Code << "\n\n");
Daniel Jasperd246a5a2015-06-15 15:25:11 +000044 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
Manuel Klimekec5c3db2015-05-07 12:26:30 +000045 bool IncompleteFormat = false;
46 tooling::Replacements Replaces =
47 reformat(Style, Code, Ranges, "<stdin>", &IncompleteFormat);
48 if (CheckIncomplete != IC_DoNotCheck) {
49 bool ExpectedIncompleteFormat = CheckIncomplete == IC_ExpectIncomplete;
50 EXPECT_EQ(ExpectedIncompleteFormat, IncompleteFormat) << Code << "\n\n";
51 }
Daniel Jasperec04c0d2013-05-16 10:40:07 +000052 ReplacementCount = Replaces.size();
Eric Liu4f8d9942016-07-11 13:53:12 +000053 auto Result = applyAllReplacements(Code, Replaces);
54 EXPECT_TRUE(static_cast<bool>(Result));
55 DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
56 return *Result;
Daniel Jasperf7935112012-12-03 18:12:45 +000057 }
58
Manuel Klimekb69e3c62013-01-02 18:33:23 +000059 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
60 FormatStyle Style = getLLVMStyle();
61 Style.ColumnLimit = ColumnLimit;
62 return Style;
63 }
64
Daniel Jasper1b750ed2013-01-14 16:24:39 +000065 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
66 FormatStyle Style = getGoogleStyle();
67 Style.ColumnLimit = ColumnLimit;
68 return Style;
69 }
70
Manuel Klimekb69e3c62013-01-02 18:33:23 +000071 void verifyFormat(llvm::StringRef Code,
72 const FormatStyle &Style = getLLVMStyle()) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000073 EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
Daniel Jasperf7935112012-12-03 18:12:45 +000074 }
75
Manuel Klimekec5c3db2015-05-07 12:26:30 +000076 void verifyIncompleteFormat(llvm::StringRef Code,
77 const FormatStyle &Style = getLLVMStyle()) {
78 EXPECT_EQ(Code.str(),
79 format(test::messUp(Code), Style, IC_ExpectIncomplete));
80 }
81
Daniel Jasperf7935112012-12-03 18:12:45 +000082 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000083 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +000084 }
Daniel Jasper5b49f472013-01-23 12:10:53 +000085
86 void verifyIndependentOfContext(llvm::StringRef text) {
87 verifyFormat(text);
88 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
89 }
Daniel Jasper7b038a22013-01-30 09:46:12 +000090
Daniel Jasper675b4f82015-01-19 10:51:23 +000091 /// \brief Verify that clang-format does not crash on the given input.
92 void verifyNoCrash(llvm::StringRef Code,
93 const FormatStyle &Style = getLLVMStyle()) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +000094 format(Code, Style, IC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +000095 }
96
Daniel Jasper7b038a22013-01-30 09:46:12 +000097 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +000098};
99
Manuel Klimek52b15152013-01-09 15:25:02 +0000100TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000101 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
102 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
103 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
104 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
105 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000106}
107
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000108//===----------------------------------------------------------------------===//
109// Basic function tests.
110//===----------------------------------------------------------------------===//
111
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000112TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000113 EXPECT_EQ(";", format(";"));
114}
115
116TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
117 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000118 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000119 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
120 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
121}
122
123TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
124 EXPECT_EQ("int i;", format("int\ni;"));
125}
126
127TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000128 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000129}
130
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000131TEST_F(FormatTest, FormatsNestedCall) {
132 verifyFormat("Method(f1, f2(f3));");
133 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000134 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000135}
136
Daniel Jasper14556742013-02-07 21:08:36 +0000137TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000138 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000139 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000140 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000141 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000142}
143
Daniel Jasper7b038a22013-01-30 09:46:12 +0000144TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
145 EXPECT_EQ("if (a) {\n"
146 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000147 "}",
148 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000149 EXPECT_EQ(4, ReplacementCount);
150 EXPECT_EQ("if (a) {\n"
151 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000152 "}",
153 format("if (a) {\n"
154 " f();\n"
155 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000156 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000157 EXPECT_EQ("/*\r\n"
158 "\r\n"
159 "*/\r\n",
160 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000161 "\r\n"
162 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000163 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000164}
165
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000166TEST_F(FormatTest, RemovesEmptyLines) {
167 EXPECT_EQ("class C {\n"
168 " int i;\n"
169 "};",
170 format("class C {\n"
171 " int i;\n"
172 "\n"
173 "};"));
174
Nico Weber34272652014-11-13 16:25:37 +0000175 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000176 EXPECT_EQ("namespace N {\n"
177 "\n"
178 "int i;\n"
179 "}",
180 format("namespace N {\n"
181 "\n"
182 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000183 "}",
184 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000185 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
186 "\n"
187 "int i;\n"
188 "}",
189 format("extern /**/ \"C\" /**/ {\n"
190 "\n"
191 "int i;\n"
192 "}",
193 getGoogleStyle()));
194
195 // ...but do keep inlining and removing empty lines for non-block extern "C"
196 // functions.
197 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
198 EXPECT_EQ("extern \"C\" int f() {\n"
199 " int i = 42;\n"
200 " return i;\n"
201 "}",
202 format("extern \"C\" int f() {\n"
203 "\n"
204 " int i = 42;\n"
205 " return i;\n"
206 "}",
207 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000208
Daniel Jasper11164bd2014-03-21 12:58:53 +0000209 // Remove empty lines at the beginning and end of blocks.
210 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000211 "\n"
212 " if (a) {\n"
213 "\n"
214 " f();\n"
215 " }\n"
216 "}",
217 format("void f() {\n"
218 "\n"
219 " if (a) {\n"
220 "\n"
221 " f();\n"
222 "\n"
223 " }\n"
224 "\n"
225 "}",
226 getLLVMStyle()));
227 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000228 " if (a) {\n"
229 " f();\n"
230 " }\n"
231 "}",
232 format("void f() {\n"
233 "\n"
234 " if (a) {\n"
235 "\n"
236 " f();\n"
237 "\n"
238 " }\n"
239 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000240 "}",
241 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000242
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000243 // Don't remove empty lines in more complex control statements.
244 EXPECT_EQ("void f() {\n"
245 " if (a) {\n"
246 " f();\n"
247 "\n"
248 " } else if (b) {\n"
249 " f();\n"
250 " }\n"
251 "}",
252 format("void f() {\n"
253 " if (a) {\n"
254 " f();\n"
255 "\n"
256 " } else if (b) {\n"
257 " f();\n"
258 "\n"
259 " }\n"
260 "\n"
261 "}"));
262
263 // FIXME: This is slightly inconsistent.
264 EXPECT_EQ("namespace {\n"
265 "int i;\n"
266 "}",
267 format("namespace {\n"
268 "int i;\n"
269 "\n"
270 "}"));
271 EXPECT_EQ("namespace {\n"
272 "int i;\n"
273 "\n"
274 "} // namespace",
275 format("namespace {\n"
276 "int i;\n"
277 "\n"
278 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000279
280 FormatStyle Style = getLLVMStyle();
281 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
282 Style.MaxEmptyLinesToKeep = 2;
283 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
284 Style.BraceWrapping.AfterClass = true;
285 Style.BraceWrapping.AfterFunction = true;
286 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
287
288 EXPECT_EQ("class Foo\n"
289 "{\n"
290 " Foo() {}\n"
291 "\n"
292 " void funk() {}\n"
293 "};",
294 format("class Foo\n"
295 "{\n"
296 " Foo()\n"
297 " {\n"
298 " }\n"
299 "\n"
300 " void funk() {}\n"
301 "};",
302 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000303}
304
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000305TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000306 verifyFormat("x = (a) and (b);");
307 verifyFormat("x = (a) or (b);");
308 verifyFormat("x = (a) bitand (b);");
309 verifyFormat("x = (a) bitor (b);");
310 verifyFormat("x = (a) not_eq (b);");
311 verifyFormat("x = (a) and_eq (b);");
312 verifyFormat("x = (a) or_eq (b);");
313 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000314}
315
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000316//===----------------------------------------------------------------------===//
317// Tests for control statements.
318//===----------------------------------------------------------------------===//
319
Daniel Jaspercdd06622013-05-14 10:31:09 +0000320TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000321 verifyFormat("if (true)\n f();\ng();");
322 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000323 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000324
Daniel Jasper3a685df2013-05-16 12:12:21 +0000325 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000326 AllowsMergedIf.AlignEscapedNewlinesLeft = true;
Daniel Jasperced17f82013-01-16 15:44:34 +0000327 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
328 verifyFormat("if (a)\n"
329 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000330 " f();",
331 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000332 verifyFormat("{\n"
333 " if (a)\n"
334 " label:\n"
335 " f();\n"
336 "}",
337 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000338 verifyFormat("#define A \\\n"
339 " if (a) \\\n"
340 " label: \\\n"
341 " f()",
342 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000343 verifyFormat("if (a)\n"
344 " ;",
345 AllowsMergedIf);
346 verifyFormat("if (a)\n"
347 " if (b) return;",
348 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000349
Daniel Jasper3a685df2013-05-16 12:12:21 +0000350 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000351 " f();\n",
352 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000353 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000354 " f();",
355 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000356 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000357 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000358 "}",
359 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000360 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000361 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000362 "}",
363 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000364
365 AllowsMergedIf.ColumnLimit = 14;
366 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000367 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000368 " return;",
369 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000370
371 AllowsMergedIf.ColumnLimit = 13;
372 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000373}
374
Daniel Jasper3a685df2013-05-16 12:12:21 +0000375TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
376 FormatStyle AllowsMergedLoops = getLLVMStyle();
377 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
378 verifyFormat("while (true) continue;", AllowsMergedLoops);
379 verifyFormat("for (;;) continue;", AllowsMergedLoops);
380 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
381 verifyFormat("while (true)\n"
382 " ;",
383 AllowsMergedLoops);
384 verifyFormat("for (;;)\n"
385 " ;",
386 AllowsMergedLoops);
387 verifyFormat("for (;;)\n"
388 " for (;;) continue;",
389 AllowsMergedLoops);
390 verifyFormat("for (;;) // Can't merge this\n"
391 " continue;",
392 AllowsMergedLoops);
393 verifyFormat("for (;;) /* still don't merge */\n"
394 " continue;",
395 AllowsMergedLoops);
396}
397
Daniel Jasper17605d32014-05-14 09:33:35 +0000398TEST_F(FormatTest, FormatShortBracedStatements) {
399 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
400 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
401
402 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
403 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
404
405 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
406 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
407 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
408 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
409 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
410 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
411 verifyFormat("if (true) { //\n"
412 " f();\n"
413 "}",
414 AllowSimpleBracedStatements);
415 verifyFormat("if (true) {\n"
416 " f();\n"
417 " f();\n"
418 "}",
419 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000420 verifyFormat("if (true) {\n"
421 " f();\n"
422 "} else {\n"
423 " f();\n"
424 "}",
425 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000426
Daniel Jasperbd630732014-05-22 13:25:26 +0000427 verifyFormat("template <int> struct A2 {\n"
428 " struct B {};\n"
429 "};",
430 AllowSimpleBracedStatements);
431
Daniel Jasper17605d32014-05-14 09:33:35 +0000432 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
433 verifyFormat("if (true) {\n"
434 " f();\n"
435 "}",
436 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000437 verifyFormat("if (true) {\n"
438 " f();\n"
439 "} else {\n"
440 " f();\n"
441 "}",
442 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000443
444 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
445 verifyFormat("while (true) {\n"
446 " f();\n"
447 "}",
448 AllowSimpleBracedStatements);
449 verifyFormat("for (;;) {\n"
450 " f();\n"
451 "}",
452 AllowSimpleBracedStatements);
453}
454
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000455TEST_F(FormatTest, ParseIfElse) {
456 verifyFormat("if (true)\n"
457 " if (true)\n"
458 " if (true)\n"
459 " f();\n"
460 " else\n"
461 " g();\n"
462 " else\n"
463 " h();\n"
464 "else\n"
465 " i();");
466 verifyFormat("if (true)\n"
467 " if (true)\n"
468 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000469 " if (true)\n"
470 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000471 " } else {\n"
472 " g();\n"
473 " }\n"
474 " else\n"
475 " h();\n"
476 "else {\n"
477 " i();\n"
478 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000479 verifyFormat("void f() {\n"
480 " if (a) {\n"
481 " } else {\n"
482 " }\n"
483 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000484}
485
486TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000487 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000488 verifyFormat("if (a)\n"
489 " f();\n"
490 "else if (b)\n"
491 " g();\n"
492 "else\n"
493 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000494 verifyFormat("if (a) {\n"
495 " f();\n"
496 "}\n"
497 "// or else ..\n"
498 "else {\n"
499 " g()\n"
500 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000501
502 verifyFormat("if (a) {\n"
503 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
505 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000506 verifyFormat("if (a) {\n"
507 "} else if (\n"
508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
509 "}",
510 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000511}
512
Daniel Jasperf7935112012-12-03 18:12:45 +0000513TEST_F(FormatTest, FormatsForLoop) {
514 verifyFormat(
515 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000516 " ++VeryVeryLongLoopVariable)\n"
517 " ;");
518 verifyFormat("for (;;)\n"
519 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000520 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000521 verifyFormat("for (;;) {\n"
522 " f();\n"
523 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000524 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000525
526 verifyFormat(
527 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
528 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000529 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000530
531 verifyFormat(
532 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000533 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000534 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
535 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000536 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000537 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
538 " I = FD->getDeclsInPrototypeScope().begin(),\n"
539 " E = FD->getDeclsInPrototypeScope().end();\n"
540 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000541 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
542 " I = Container.begin(),\n"
543 " E = Container.end();\n"
544 " I != E; ++I) {\n}",
545 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000546
Daniel Jasper48c62f92013-01-28 17:30:17 +0000547 verifyFormat(
548 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
549 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000550 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000552 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000553 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
554 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
555 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000556 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
557 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
558 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000559 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
560 " aaaaaaaaaa);\n"
561 " iter; ++iter) {\n"
562 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000563 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
564 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
565 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
566 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000567
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000568 FormatStyle NoBinPacking = getLLVMStyle();
569 NoBinPacking.BinPackParameters = false;
570 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
571 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
572 " aaaaaaaaaaaaaaaa,\n"
573 " aaaaaaaaaaaaaaaa,\n"
574 " aaaaaaaaaaaaaaaa);\n"
575 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
576 "}",
577 NoBinPacking);
578 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000579 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
580 " E = UnwrappedLines.end();\n"
581 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000582 " ++I) {\n}",
583 NoBinPacking);
Daniel Jasperf7935112012-12-03 18:12:45 +0000584}
585
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000586TEST_F(FormatTest, RangeBasedForLoops) {
587 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
589 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
590 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000591 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
592 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000593 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
594 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000595}
596
Daniel Jaspere1e43192014-04-01 12:55:11 +0000597TEST_F(FormatTest, ForEachLoops) {
598 verifyFormat("void f() {\n"
599 " foreach (Item *item, itemlist) {}\n"
600 " Q_FOREACH (Item *item, itemlist) {}\n"
601 " BOOST_FOREACH (Item *item, itemlist) {}\n"
602 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
603 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000604
605 // As function-like macros.
606 verifyFormat("#define foreach(x, y)\n"
607 "#define Q_FOREACH(x, y)\n"
608 "#define BOOST_FOREACH(x, y)\n"
609 "#define UNKNOWN_FOREACH(x, y)\n");
610
611 // Not as function-like macros.
612 verifyFormat("#define foreach (x, y)\n"
613 "#define Q_FOREACH (x, y)\n"
614 "#define BOOST_FOREACH (x, y)\n"
615 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000616}
617
Daniel Jasperf7935112012-12-03 18:12:45 +0000618TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000619 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000620 verifyFormat("while (true)\n"
621 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000622 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000623 verifyFormat("while () {\n"
624 " f();\n"
625 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000626}
627
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000628TEST_F(FormatTest, FormatsDoWhile) {
629 verifyFormat("do {\n"
630 " do_something();\n"
631 "} while (something());");
632 verifyFormat("do\n"
633 " do_something();\n"
634 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000635}
636
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000637TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000638 verifyFormat("switch (x) {\n"
639 "case 1:\n"
640 " f();\n"
641 " break;\n"
642 "case kFoo:\n"
643 "case ns::kBar:\n"
644 "case kBaz:\n"
645 " break;\n"
646 "default:\n"
647 " g();\n"
648 " break;\n"
649 "}");
650 verifyFormat("switch (x) {\n"
651 "case 1: {\n"
652 " f();\n"
653 " break;\n"
654 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000655 "case 2: {\n"
656 " break;\n"
657 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000658 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000659 verifyFormat("switch (x) {\n"
660 "case 1: {\n"
661 " f();\n"
662 " {\n"
663 " g();\n"
664 " h();\n"
665 " }\n"
666 " break;\n"
667 "}\n"
668 "}");
669 verifyFormat("switch (x) {\n"
670 "case 1: {\n"
671 " f();\n"
672 " if (foo) {\n"
673 " g();\n"
674 " h();\n"
675 " }\n"
676 " break;\n"
677 "}\n"
678 "}");
679 verifyFormat("switch (x) {\n"
680 "case 1: {\n"
681 " f();\n"
682 " g();\n"
683 "} break;\n"
684 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000685 verifyFormat("switch (test)\n"
686 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000687 verifyFormat("switch (x) {\n"
688 "default: {\n"
689 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000690 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000691 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000692 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000693 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000694 "// if 1, do f()\n"
695 "case 1:\n"
696 " f();\n"
697 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000698 verifyFormat("switch (x) {\n"
699 "case 1:\n"
700 " // Do amazing stuff\n"
701 " {\n"
702 " f();\n"
703 " g();\n"
704 " }\n"
705 " break;\n"
706 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000707 verifyFormat("#define A \\\n"
708 " switch (x) { \\\n"
709 " case a: \\\n"
710 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000711 " }",
712 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000713 verifyFormat("#define OPERATION_CASE(name) \\\n"
714 " case OP_name: \\\n"
715 " return operations::Operation##name\n",
716 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000717 verifyFormat("switch (x) {\n"
718 "case 1:;\n"
719 "default:;\n"
720 " int i;\n"
721 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000722
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000723 verifyGoogleFormat("switch (x) {\n"
724 " case 1:\n"
725 " f();\n"
726 " break;\n"
727 " case kFoo:\n"
728 " case ns::kBar:\n"
729 " case kBaz:\n"
730 " break;\n"
731 " default:\n"
732 " g();\n"
733 " break;\n"
734 "}");
735 verifyGoogleFormat("switch (x) {\n"
736 " case 1: {\n"
737 " f();\n"
738 " break;\n"
739 " }\n"
740 "}");
741 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000742 " ;");
743
744 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
745 " case OP_name: \\\n"
746 " return operations::Operation##name\n");
747 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
748 " // Get the correction operation class.\n"
749 " switch (OpCode) {\n"
750 " CASE(Add);\n"
751 " CASE(Subtract);\n"
752 " default:\n"
753 " return operations::Unknown;\n"
754 " }\n"
755 "#undef OPERATION_CASE\n"
756 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000757 verifyFormat("DEBUG({\n"
758 " switch (x) {\n"
759 " case A:\n"
760 " f();\n"
761 " break;\n"
762 " // On B:\n"
763 " case B:\n"
764 " g();\n"
765 " break;\n"
766 " }\n"
767 "});");
Daniel Jasper031e2402014-04-28 07:48:36 +0000768 verifyFormat("switch (a) {\n"
769 "case (b):\n"
770 " return;\n"
771 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000772
773 verifyFormat("switch (a) {\n"
774 "case some_namespace::\n"
775 " some_constant:\n"
776 " return;\n"
777 "}",
778 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000779}
780
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000781TEST_F(FormatTest, CaseRanges) {
782 verifyFormat("switch (x) {\n"
783 "case 'A' ... 'Z':\n"
784 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000785 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000786 " break;\n"
787 "}");
788}
789
Daniel Jasperb87899b2014-09-10 13:11:45 +0000790TEST_F(FormatTest, ShortCaseLabels) {
791 FormatStyle Style = getLLVMStyle();
792 Style.AllowShortCaseLabelsOnASingleLine = true;
793 verifyFormat("switch (a) {\n"
794 "case 1: x = 1; break;\n"
795 "case 2: return;\n"
796 "case 3:\n"
797 "case 4:\n"
798 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000799 "case 6: // comment\n"
800 " return;\n"
801 "case 7:\n"
802 " // comment\n"
803 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000804 "case 8:\n"
805 " x = 8; // comment\n"
806 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000807 "default: y = 1; break;\n"
808 "}",
809 Style);
810 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +0000811 "#if FOO\n"
812 "case 0: return 0;\n"
813 "#endif\n"
814 "}",
815 Style);
816 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000817 "case 1: {\n"
818 "}\n"
819 "case 2: {\n"
820 " return;\n"
821 "}\n"
822 "case 3: {\n"
823 " x = 1;\n"
824 " return;\n"
825 "}\n"
826 "case 4:\n"
827 " if (x)\n"
828 " return;\n"
829 "}",
830 Style);
831 Style.ColumnLimit = 21;
832 verifyFormat("switch (a) {\n"
833 "case 1: x = 1; break;\n"
834 "case 2: return;\n"
835 "case 3:\n"
836 "case 4:\n"
837 "case 5: return;\n"
838 "default:\n"
839 " y = 1;\n"
840 " break;\n"
841 "}",
842 Style);
843}
844
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000845TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000846 verifyFormat("void f() {\n"
847 " some_code();\n"
848 "test_label:\n"
849 " some_other_code();\n"
850 " {\n"
851 " some_more_code();\n"
852 " another_label:\n"
853 " some_more_code();\n"
854 " }\n"
855 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +0000856 verifyFormat("{\n"
857 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000858 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +0000859 " some_other_code();\n"
860 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000861 verifyFormat("{\n"
862 " some_code();\n"
863 "test_label:;\n"
864 " int i = 0;\n"
865 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000866}
867
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000868//===----------------------------------------------------------------------===//
869// Tests for comments.
870//===----------------------------------------------------------------------===//
871
872TEST_F(FormatTest, UnderstandsSingleLineComments) {
Daniel Jasper55213652013-03-22 10:01:29 +0000873 verifyFormat("//* */");
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000874 verifyFormat("// line 1\n"
875 "// line 2\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000876 "void f() {}\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000877
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000878 verifyFormat("void f() {\n"
879 " // Doesn't do anything\n"
880 "}");
Daniel Jasper185de242013-07-11 13:48:16 +0000881 verifyFormat("SomeObject\n"
882 " // Calling someFunction on SomeObject\n"
883 " .someFunction();");
Daniel Jaspera0407742014-02-11 10:08:11 +0000884 verifyFormat("auto result = SomeObject\n"
885 " // Calling someFunction on SomeObject\n"
886 " .someFunction();");
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000887 verifyFormat("void f(int i, // some comment (probably for i)\n"
888 " int j, // some comment (probably for j)\n"
Daniel Jasper942ee722013-01-13 16:10:20 +0000889 " int k); // some comment (probably for k)");
890 verifyFormat("void f(int i,\n"
891 " // some comment (probably for j)\n"
892 " int j,\n"
893 " // some comment (probably for k)\n"
894 " int k);");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000895
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000896 verifyFormat("int i // This is a fancy variable\n"
897 " = 5; // with nicely aligned comment.");
898
899 verifyFormat("// Leading comment.\n"
900 "int a; // Trailing comment.");
901 verifyFormat("int a; // Trailing comment\n"
902 " // on 2\n"
903 " // or 3 lines.\n"
904 "int b;");
905 verifyFormat("int a; // Trailing comment\n"
906 "\n"
907 "// Leading comment.\n"
908 "int b;");
909 verifyFormat("int a; // Comment.\n"
910 " // More details.\n"
911 "int bbbb; // Another comment.");
912 verifyFormat(
913 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
914 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // comment\n"
915 "int cccccccccccccccccccccccccccccc; // comment\n"
916 "int ddd; // looooooooooooooooooooooooong comment\n"
917 "int aaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
918 "int bbbbbbbbbbbbbbbbbbbbb; // comment\n"
919 "int ccccccccccccccccccc; // comment");
920
Daniel Jasper997b08c2013-01-18 09:19:33 +0000921 verifyFormat("#include \"a\" // comment\n"
922 "#include \"a/b/c\" // comment");
923 verifyFormat("#include <a> // comment\n"
924 "#include <a/b/c> // comment");
Daniel Jasper98857842013-10-30 13:54:53 +0000925 EXPECT_EQ("#include \"a\" // comment\n"
Manuel Klimek5c24cca2013-05-23 10:56:37 +0000926 "#include \"a/b/c\" // comment",
927 format("#include \\\n"
928 " \"a\" // comment\n"
929 "#include \"a/b/c\" // comment"));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000930
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000931 verifyFormat("enum E {\n"
932 " // comment\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000933 " VAL_A, // comment\n"
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000934 " VAL_B\n"
935 "};");
Daniel Jaspere25509f2012-12-17 11:29:41 +0000936
937 verifyFormat(
938 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000939 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment");
Daniel Jasperd8bb2db2013-01-09 09:33:39 +0000940 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
941 " // Comment inside a statement.\n"
942 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper4281c5a2014-10-07 14:45:34 +0000943 verifyFormat("SomeFunction(a,\n"
944 " // comment\n"
945 " b + x);");
946 verifyFormat("SomeFunction(a, a,\n"
947 " // comment\n"
948 " b + x);");
Daniel Jasper38396592013-02-06 15:23:09 +0000949 verifyFormat(
950 "bool aaaaaaaaaaaaa = // comment\n"
951 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
952 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Manuel Klimekc74d2922013-01-07 08:54:53 +0000953
Daniel Jasper525264c2013-02-13 19:25:54 +0000954 verifyFormat("int aaaa; // aaaaa\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000955 "int aa; // aaaaaaa",
956 getLLVMStyleWithColumns(20));
Daniel Jasper525264c2013-02-13 19:25:54 +0000957
Daniel Jasper304a9862013-01-21 22:49:20 +0000958 EXPECT_EQ("void f() { // This does something ..\n"
959 "}\n"
960 "int a; // This is unrelated",
961 format("void f() { // This does something ..\n"
962 " }\n"
963 "int a; // This is unrelated"));
Daniel Jasper251b3c92013-07-01 11:22:57 +0000964 EXPECT_EQ("class C {\n"
965 " void f() { // This does something ..\n"
966 " } // awesome..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000967 "\n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000968 " int a; // This is unrelated\n"
969 "};",
970 format("class C{void f() { // This does something ..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000971 " } // awesome..\n"
972 " \n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000973 "int a; // This is unrelated\n"
974 "};"));
Daniel Jasper304a9862013-01-21 22:49:20 +0000975
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000976 EXPECT_EQ("int i; // single line trailing comment",
Manuel Klimekc74d2922013-01-07 08:54:53 +0000977 format("int i;\\\n// single line trailing comment"));
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000978
979 verifyGoogleFormat("int a; // Trailing comment.");
Daniel Jasperddaa9be2013-01-29 19:41:55 +0000980
981 verifyFormat("someFunction(anotherFunction( // Force break.\n"
982 " parameter));");
Daniel Jaspera885dbe2013-02-05 09:34:14 +0000983
984 verifyGoogleFormat("#endif // HEADER_GUARD");
Daniel Jasperf79f9352013-02-06 22:04:05 +0000985
986 verifyFormat("const char *test[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +0000987 " // A\n"
988 " \"aaaa\",\n"
989 " // B\n"
990 " \"aaaaa\"};");
Daniel Jaspereef30492013-02-11 12:36:37 +0000991 verifyGoogleFormat(
992 "aaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +0000993 " aaaaaaaaaaaaaaaaaaaaaa); // 81_cols_with_this_comment");
Alexander Kornienkob1be9d62013-04-03 12:38:53 +0000994 EXPECT_EQ("D(a, {\n"
995 " // test\n"
996 " int a;\n"
997 "});",
998 format("D(a, {\n"
999 "// test\n"
1000 "int a;\n"
1001 "});"));
Manuel Klimekc5730802013-05-23 11:42:52 +00001002
1003 EXPECT_EQ("lineWith(); // comment\n"
1004 "// at start\n"
1005 "otherLine();",
1006 format("lineWith(); // comment\n"
1007 "// at start\n"
1008 "otherLine();"));
1009 EXPECT_EQ("lineWith(); // comment\n"
Daniel Jasperbb37a2f2016-02-01 11:20:55 +00001010 "/*\n"
1011 " * at start */\n"
1012 "otherLine();",
1013 format("lineWith(); // comment\n"
1014 "/*\n"
1015 " * at start */\n"
1016 "otherLine();"));
1017 EXPECT_EQ("lineWith(); // comment\n"
Manuel Klimekc5730802013-05-23 11:42:52 +00001018 " // at start\n"
1019 "otherLine();",
1020 format("lineWith(); // comment\n"
1021 " // at start\n"
1022 "otherLine();"));
Manuel Klimekb27375f2013-05-23 19:54:43 +00001023
1024 EXPECT_EQ("lineWith(); // comment\n"
1025 "// at start\n"
1026 "otherLine(); // comment",
1027 format("lineWith(); // comment\n"
1028 "// at start\n"
1029 "otherLine(); // comment"));
Manuel Klimek75ef31f2013-05-23 20:46:07 +00001030 EXPECT_EQ("lineWith();\n"
1031 "// at start\n"
1032 "otherLine(); // comment",
1033 format("lineWith();\n"
1034 " // at start\n"
1035 "otherLine(); // comment"));
1036 EXPECT_EQ("// first\n"
1037 "// at start\n"
1038 "otherLine(); // comment",
1039 format("// first\n"
1040 " // at start\n"
1041 "otherLine(); // comment"));
1042 EXPECT_EQ("f();\n"
1043 "// first\n"
1044 "// at start\n"
1045 "otherLine(); // comment",
1046 format("f();\n"
1047 "// first\n"
1048 " // at start\n"
1049 "otherLine(); // comment"));
Daniel Jasper0e93cdb2013-11-08 23:31:14 +00001050 verifyFormat("f(); // comment\n"
1051 "// first\n"
1052 "// at start\n"
1053 "otherLine();");
1054 EXPECT_EQ("f(); // comment\n"
1055 "// first\n"
1056 "// at start\n"
1057 "otherLine();",
1058 format("f(); // comment\n"
1059 "// first\n"
1060 " // at start\n"
1061 "otherLine();"));
1062 EXPECT_EQ("f(); // comment\n"
1063 " // first\n"
1064 "// at start\n"
1065 "otherLine();",
1066 format("f(); // comment\n"
1067 " // first\n"
1068 "// at start\n"
1069 "otherLine();"));
Daniel Jasper49532102015-01-07 14:00:11 +00001070 EXPECT_EQ("void f() {\n"
1071 " lineWith(); // comment\n"
1072 " // at start\n"
1073 "}",
1074 format("void f() {\n"
1075 " lineWith(); // comment\n"
1076 " // at start\n"
1077 "}"));
Benjamin Kramerdab50462016-01-11 16:27:16 +00001078 EXPECT_EQ("int xy; // a\n"
1079 "int z; // b",
1080 format("int xy; // a\n"
1081 "int z; //b"));
1082 EXPECT_EQ("int xy; // a\n"
1083 "int z; // bb",
1084 format("int xy; // a\n"
1085 "int z; //bb",
1086 getLLVMStyleWithColumns(12)));
Daniel Jasper66935022014-04-27 10:03:19 +00001087
Daniel Jaspera44991332015-04-29 13:06:49 +00001088 verifyFormat("#define A \\\n"
1089 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1090 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1091 getLLVMStyleWithColumns(60));
Daniel Jasper66935022014-04-27 10:03:19 +00001092 verifyFormat(
1093 "#define A \\\n"
1094 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1095 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1096 getLLVMStyleWithColumns(61));
Daniel Jasper8acf8222014-05-07 09:23:05 +00001097
1098 verifyFormat("if ( // This is some comment\n"
1099 " x + 3) {\n"
1100 "}");
1101 EXPECT_EQ("if ( // This is some comment\n"
1102 " // spanning two lines\n"
1103 " x + 3) {\n"
1104 "}",
1105 format("if( // This is some comment\n"
1106 " // spanning two lines\n"
1107 " x + 3) {\n"
1108 "}"));
Daniel Jasper9b79efb2015-01-19 11:49:32 +00001109
1110 verifyNoCrash("/\\\n/");
1111 verifyNoCrash("/\\\n* */");
Daniel Jasper62c78f52015-05-06 08:58:57 +00001112 // The 0-character somehow makes the lexer return a proper comment.
1113 verifyNoCrash(StringRef("/*\\\0\n/", 6));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001114}
1115
Daniel Jasper14e58e52014-03-21 11:58:45 +00001116TEST_F(FormatTest, KeepsParameterWithTrailingCommentsOnTheirOwnLine) {
1117 EXPECT_EQ("SomeFunction(a,\n"
1118 " b, // comment\n"
1119 " c);",
1120 format("SomeFunction(a,\n"
1121 " b, // comment\n"
1122 " c);"));
Daniel Jasper28df0a32014-03-21 12:15:40 +00001123 EXPECT_EQ("SomeFunction(a, b,\n"
1124 " // comment\n"
1125 " c);",
1126 format("SomeFunction(a,\n"
1127 " b,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001128 " // comment\n"
Daniel Jasper28df0a32014-03-21 12:15:40 +00001129 " c);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001130 EXPECT_EQ("SomeFunction(a, b, // comment (unclear relation)\n"
1131 " c);",
1132 format("SomeFunction(a, b, // comment (unclear relation)\n"
1133 " c);"));
1134 EXPECT_EQ("SomeFunction(a, // comment\n"
1135 " b,\n"
1136 " c); // comment",
1137 format("SomeFunction(a, // comment\n"
1138 " b,\n"
1139 " c); // comment"));
Daniel Jasper35e41222016-11-29 09:40:01 +00001140 EXPECT_EQ("aaaaaaaaaa(aaaa(aaaa,\n"
1141 " aaaa), //\n"
1142 " aaaa, bbbbb);",
1143 format("aaaaaaaaaa(aaaa(aaaa,\n"
1144 "aaaa), //\n"
1145 "aaaa, bbbbb);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001146}
1147
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001148TEST_F(FormatTest, RemovesTrailingWhitespaceOfComments) {
1149 EXPECT_EQ("// comment", format("// comment "));
1150 EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment",
1151 format("int aaaaaaa, bbbbbbb; // comment ",
1152 getLLVMStyleWithColumns(33)));
Alexander Kornienko9ab4a772013-09-06 17:24:54 +00001153 EXPECT_EQ("// comment\\\n", format("// comment\\\n \t \v \f "));
1154 EXPECT_EQ("// comment \\\n", format("// comment \\\n \t \v \f "));
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001155}
1156
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001157TEST_F(FormatTest, UnderstandsBlockComments) {
Nico Weber8084cff2013-06-26 00:15:19 +00001158 verifyFormat("f(/*noSpaceAfterParameterNamingComment=*/true);");
Daniel Jasper2b2c9672016-05-08 18:14:01 +00001159 verifyFormat("void f() { g(/*aaa=*/x, /*bbb=*/!y, /*c=*/::c); }");
Daniel Jasper38c82402013-11-29 09:27:43 +00001160 EXPECT_EQ("f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n"
1161 " bbbbbbbbbbbbbbbbbbbbbbbbb);",
1162 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \\\n"
1163 "/* Trailing comment for aa... */\n"
1164 " bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001165 EXPECT_EQ(
1166 "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1167 " /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);",
1168 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \n"
1169 "/* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper61a40782013-06-06 16:08:57 +00001170 EXPECT_EQ(
1171 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1172 " aaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001173 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001174 "}",
1175 format("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1176 " aaaaaaaaaaaaaaaaaa ,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001177 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001178 "}"));
Daniel Jasper99302ed2016-05-27 08:59:34 +00001179 verifyFormat("f(/* aaaaaaaaaaaaaaaaaa = */\n"
1180 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperddaa9be2013-01-29 19:41:55 +00001181
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00001182 FormatStyle NoBinPacking = getLLVMStyle();
1183 NoBinPacking.BinPackParameters = false;
1184 verifyFormat("aaaaaaaa(/* parameter 1 */ aaaaaa,\n"
1185 " /* parameter 2 */ aaaaaa,\n"
1186 " /* parameter 3 */ aaaaaa,\n"
1187 " /* parameter 4 */ aaaaaa);",
1188 NoBinPacking);
Daniel Jasper03b1bc72014-03-28 15:06:01 +00001189
1190 // Aligning block comments in macros.
1191 verifyGoogleFormat("#define A \\\n"
1192 " int i; /*a*/ \\\n"
1193 " int jjj; /*b*/");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001194}
1195
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001196TEST_F(FormatTest, AlignsBlockComments) {
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001197 EXPECT_EQ("/*\n"
1198 " * Really multi-line\n"
1199 " * comment.\n"
1200 " */\n"
1201 "void f() {}",
1202 format(" /*\n"
1203 " * Really multi-line\n"
1204 " * comment.\n"
1205 " */\n"
1206 " void f() {}"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001207 EXPECT_EQ("class C {\n"
1208 " /*\n"
1209 " * Another multi-line\n"
1210 " * comment.\n"
1211 " */\n"
1212 " void f() {}\n"
1213 "};",
1214 format("class C {\n"
1215 "/*\n"
1216 " * Another multi-line\n"
1217 " * comment.\n"
1218 " */\n"
1219 "void f() {}\n"
1220 "};"));
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001221 EXPECT_EQ("/*\n"
1222 " 1. This is a comment with non-trivial formatting.\n"
1223 " 1.1. We have to indent/outdent all lines equally\n"
1224 " 1.1.1. to keep the formatting.\n"
1225 " */",
1226 format(" /*\n"
1227 " 1. This is a comment with non-trivial formatting.\n"
1228 " 1.1. We have to indent/outdent all lines equally\n"
1229 " 1.1.1. to keep the formatting.\n"
1230 " */"));
1231 EXPECT_EQ("/*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001232 "Don't try to outdent if there's not enough indentation.\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001233 "*/",
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001234 format(" /*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001235 " Don't try to outdent if there's not enough indentation.\n"
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001236 " */"));
Manuel Klimek281dcbe2013-05-28 08:55:01 +00001237
1238 EXPECT_EQ("int i; /* Comment with empty...\n"
1239 " *\n"
1240 " * line. */",
1241 format("int i; /* Comment with empty...\n"
1242 " *\n"
1243 " * line. */"));
Alexander Kornienko67d9c8c2014-04-17 16:12:46 +00001244 EXPECT_EQ("int foobar = 0; /* comment */\n"
1245 "int bar = 0; /* multiline\n"
1246 " comment 1 */\n"
1247 "int baz = 0; /* multiline\n"
1248 " comment 2 */\n"
1249 "int bzz = 0; /* multiline\n"
1250 " comment 3 */",
1251 format("int foobar = 0; /* comment */\n"
1252 "int bar = 0; /* multiline\n"
1253 " comment 1 */\n"
1254 "int baz = 0; /* multiline\n"
1255 " comment 2 */\n"
1256 "int bzz = 0; /* multiline\n"
1257 " comment 3 */"));
1258 EXPECT_EQ("int foobar = 0; /* comment */\n"
1259 "int bar = 0; /* multiline\n"
1260 " comment */\n"
1261 "int baz = 0; /* multiline\n"
1262 "comment */",
1263 format("int foobar = 0; /* comment */\n"
1264 "int bar = 0; /* multiline\n"
1265 "comment */\n"
1266 "int baz = 0; /* multiline\n"
1267 "comment */"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001268}
1269
Daniel Jaspera0a50392015-12-01 13:28:53 +00001270TEST_F(FormatTest, CommentReflowingCanBeTurnedOff) {
1271 FormatStyle Style = getLLVMStyleWithColumns(20);
1272 Style.ReflowComments = false;
1273 verifyFormat("// aaaaaaaaa aaaaaaaaaa aaaaaaaaaa", Style);
1274 verifyFormat("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa */", Style);
1275}
1276
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001277TEST_F(FormatTest, CorrectlyHandlesLengthOfBlockComments) {
1278 EXPECT_EQ("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1279 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */",
1280 format("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1281 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */"));
Alexander Kornienkoaa620e12013-07-01 13:42:42 +00001282 EXPECT_EQ(
1283 "void ffffffffffff(\n"
1284 " int aaaaaaaa, int bbbbbbbb,\n"
1285 " int cccccccccccc) { /*\n"
1286 " aaaaaaaaaa\n"
1287 " aaaaaaaaaaaaa\n"
1288 " bbbbbbbbbbbbbb\n"
1289 " bbbbbbbbbb\n"
1290 " */\n"
1291 "}",
1292 format("void ffffffffffff(int aaaaaaaa, int bbbbbbbb, int cccccccccccc)\n"
1293 "{ /*\n"
1294 " aaaaaaaaaa aaaaaaaaaaaaa\n"
1295 " bbbbbbbbbbbbbb bbbbbbbbbb\n"
1296 " */\n"
1297 "}",
1298 getLLVMStyleWithColumns(40)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001299}
1300
Alexander Kornienko94042342013-07-16 23:47:22 +00001301TEST_F(FormatTest, DontBreakNonTrailingBlockComments) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00001302 EXPECT_EQ("void ffffffffff(\n"
1303 " int aaaaa /* test */);",
Alexander Kornienko94042342013-07-16 23:47:22 +00001304 format("void ffffffffff(int aaaaa /* test */);",
1305 getLLVMStyleWithColumns(35)));
1306}
1307
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001308TEST_F(FormatTest, SplitsLongCxxComments) {
1309 EXPECT_EQ("// A comment that\n"
1310 "// doesn't fit on\n"
1311 "// one line",
1312 format("// A comment that doesn't fit on one line",
1313 getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001314 EXPECT_EQ("/// A comment that\n"
1315 "/// doesn't fit on\n"
1316 "/// one line",
1317 format("/// A comment that doesn't fit on one line",
1318 getLLVMStyleWithColumns(20)));
1319 EXPECT_EQ("//! A comment that\n"
1320 "//! doesn't fit on\n"
1321 "//! one line",
1322 format("//! A comment that doesn't fit on one line",
1323 getLLVMStyleWithColumns(20)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00001324 EXPECT_EQ("// a b c d\n"
1325 "// e f g\n"
1326 "// h i j k",
Daniel Jaspera44991332015-04-29 13:06:49 +00001327 format("// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
1328 EXPECT_EQ(
1329 "// a b c d\n"
1330 "// e f g\n"
1331 "// h i j k",
1332 format("\\\n// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001333 EXPECT_EQ("if (true) // A comment that\n"
1334 " // doesn't fit on\n"
1335 " // one line",
1336 format("if (true) // A comment that doesn't fit on one line ",
1337 getLLVMStyleWithColumns(30)));
1338 EXPECT_EQ("// Don't_touch_leading_whitespace",
1339 format("// Don't_touch_leading_whitespace",
1340 getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001341 EXPECT_EQ("// Add leading\n"
1342 "// whitespace",
1343 format("//Add leading whitespace", getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001344 EXPECT_EQ("/// Add leading\n"
1345 "/// whitespace",
1346 format("///Add leading whitespace", getLLVMStyleWithColumns(20)));
1347 EXPECT_EQ("//! Add leading\n"
1348 "//! whitespace",
1349 format("//!Add leading whitespace", getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001350 EXPECT_EQ("// whitespace", format("//whitespace", getLLVMStyle()));
1351 EXPECT_EQ("// Even if it makes the line exceed the column\n"
1352 "// limit",
1353 format("//Even if it makes the line exceed the column limit",
1354 getLLVMStyleWithColumns(51)));
1355 EXPECT_EQ("//--But not here", format("//--But not here", getLLVMStyle()));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001356
1357 EXPECT_EQ("// aa bb cc dd",
1358 format("// aa bb cc dd ",
1359 getLLVMStyleWithColumns(15)));
1360
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001361 EXPECT_EQ("// A comment before\n"
1362 "// a macro\n"
1363 "// definition\n"
1364 "#define a b",
1365 format("// A comment before a macro definition\n"
1366 "#define a b",
1367 getLLVMStyleWithColumns(20)));
Daniel Jaspere068ac72014-10-27 17:13:59 +00001368 EXPECT_EQ("void ffffff(\n"
1369 " int aaaaaaaaa, // wwww\n"
1370 " int bbbbbbbbbb, // xxxxxxx\n"
1371 " // yyyyyyyyyy\n"
1372 " int c, int d, int e) {}",
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001373 format("void ffffff(\n"
1374 " int aaaaaaaaa, // wwww\n"
Daniel Jasper19a541e2013-12-19 16:45:34 +00001375 " int bbbbbbbbbb, // xxxxxxx yyyyyyyyyy\n"
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001376 " int c, int d, int e) {}",
1377 getLLVMStyleWithColumns(40)));
Alexander Kornienkob93062e2013-06-20 13:58:37 +00001378 EXPECT_EQ("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1379 format("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1380 getLLVMStyleWithColumns(20)));
Alexander Kornienko3abbb8a2013-11-12 17:30:49 +00001381 EXPECT_EQ(
1382 "#define XXX // a b c d\n"
1383 " // e f g h",
1384 format("#define XXX // a b c d e f g h", getLLVMStyleWithColumns(22)));
1385 EXPECT_EQ(
1386 "#define XXX // q w e r\n"
1387 " // t y u i",
1388 format("#define XXX //q w e r t y u i", getLLVMStyleWithColumns(22)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001389}
Manuel Klimek9043c742013-05-27 15:23:34 +00001390
Alexander Kornienko4504f932014-03-10 13:14:56 +00001391TEST_F(FormatTest, PreservesHangingIndentInCxxComments) {
1392 EXPECT_EQ("// A comment\n"
1393 "// that doesn't\n"
1394 "// fit on one\n"
1395 "// line",
1396 format("// A comment that doesn't fit on one line",
1397 getLLVMStyleWithColumns(20)));
1398 EXPECT_EQ("/// A comment\n"
1399 "/// that doesn't\n"
1400 "/// fit on one\n"
1401 "/// line",
1402 format("/// A comment that doesn't fit on one line",
1403 getLLVMStyleWithColumns(20)));
1404}
1405
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001406TEST_F(FormatTest, DontSplitLineCommentsWithEscapedNewlines) {
1407 EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1408 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1409 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1410 format("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1411 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1412 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
1413 EXPECT_EQ("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1414 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1415 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1416 format("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1417 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1418 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1419 getLLVMStyleWithColumns(50)));
1420 // FIXME: One day we might want to implement adjustment of leading whitespace
1421 // of the consecutive lines in this kind of comment:
Daniel Jasper4355e7f2014-07-09 07:50:33 +00001422 EXPECT_EQ("double\n"
1423 " a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1424 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1425 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1426 format("double a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1427 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1428 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001429 getLLVMStyleWithColumns(49)));
1430}
1431
Alexander Kornienkoce9161a2014-01-02 15:13:14 +00001432TEST_F(FormatTest, DontSplitLineCommentsWithPragmas) {
1433 FormatStyle Pragmas = getLLVMStyleWithColumns(30);
1434 Pragmas.CommentPragmas = "^ IWYU pragma:";
1435 EXPECT_EQ(
1436 "// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb",
1437 format("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas));
1438 EXPECT_EQ(
1439 "/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */",
1440 format("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas));
1441}
1442
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001443TEST_F(FormatTest, PriorityOfCommentBreaking) {
Daniel Jasper2739af32013-08-28 10:03:58 +00001444 EXPECT_EQ("if (xxx ==\n"
1445 " yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001446 " zzz)\n"
1447 " q();",
1448 format("if (xxx == yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
1449 " zzz) q();",
1450 getLLVMStyleWithColumns(40)));
1451 EXPECT_EQ("if (xxxxxxxxxx ==\n"
1452 " yyy && // aaaaaa bbbbbbbb cccc\n"
1453 " zzz)\n"
1454 " q();",
1455 format("if (xxxxxxxxxx == yyy && // aaaaaa bbbbbbbb cccc\n"
1456 " zzz) q();",
1457 getLLVMStyleWithColumns(40)));
1458 EXPECT_EQ("if (xxxxxxxxxx &&\n"
1459 " yyy || // aaaaaa bbbbbbbb cccc\n"
1460 " zzz)\n"
1461 " q();",
1462 format("if (xxxxxxxxxx && yyy || // aaaaaa bbbbbbbb cccc\n"
1463 " zzz) q();",
1464 getLLVMStyleWithColumns(40)));
Daniel Jasper19a541e2013-12-19 16:45:34 +00001465 EXPECT_EQ("fffffffff(\n"
1466 " &xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1467 " zzz);",
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001468 format("fffffffff(&xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1469 " zzz);",
1470 getLLVMStyleWithColumns(40)));
Manuel Klimek9043c742013-05-27 15:23:34 +00001471}
1472
1473TEST_F(FormatTest, MultiLineCommentsInDefines) {
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001474 EXPECT_EQ("#define A(x) /* \\\n"
1475 " a comment \\\n"
1476 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001477 " f();",
1478 format("#define A(x) /* \\\n"
1479 " a comment \\\n"
1480 " inside */ \\\n"
1481 " f();",
1482 getLLVMStyleWithColumns(17)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001483 EXPECT_EQ("#define A( \\\n"
1484 " x) /* \\\n"
1485 " a comment \\\n"
1486 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001487 " f();",
1488 format("#define A( \\\n"
1489 " x) /* \\\n"
1490 " a comment \\\n"
1491 " inside */ \\\n"
1492 " f();",
1493 getLLVMStyleWithColumns(17)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001494}
1495
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001496TEST_F(FormatTest, ParsesCommentsAdjacentToPPDirectives) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001497 EXPECT_EQ("namespace {}\n// Test\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001498 format("namespace {}\n // Test\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001499 EXPECT_EQ("namespace {}\n/* Test */\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001500 format("namespace {}\n /* Test */\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001501 EXPECT_EQ("namespace {}\n/* Test */ #define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001502 format("namespace {}\n /* Test */ #define A"));
1503}
1504
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001505TEST_F(FormatTest, SplitsLongLinesInComments) {
1506 EXPECT_EQ("/* This is a long\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001507 " * comment that\n"
1508 " * doesn't\n"
1509 " * fit on one line.\n"
1510 " */",
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001511 format("/* "
1512 "This is a long "
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001513 "comment that "
1514 "doesn't "
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001515 "fit on one line. */",
1516 getLLVMStyleWithColumns(20)));
Daniel Jaspera44991332015-04-29 13:06:49 +00001517 EXPECT_EQ(
1518 "/* a b c d\n"
1519 " * e f g\n"
1520 " * h i j k\n"
1521 " */",
1522 format("/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
1523 EXPECT_EQ(
1524 "/* a b c d\n"
1525 " * e f g\n"
1526 " * h i j k\n"
1527 " */",
1528 format("\\\n/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001529 EXPECT_EQ("/*\n"
1530 "This is a long\n"
1531 "comment that doesn't\n"
1532 "fit on one line.\n"
1533 "*/",
1534 format("/*\n"
1535 "This is a long "
1536 "comment that doesn't "
1537 "fit on one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001538 "*/",
1539 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001540 EXPECT_EQ("/*\n"
1541 " * This is a long\n"
1542 " * comment that\n"
1543 " * doesn't fit on\n"
1544 " * one line.\n"
1545 " */",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001546 format("/* \n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001547 " * This is a long "
1548 " comment that "
1549 " doesn't fit on "
1550 " one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001551 " */",
1552 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001553 EXPECT_EQ("/*\n"
1554 " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n"
1555 " * so_it_should_be_broken\n"
1556 " * wherever_a_space_occurs\n"
1557 " */",
1558 format("/*\n"
1559 " * This_is_a_comment_with_words_that_dont_fit_on_one_line "
1560 " so_it_should_be_broken "
1561 " wherever_a_space_occurs \n"
1562 " */",
1563 getLLVMStyleWithColumns(20)));
1564 EXPECT_EQ("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001565 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001566 " */",
1567 format("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001568 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001569 " */",
1570 getLLVMStyleWithColumns(20)));
1571 EXPECT_EQ("{\n"
1572 " /*\n"
1573 " This is another\n"
1574 " long comment that\n"
1575 " doesn't fit on one\n"
1576 " line 1234567890\n"
1577 " */\n"
1578 "}",
1579 format("{\n"
1580 "/*\n"
1581 "This is another "
1582 " long comment that "
1583 " doesn't fit on one"
1584 " line 1234567890\n"
1585 "*/\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001586 "}",
1587 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001588 EXPECT_EQ("{\n"
1589 " /*\n"
1590 " * This i s\n"
1591 " * another comment\n"
1592 " * t hat doesn' t\n"
1593 " * fit on one l i\n"
1594 " * n e\n"
1595 " */\n"
1596 "}",
1597 format("{\n"
1598 "/*\n"
1599 " * This i s"
1600 " another comment"
1601 " t hat doesn' t"
1602 " fit on one l i"
1603 " n e\n"
1604 " */\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001605 "}",
1606 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001607 EXPECT_EQ("/*\n"
1608 " * This is a long\n"
1609 " * comment that\n"
1610 " * doesn't fit on\n"
1611 " * one line\n"
1612 " */",
1613 format(" /*\n"
1614 " * This is a long comment that doesn't fit on one line\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001615 " */",
1616 getLLVMStyleWithColumns(20)));
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001617 EXPECT_EQ("{\n"
1618 " if (something) /* This is a\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001619 " long\n"
1620 " comment */\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001621 " ;\n"
1622 "}",
1623 format("{\n"
1624 " if (something) /* This is a long comment */\n"
1625 " ;\n"
1626 "}",
1627 getLLVMStyleWithColumns(30)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001628
1629 EXPECT_EQ("/* A comment before\n"
1630 " * a macro\n"
1631 " * definition */\n"
1632 "#define a b",
1633 format("/* A comment before a macro definition */\n"
1634 "#define a b",
1635 getLLVMStyleWithColumns(20)));
1636
1637 EXPECT_EQ("/* some comment\n"
1638 " * a comment\n"
1639 "* that we break\n"
1640 " * another comment\n"
1641 "* we have to break\n"
1642 "* a left comment\n"
1643 " */",
1644 format(" /* some comment\n"
1645 " * a comment that we break\n"
1646 " * another comment we have to break\n"
1647 "* a left comment\n"
1648 " */",
1649 getLLVMStyleWithColumns(20)));
1650
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00001651 EXPECT_EQ("/**\n"
1652 " * multiline block\n"
1653 " * comment\n"
1654 " *\n"
1655 " */",
1656 format("/**\n"
1657 " * multiline block comment\n"
1658 " *\n"
1659 " */",
1660 getLLVMStyleWithColumns(20)));
1661
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001662 EXPECT_EQ("/*\n"
1663 "\n"
1664 "\n"
1665 " */\n",
1666 format(" /* \n"
1667 " \n"
1668 " \n"
1669 " */\n"));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001670
1671 EXPECT_EQ("/* a a */",
1672 format("/* a a */", getLLVMStyleWithColumns(15)));
1673 EXPECT_EQ("/* a a bc */",
1674 format("/* a a bc */", getLLVMStyleWithColumns(15)));
1675 EXPECT_EQ("/* aaa aaa\n"
1676 " * aaaaa */",
1677 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
1678 EXPECT_EQ("/* aaa aaa\n"
1679 " * aaaaa */",
1680 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001681}
1682
1683TEST_F(FormatTest, SplitsLongLinesInCommentsInPreprocessor) {
1684 EXPECT_EQ("#define X \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001685 " /* \\\n"
1686 " Test \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001687 " Macro comment \\\n"
1688 " with a long \\\n"
1689 " line \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001690 " */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001691 " A + B",
1692 format("#define X \\\n"
1693 " /*\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001694 " Test\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001695 " Macro comment with a long line\n"
1696 " */ \\\n"
1697 " A + B",
1698 getLLVMStyleWithColumns(20)));
1699 EXPECT_EQ("#define X \\\n"
1700 " /* Macro comment \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001701 " with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001702 " line */ \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001703 " A + B",
1704 format("#define X \\\n"
1705 " /* Macro comment with a long\n"
1706 " line */ \\\n"
1707 " A + B",
1708 getLLVMStyleWithColumns(20)));
1709 EXPECT_EQ("#define X \\\n"
1710 " /* Macro comment \\\n"
1711 " * with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001712 " * line */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001713 " A + B",
1714 format("#define X \\\n"
1715 " /* Macro comment with a long line */ \\\n"
1716 " A + B",
1717 getLLVMStyleWithColumns(20)));
1718}
1719
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001720TEST_F(FormatTest, CommentsInStaticInitializers) {
1721 EXPECT_EQ(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001722 "static SomeType type = {aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
1723 " aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
1724 " /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
1725 " aaaaaaaaaaaaaaaaaaaa, // comment\n"
1726 " aaaaaaaaaaaaaaaaaaaa};",
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001727 format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa , /* comment */\n"
1728 " aaaaaaaaaaaaaaaaaaaa /* comment */ ,\n"
1729 " /* comment */ aaaaaaaaaaaaaaaaaaaa ,\n"
1730 " aaaaaaaaaaaaaaaaaaaa , // comment\n"
1731 " aaaaaaaaaaaaaaaaaaaa };"));
Chandler Carruthf8b72662014-03-02 12:37:31 +00001732 verifyFormat("static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1733 " bbbbbbbbbbb, ccccccccccc};");
1734 verifyFormat("static SomeType type = {aaaaaaaaaaa,\n"
1735 " // comment for bb....\n"
1736 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001737 verifyGoogleFormat(
Daniel Jaspere5777d22013-05-23 10:15:45 +00001738 "static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1739 " bbbbbbbbbbb, ccccccccccc};");
1740 verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n"
1741 " // comment for bb....\n"
1742 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001743
Chandler Carruthf8b72662014-03-02 12:37:31 +00001744 verifyFormat("S s = {{a, b, c}, // Group #1\n"
1745 " {d, e, f}, // Group #2\n"
1746 " {g, h, i}}; // Group #3");
1747 verifyFormat("S s = {{// Group #1\n"
1748 " a, b, c},\n"
1749 " {// Group #2\n"
1750 " d, e, f},\n"
1751 " {// Group #3\n"
1752 " g, h, i}};");
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001753
1754 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001755 " // Some comment\n"
1756 " a,\n"
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001757 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001758 " // Comment after empty line\n"
1759 " b}",
Daniel Jasperfb5e2412013-02-26 13:10:34 +00001760 format("S s = {\n"
1761 " // Some comment\n"
1762 " a,\n"
1763 " \n"
1764 " // Comment after empty line\n"
1765 " b\n"
1766 "}"));
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001767 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001768 " /* Some comment */\n"
1769 " a,\n"
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001770 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001771 " /* Comment after empty line */\n"
1772 " b}",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001773 format("S s = {\n"
1774 " /* Some comment */\n"
1775 " a,\n"
1776 " \n"
1777 " /* Comment after empty line */\n"
1778 " b\n"
1779 "}"));
Daniel Jaspera400cab2013-02-28 15:04:12 +00001780 verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001781 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1782 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1783 " 0x00, 0x00, 0x00, 0x00}; // comment\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001784}
1785
Alexander Kornienkof2e02122013-05-24 18:24:24 +00001786TEST_F(FormatTest, IgnoresIf0Contents) {
1787 EXPECT_EQ("#if 0\n"
1788 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
1789 "#endif\n"
1790 "void f() {}",
1791 format("#if 0\n"
1792 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
1793 "#endif\n"
1794 "void f( ) { }"));
1795 EXPECT_EQ("#if false\n"
1796 "void f( ) { }\n"
1797 "#endif\n"
1798 "void g() {}\n",
1799 format("#if false\n"
1800 "void f( ) { }\n"
1801 "#endif\n"
1802 "void g( ) { }\n"));
1803 EXPECT_EQ("enum E {\n"
1804 " One,\n"
1805 " Two,\n"
1806 "#if 0\n"
1807 "Three,\n"
1808 " Four,\n"
1809 "#endif\n"
1810 " Five\n"
1811 "};",
1812 format("enum E {\n"
1813 " One,Two,\n"
1814 "#if 0\n"
1815 "Three,\n"
1816 " Four,\n"
1817 "#endif\n"
1818 " Five};"));
1819 EXPECT_EQ("enum F {\n"
1820 " One,\n"
1821 "#if 1\n"
1822 " Two,\n"
1823 "#if 0\n"
1824 "Three,\n"
1825 " Four,\n"
1826 "#endif\n"
1827 " Five\n"
1828 "#endif\n"
1829 "};",
1830 format("enum F {\n"
1831 "One,\n"
1832 "#if 1\n"
1833 "Two,\n"
1834 "#if 0\n"
1835 "Three,\n"
1836 " Four,\n"
1837 "#endif\n"
1838 "Five\n"
1839 "#endif\n"
1840 "};"));
1841 EXPECT_EQ("enum G {\n"
1842 " One,\n"
1843 "#if 0\n"
1844 "Two,\n"
1845 "#else\n"
1846 " Three,\n"
1847 "#endif\n"
1848 " Four\n"
1849 "};",
1850 format("enum G {\n"
1851 "One,\n"
1852 "#if 0\n"
1853 "Two,\n"
1854 "#else\n"
1855 "Three,\n"
1856 "#endif\n"
1857 "Four\n"
1858 "};"));
1859 EXPECT_EQ("enum H {\n"
1860 " One,\n"
1861 "#if 0\n"
1862 "#ifdef Q\n"
1863 "Two,\n"
1864 "#else\n"
1865 "Three,\n"
1866 "#endif\n"
1867 "#endif\n"
1868 " Four\n"
1869 "};",
1870 format("enum H {\n"
1871 "One,\n"
1872 "#if 0\n"
1873 "#ifdef Q\n"
1874 "Two,\n"
1875 "#else\n"
1876 "Three,\n"
1877 "#endif\n"
1878 "#endif\n"
1879 "Four\n"
1880 "};"));
1881 EXPECT_EQ("enum I {\n"
1882 " One,\n"
1883 "#if /* test */ 0 || 1\n"
1884 "Two,\n"
1885 "Three,\n"
1886 "#endif\n"
1887 " Four\n"
1888 "};",
1889 format("enum I {\n"
1890 "One,\n"
1891 "#if /* test */ 0 || 1\n"
1892 "Two,\n"
1893 "Three,\n"
1894 "#endif\n"
1895 "Four\n"
1896 "};"));
1897 EXPECT_EQ("enum J {\n"
1898 " One,\n"
1899 "#if 0\n"
1900 "#if 0\n"
1901 "Two,\n"
1902 "#else\n"
1903 "Three,\n"
1904 "#endif\n"
1905 "Four,\n"
1906 "#endif\n"
1907 " Five\n"
1908 "};",
1909 format("enum J {\n"
1910 "One,\n"
1911 "#if 0\n"
1912 "#if 0\n"
1913 "Two,\n"
1914 "#else\n"
1915 "Three,\n"
1916 "#endif\n"
1917 "Four,\n"
1918 "#endif\n"
1919 "Five\n"
1920 "};"));
Alexander Kornienkof2e02122013-05-24 18:24:24 +00001921}
1922
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001923//===----------------------------------------------------------------------===//
1924// Tests for classes, namespaces, etc.
1925//===----------------------------------------------------------------------===//
1926
1927TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001928 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001929}
1930
1931TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1932 verifyFormat("class A {\n"
1933 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001934 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001935 "protected:\n"
1936 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001937 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001938 "};");
1939 verifyGoogleFormat("class A {\n"
1940 " public:\n"
1941 " protected:\n"
1942 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001943 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001944 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001945 verifyFormat("class A {\n"
1946 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001947 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001948 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001949 " void f2() {}\n"
1950 "protected slots:\n"
1951 " void f3() {}\n"
1952 "protected Q_SLOTS:\n"
1953 " void f4() {}\n"
1954 "private slots:\n"
1955 " void f5() {}\n"
1956 "private Q_SLOTS:\n"
1957 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001958 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001959 " void g1();\n"
1960 "Q_SIGNALS:\n"
1961 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001962 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001963
1964 // Don't interpret 'signals' the wrong way.
1965 verifyFormat("signals.set();");
1966 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001967 verifyFormat("{\n"
1968 " signals.set(); // This needs indentation.\n"
1969 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001970 verifyFormat("void f() {\n"
1971 "label:\n"
1972 " signals.baz();\n"
1973 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001974}
1975
Alexander Kornienkofd433362013-03-27 17:08:02 +00001976TEST_F(FormatTest, SeparatesLogicalBlocks) {
1977 EXPECT_EQ("class A {\n"
1978 "public:\n"
1979 " void f();\n"
1980 "\n"
1981 "private:\n"
1982 " void g() {}\n"
1983 " // test\n"
1984 "protected:\n"
1985 " int h;\n"
1986 "};",
1987 format("class A {\n"
1988 "public:\n"
1989 "void f();\n"
1990 "private:\n"
1991 "void g() {}\n"
1992 "// test\n"
1993 "protected:\n"
1994 "int h;\n"
1995 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001996 EXPECT_EQ("class A {\n"
1997 "protected:\n"
1998 "public:\n"
1999 " void f();\n"
2000 "};",
2001 format("class A {\n"
2002 "protected:\n"
2003 "\n"
2004 "public:\n"
2005 "\n"
2006 " void f();\n"
2007 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00002008
2009 // Even ensure proper spacing inside macros.
2010 EXPECT_EQ("#define B \\\n"
2011 " class A { \\\n"
2012 " protected: \\\n"
2013 " public: \\\n"
2014 " void f(); \\\n"
2015 " };",
2016 format("#define B \\\n"
2017 " class A { \\\n"
2018 " protected: \\\n"
2019 " \\\n"
2020 " public: \\\n"
2021 " \\\n"
2022 " void f(); \\\n"
2023 " };",
2024 getGoogleStyle()));
2025 // But don't remove empty lines after macros ending in access specifiers.
2026 EXPECT_EQ("#define A private:\n"
2027 "\n"
2028 "int i;",
2029 format("#define A private:\n"
2030 "\n"
2031 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00002032}
2033
Daniel Jasper83193602013-04-05 17:22:09 +00002034TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002035 verifyFormat("class A : public B {};");
2036 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002037
2038 verifyFormat(
2039 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002040 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00002041 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
2042 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002043 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002044 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002045 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002046 verifyFormat("class AAAAAAAAAAAA : public B,\n"
2047 " public C,\n"
2048 " public D,\n"
2049 " public E,\n"
2050 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002051 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00002052
2053 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002054 " ReallyReallyLongClassName {\n"
2055 " int i;\n"
2056 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00002057 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00002058 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
2059 " aaaaaaaaaaaaaaaa> {};");
2060 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
2061 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
2062 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00002063 verifyFormat("template <class R, class C>\n"
2064 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
2065 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00002066 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00002067}
2068
Manuel Klimek28cacc72013-01-07 18:10:23 +00002069TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002070 verifyFormat("class A {\n} a, b;");
2071 verifyFormat("struct A {\n} a, b;");
2072 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00002073}
2074
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002075TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002076 verifyFormat("enum {\n"
2077 " Zero,\n"
2078 " One = 1,\n"
2079 " Two = One + 1,\n"
2080 " Three = (One + Two),\n"
2081 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2082 " Five = (One, Two, Three, Four, 5)\n"
2083 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002084 verifyGoogleFormat("enum {\n"
2085 " Zero,\n"
2086 " One = 1,\n"
2087 " Two = One + 1,\n"
2088 " Three = (One + Two),\n"
2089 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2090 " Five = (One, Two, Three, Four, 5)\n"
2091 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002092 verifyFormat("enum Enum {};");
2093 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002094 verifyFormat("enum X E {} d;");
2095 verifyFormat("enum __attribute__((...)) E {} d;");
2096 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00002097 verifyFormat("enum {\n"
2098 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002099 "};",
2100 getLLVMStyleWithColumns(30));
2101
2102 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00002103 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002104
2105 EXPECT_EQ("enum KeepEmptyLines {\n"
2106 " ONE,\n"
2107 "\n"
2108 " TWO,\n"
2109 "\n"
2110 " THREE\n"
2111 "}",
2112 format("enum KeepEmptyLines {\n"
2113 " ONE,\n"
2114 "\n"
2115 " TWO,\n"
2116 "\n"
2117 "\n"
2118 " THREE\n"
2119 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00002120 verifyFormat("enum E { // comment\n"
2121 " ONE,\n"
2122 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00002123 "};\n"
2124 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002125 // Not enums.
2126 verifyFormat("enum X f() {\n"
2127 " a();\n"
2128 " return 42;\n"
2129 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00002130 verifyFormat("enum X Type::f() {\n"
2131 " a();\n"
2132 " return 42;\n"
2133 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002134 verifyFormat("enum ::X f() {\n"
2135 " a();\n"
2136 " return 42;\n"
2137 "}");
2138 verifyFormat("enum ns::X f() {\n"
2139 " a();\n"
2140 " return 42;\n"
2141 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002142}
2143
Daniel Jasperb7150872013-08-30 10:10:19 +00002144TEST_F(FormatTest, FormatsEnumsWithErrors) {
2145 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002146 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002147 " Two = 1;\n"
2148 "};");
2149 verifyFormat("namespace n {\n"
2150 "enum Type {\n"
2151 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002152 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002153 " int i;\n"
2154 "}\n"
2155 "void g() {}");
2156}
2157
Daniel Jasper2b41a822013-08-20 12:42:50 +00002158TEST_F(FormatTest, FormatsEnumStruct) {
2159 verifyFormat("enum struct {\n"
2160 " Zero,\n"
2161 " One = 1,\n"
2162 " Two = One + 1,\n"
2163 " Three = (One + Two),\n"
2164 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2165 " Five = (One, Two, Three, Four, 5)\n"
2166 "};");
2167 verifyFormat("enum struct Enum {};");
2168 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002169 verifyFormat("enum struct X E {} d;");
2170 verifyFormat("enum struct __attribute__((...)) E {} d;");
2171 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002172 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
2173}
2174
2175TEST_F(FormatTest, FormatsEnumClass) {
2176 verifyFormat("enum class {\n"
2177 " Zero,\n"
2178 " One = 1,\n"
2179 " Two = One + 1,\n"
2180 " Three = (One + Two),\n"
2181 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2182 " Five = (One, Two, Three, Four, 5)\n"
2183 "};");
2184 verifyFormat("enum class Enum {};");
2185 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002186 verifyFormat("enum class X E {} d;");
2187 verifyFormat("enum class __attribute__((...)) E {} d;");
2188 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002189 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
2190}
2191
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002192TEST_F(FormatTest, FormatsEnumTypes) {
2193 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002194 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002195 " B\n"
2196 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00002197 verifyFormat("enum X : int { A, B };");
2198 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002199}
2200
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002201TEST_F(FormatTest, FormatsNSEnums) {
2202 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2203 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2204 " // Information about someDecentlyLongValue.\n"
2205 " someDecentlyLongValue,\n"
2206 " // Information about anotherDecentlyLongValue.\n"
2207 " anotherDecentlyLongValue,\n"
2208 " // Information about aThirdDecentlyLongValue.\n"
2209 " aThirdDecentlyLongValue\n"
2210 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00002211 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2212 " a = 1,\n"
2213 " b = 2,\n"
2214 " c = 3,\n"
2215 "};");
2216 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2217 " a = 1,\n"
2218 " b = 2,\n"
2219 " c = 3,\n"
2220 "};");
2221 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2222 " a = 1,\n"
2223 " b = 2,\n"
2224 " c = 3,\n"
2225 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002226}
2227
Nico Weber7769a902013-01-14 05:49:49 +00002228TEST_F(FormatTest, FormatsBitfields) {
2229 verifyFormat("struct Bitfields {\n"
2230 " unsigned sClass : 8;\n"
2231 " unsigned ValueKind : 2;\n"
2232 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00002233 verifyFormat("struct A {\n"
2234 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2235 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2236 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00002237 verifyFormat("struct MyStruct {\n"
2238 " uchar data;\n"
2239 " uchar : 8;\n"
2240 " uchar : 8;\n"
2241 " uchar other;\n"
2242 "};");
Nico Weber7769a902013-01-14 05:49:49 +00002243}
2244
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002245TEST_F(FormatTest, FormatsNamespaces) {
2246 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002247 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002248 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002249 "}");
2250 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002251 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002252 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002253 "}");
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002254 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002255 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002256 "void f() { f(); }\n"
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002257 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002258 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002259 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002260 "void f() { f(); }");
Manuel Klimek046b9302013-02-06 16:08:09 +00002261
2262 // This code is more common than we thought; if we
2263 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002264 // its own line, which is undesirable.
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002265 verifyFormat("namespace {};");
Manuel Klimek046b9302013-02-06 16:08:09 +00002266 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002267 "class A {};\n"
Manuel Klimek046b9302013-02-06 16:08:09 +00002268 "};");
Daniel Jasper251b3c92013-07-01 11:22:57 +00002269
2270 verifyFormat("namespace {\n"
2271 "int SomeVariable = 0; // comment\n"
2272 "} // namespace");
2273 EXPECT_EQ("#ifndef HEADER_GUARD\n"
2274 "#define HEADER_GUARD\n"
2275 "namespace my_namespace {\n"
2276 "int i;\n"
2277 "} // my_namespace\n"
2278 "#endif // HEADER_GUARD",
2279 format("#ifndef HEADER_GUARD\n"
2280 " #define HEADER_GUARD\n"
2281 " namespace my_namespace {\n"
2282 "int i;\n"
2283 "} // my_namespace\n"
2284 "#endif // HEADER_GUARD"));
Daniel Jasper65ee3472013-07-31 23:16:02 +00002285
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00002286 EXPECT_EQ("namespace A::B {\n"
2287 "class C {};\n"
2288 "}",
2289 format("namespace A::B {\n"
2290 "class C {};\n"
2291 "}"));
2292
Daniel Jasper65ee3472013-07-31 23:16:02 +00002293 FormatStyle Style = getLLVMStyle();
2294 Style.NamespaceIndentation = FormatStyle::NI_All;
2295 EXPECT_EQ("namespace out {\n"
2296 " int i;\n"
2297 " namespace in {\n"
2298 " int i;\n"
2299 " } // namespace\n"
2300 "} // namespace",
2301 format("namespace out {\n"
2302 "int i;\n"
2303 "namespace in {\n"
2304 "int i;\n"
2305 "} // namespace\n"
2306 "} // namespace",
2307 Style));
2308
2309 Style.NamespaceIndentation = FormatStyle::NI_Inner;
2310 EXPECT_EQ("namespace out {\n"
2311 "int i;\n"
2312 "namespace in {\n"
2313 " int i;\n"
2314 "} // namespace\n"
2315 "} // namespace",
2316 format("namespace out {\n"
2317 "int i;\n"
2318 "namespace in {\n"
2319 "int i;\n"
2320 "} // namespace\n"
2321 "} // namespace",
2322 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002323}
2324
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002325TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00002326
Daniel Jasper40aacf42013-03-14 13:45:21 +00002327TEST_F(FormatTest, FormatsInlineASM) {
2328 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00002329 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00002330 verifyFormat(
2331 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2332 " \"cpuid\\n\\t\"\n"
2333 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00002334 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00002335 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00002336 EXPECT_EQ(
2337 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002338 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002339 " mov edx,[that] // vtable in edx\n"
2340 " mov eax,methodIndex\n"
2341 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002342 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002343 "}",
2344 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2345 " __asm {\n"
2346 " mov edx,[that] // vtable in edx\n"
2347 " mov eax,methodIndex\n"
2348 " call [edx][eax*4] // stdcall\n"
2349 " }\n"
2350 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00002351 EXPECT_EQ("_asm {\n"
2352 " xor eax, eax;\n"
2353 " cpuid;\n"
2354 "}",
2355 format("_asm {\n"
2356 " xor eax, eax;\n"
2357 " cpuid;\n"
2358 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00002359 verifyFormat("void function() {\n"
2360 " // comment\n"
2361 " asm(\"\");\n"
2362 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00002363 EXPECT_EQ("__asm {\n"
2364 "}\n"
2365 "int i;",
2366 format("__asm {\n"
2367 "}\n"
2368 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00002369}
2370
Nico Weberd5650bd2013-01-07 16:36:17 +00002371TEST_F(FormatTest, FormatTryCatch) {
2372 verifyFormat("try {\n"
2373 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002374 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002375 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002376 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002377 " exit(42);\n"
2378 "}");
2379
2380 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00002381 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002382 " return 5;\n"
2383 "}");
2384 verifyFormat("class A {\n"
2385 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002386 " A() try : a(0) {\n"
2387 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002388 " throw;\n"
2389 " }\n"
2390 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00002391
2392 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002393 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00002394}
2395
Nico Weberfac23712015-02-04 15:26:27 +00002396TEST_F(FormatTest, FormatSEHTryCatch) {
2397 verifyFormat("__try {\n"
2398 " int a = b * c;\n"
2399 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2400 " // Do nothing.\n"
2401 "}");
2402
2403 verifyFormat("__try {\n"
2404 " int a = b * c;\n"
2405 "} __finally {\n"
2406 " // Do nothing.\n"
2407 "}");
2408
2409 verifyFormat("DEBUG({\n"
2410 " __try {\n"
2411 " } __finally {\n"
2412 " }\n"
2413 "});\n");
2414}
2415
Daniel Jasper04a71a42014-05-08 11:58:24 +00002416TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2417 verifyFormat("try {\n"
2418 " f();\n"
2419 "} catch {\n"
2420 " g();\n"
2421 "}");
2422 verifyFormat("try {\n"
2423 " f();\n"
2424 "} catch (A a) MACRO(x) {\n"
2425 " g();\n"
2426 "} catch (B b) MACRO(x) {\n"
2427 " g();\n"
2428 "}");
2429}
2430
2431TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2432 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00002433 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2434 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00002435 Style.BreakBeforeBraces = BraceStyle;
2436 verifyFormat("try {\n"
2437 " // something\n"
2438 "} catch (...) {\n"
2439 " // something\n"
2440 "}",
2441 Style);
2442 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00002443 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2444 verifyFormat("try {\n"
2445 " // something\n"
2446 "}\n"
2447 "catch (...) {\n"
2448 " // something\n"
2449 "}",
2450 Style);
Nico Weberfac23712015-02-04 15:26:27 +00002451 verifyFormat("__try {\n"
2452 " // something\n"
2453 "}\n"
2454 "__finally {\n"
2455 " // something\n"
2456 "}",
2457 Style);
Nico Weber33381f52015-02-07 01:57:32 +00002458 verifyFormat("@try {\n"
2459 " // something\n"
2460 "}\n"
2461 "@finally {\n"
2462 " // something\n"
2463 "}",
2464 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002465 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2466 verifyFormat("try\n"
2467 "{\n"
2468 " // something\n"
2469 "}\n"
2470 "catch (...)\n"
2471 "{\n"
2472 " // something\n"
2473 "}",
2474 Style);
2475 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2476 verifyFormat("try\n"
2477 " {\n"
2478 " // something\n"
2479 " }\n"
2480 "catch (...)\n"
2481 " {\n"
2482 " // something\n"
2483 " }",
2484 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00002485 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2486 Style.BraceWrapping.BeforeCatch = true;
2487 verifyFormat("try {\n"
2488 " // something\n"
2489 "}\n"
2490 "catch (...) {\n"
2491 " // something\n"
2492 "}",
2493 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002494}
2495
Nico Weberd5650bd2013-01-07 16:36:17 +00002496TEST_F(FormatTest, FormatObjCTryCatch) {
Manuel Klimek2acb7b72013-01-11 19:17:44 +00002497 verifyFormat("@try {\n"
2498 " f();\n"
Nico Weber33381f52015-02-07 01:57:32 +00002499 "} @catch (NSException e) {\n"
Manuel Klimek2acb7b72013-01-11 19:17:44 +00002500 " @throw;\n"
Nico Weber33381f52015-02-07 01:57:32 +00002501 "} @finally {\n"
Manuel Klimek2acb7b72013-01-11 19:17:44 +00002502 " exit(42);\n"
2503 "}");
Nico Weber33381f52015-02-07 01:57:32 +00002504 verifyFormat("DEBUG({\n"
2505 " @try {\n"
2506 " } @finally {\n"
2507 " }\n"
2508 "});\n");
Nico Weberd5650bd2013-01-07 16:36:17 +00002509}
2510
Nico Weber45c48122015-06-28 01:06:16 +00002511TEST_F(FormatTest, FormatObjCAutoreleasepool) {
2512 FormatStyle Style = getLLVMStyle();
2513 verifyFormat("@autoreleasepool {\n"
2514 " f();\n"
2515 "}\n"
2516 "@autoreleasepool {\n"
2517 " f();\n"
2518 "}\n",
2519 Style);
2520 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2521 verifyFormat("@autoreleasepool\n"
2522 "{\n"
2523 " f();\n"
2524 "}\n"
2525 "@autoreleasepool\n"
2526 "{\n"
2527 " f();\n"
2528 "}\n",
2529 Style);
2530}
2531
Daniel Jaspere25509f2012-12-17 11:29:41 +00002532TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002533 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00002534
Daniel Jaspera44991332015-04-29 13:06:49 +00002535 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2536 " 100000000, "
2537 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00002538
Daniel Jasper473c62c2013-05-17 09:35:01 +00002539 // Here, everything other than the "}" would fit on a line.
2540 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002541 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002542 EXPECT_EQ("S s = {a,\n"
2543 "\n"
2544 " b};",
2545 format("S s = {\n"
2546 " a,\n"
2547 "\n"
2548 " b\n"
2549 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00002550
2551 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2552 // line. However, the formatting looks a bit off and this probably doesn't
2553 // happen often in practice.
2554 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002555 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00002556 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00002557}
2558
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002559TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002560 verifyFormat("const struct A a = {.a = 1, .b = 2};");
2561 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2562 " .bbbbbbbbbb = 2,\n"
2563 " .cccccccccc = 3,\n"
2564 " .dddddddddd = 4,\n"
2565 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002566 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002567 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2568 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2569 " .ccccccccccccccccccccccccccc = 3,\n"
2570 " .ddddddddddddddddddddddddddd = 4,\n"
2571 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002572
2573 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
2574}
2575
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002576TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002577 verifyFormat("static A x = {{{}}};\n");
2578 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2579 " {init1, init2, init3, init4}}};",
2580 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00002581
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002582 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002583 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2584 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2585 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2586 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00002587 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002588 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2589 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2590 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00002591 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2592 " {rect.fRight - rect.fLeft, rect.fBottom - "
2593 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002594
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002595 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00002596 "SomeArrayOfSomeType a = {\n"
2597 " {{1, 2, 3},\n"
2598 " {1, 2, 3},\n"
2599 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
2600 " 333333333333333333333333333333},\n"
2601 " {1, 2, 3},\n"
2602 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00002603 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00002604 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002605 " {{1, 2, 3}},\n"
2606 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002607 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2608 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002609 " {{1, 2, 3}},\n"
2610 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002611
Daniel Jaspera44991332015-04-29 13:06:49 +00002612 verifyFormat("struct {\n"
2613 " unsigned bit;\n"
2614 " const char *const name;\n"
2615 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2616 " {kOsWin, \"Windows\"},\n"
2617 " {kOsLinux, \"Linux\"},\n"
2618 " {kOsCrOS, \"Chrome OS\"}};");
2619 verifyFormat("struct {\n"
2620 " unsigned bit;\n"
2621 " const char *const name;\n"
2622 "} kBitsToOs[] = {\n"
2623 " {kOsMac, \"Mac\"},\n"
2624 " {kOsWin, \"Windows\"},\n"
2625 " {kOsLinux, \"Linux\"},\n"
2626 " {kOsCrOS, \"Chrome OS\"},\n"
2627 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002628}
2629
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002630TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2631 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2632 " \\\n"
2633 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2634}
2635
Daniel Jasperda16db32013-01-07 10:48:50 +00002636TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002637 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2638 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00002639
2640 // Do break defaulted and deleted functions.
2641 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2642 " default;",
2643 getLLVMStyleWithColumns(40));
2644 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2645 " delete;",
2646 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002647}
2648
2649TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2650 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2651 getLLVMStyleWithColumns(40));
2652 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2653 getLLVMStyleWithColumns(40));
2654 EXPECT_EQ("#define Q \\\n"
2655 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
2656 " \"aaaaaaaa.cpp\"",
2657 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2658 getLLVMStyleWithColumns(40)));
2659}
2660
2661TEST_F(FormatTest, UnderstandsLinePPDirective) {
2662 EXPECT_EQ("# 123 \"A string literal\"",
2663 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00002664}
2665
Manuel Klimek591b5802013-01-31 15:58:48 +00002666TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00002667 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00002668 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002669}
2670
2671TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2672 EXPECT_EQ("#line 42 \"test\"\n",
2673 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002674 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
2675 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002676}
2677
2678TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2679 EXPECT_EQ("#line 42 \"test\"",
2680 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002681 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002682}
2683
Daniel Jasper877615c2013-10-11 19:45:02 +00002684TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2685 verifyFormat("#define A \\x20");
2686 verifyFormat("#define A \\ x20");
2687 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
2688 verifyFormat("#define A ''");
2689 verifyFormat("#define A ''qqq");
2690 verifyFormat("#define A `qqq");
2691 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00002692 EXPECT_EQ("const char *c = STRINGIFY(\n"
2693 "\\na : b);",
2694 format("const char * c = STRINGIFY(\n"
2695 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00002696
2697 verifyFormat("a\r\\");
2698 verifyFormat("a\v\\");
2699 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00002700}
2701
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002702TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002703 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2704 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002705 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002706 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00002707 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00002708
2709 verifyFormat("#define A A\n#define A A");
2710 verifyFormat("#define A(X) A\n#define A A");
2711
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002712 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2713 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002714}
2715
2716TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002717 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002718 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002719 "#define A( \\\n"
2720 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002721 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002722 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002723 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002724 " #include \"a.h\"\n"
2725 "#define A(A,\\\n"
2726 " B)\n"
2727 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002728 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002729 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002730}
2731
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002732TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002733
2734TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2735 EXPECT_EQ("#define A \\\n"
2736 " c; \\\n"
2737 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002738 "f;",
2739 format("#define A c; e;\n"
2740 "f;",
2741 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002742}
2743
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002744TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002745
Manuel Klimek1abf7892013-01-04 23:34:14 +00002746TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002747 EXPECT_EQ("int x,\n"
2748 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002749 " y;",
2750 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002751}
2752
Manuel Klimek09e07972013-01-05 21:34:55 +00002753TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002754 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002755 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002756 verifyFormat("#define A \\\n"
2757 " { \\\n"
2758 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002759 " }",
2760 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002761
2762 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002763 " void function##X()",
2764 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002765
2766 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002767 " void a##b##c()",
2768 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002769
Daniel Jasper39825ea2013-01-14 15:40:57 +00002770 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002771}
2772
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002773TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002774 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2775 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002776}
2777
Manuel Klimek0c137952013-02-11 12:33:24 +00002778TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2779 EXPECT_EQ("#define A b;", format("#define A \\\n"
2780 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002781 " b;",
2782 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002783 EXPECT_EQ("#define A \\\n"
2784 " \\\n"
2785 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002786 " b;",
2787 format("#define A \\\n"
2788 " \\\n"
2789 " a; \\\n"
2790 " b;",
2791 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002792 EXPECT_EQ("#define A \\\n"
2793 " a; \\\n"
2794 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002795 " b;",
2796 format("#define A \\\n"
2797 " a; \\\n"
2798 " \\\n"
2799 " b;",
2800 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002801}
2802
Daniel Jasper00475962013-02-19 17:14:38 +00002803TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002804 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002805 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002806 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002807 " case 2\n",
2808 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002809 verifyFormat("#define MACRO(a) \\\n"
2810 " if (a) \\\n"
2811 " f(); \\\n"
2812 " else \\\n"
2813 " g()",
2814 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002815 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002816 verifyIncompleteFormat("#define STR(x) #x\n"
2817 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002818 verifyFormat("#pragma omp threadprivate( \\\n"
2819 " y)), // expected-warning",
2820 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002821 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002822 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002823 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002824 "#define b \\\n"
2825 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002826 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002827 "a",
2828 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002829 verifyFormat("#define A \\\n"
2830 " { \\\n"
2831 " {\n"
2832 "#define B \\\n"
2833 " } \\\n"
2834 " }",
2835 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002836 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002837 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002838 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002839 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002840}
2841
Daniel Jasper40e19212013-05-29 13:16:10 +00002842TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2843 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2844 EXPECT_EQ("class A : public QObject {\n"
2845 " Q_OBJECT\n"
2846 "\n"
2847 " A() {}\n"
2848 "};",
2849 format("class A : public QObject {\n"
2850 " Q_OBJECT\n"
2851 "\n"
2852 " A() {\n}\n"
2853 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002854 EXPECT_EQ("MACRO\n"
2855 "/*static*/ int i;",
2856 format("MACRO\n"
2857 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002858 EXPECT_EQ("SOME_MACRO\n"
2859 "namespace {\n"
2860 "void f();\n"
2861 "}",
2862 format("SOME_MACRO\n"
2863 " namespace {\n"
2864 "void f( );\n"
2865 "}"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002866 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002867 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2868 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002869 // Only if everything is upper case.
2870 EXPECT_EQ("class A : public QObject {\n"
2871 " Q_Object A() {}\n"
2872 "};",
2873 format("class A : public QObject {\n"
2874 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002875 " A() {\n}\n"
2876 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002877
2878 // Only if the next line can actually start an unwrapped line.
2879 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2880 format("SOME_WEIRD_LOG_MACRO\n"
2881 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002882
2883 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002884 "(n, buffers))\n",
2885 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002886}
2887
Alexander Kornienkode644272013-04-08 22:16:06 +00002888TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2889 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2890 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2891 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002892 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002893 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2894 "int *createScopDetectionPass() { return 0; }",
2895 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2896 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2897 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2898 " class X {};\n"
2899 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2900 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002901 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2902 // braces, so that inner block is indented one level more.
2903 EXPECT_EQ("int q() {\n"
2904 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2905 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2906 " IPC_END_MESSAGE_MAP()\n"
2907 "}",
2908 format("int q() {\n"
2909 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2910 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2911 " IPC_END_MESSAGE_MAP()\n"
2912 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002913
Daniel Jasper352dae12014-01-03 11:50:46 +00002914 // Same inside macros.
2915 EXPECT_EQ("#define LIST(L) \\\n"
2916 " L(A) \\\n"
2917 " L(B) \\\n"
2918 " L(C)",
2919 format("#define LIST(L) \\\n"
2920 " L(A) \\\n"
2921 " L(B) \\\n"
2922 " L(C)",
2923 getGoogleStyle()));
2924
Daniel Jasper545c6522013-09-17 09:26:07 +00002925 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002926 EXPECT_EQ("int q() {\n"
2927 " f(x);\n"
2928 " f(x) {}\n"
2929 " f(x)->g();\n"
2930 " f(x)->*g();\n"
2931 " f(x).g();\n"
2932 " f(x) = x;\n"
2933 " f(x) += x;\n"
2934 " f(x) -= x;\n"
2935 " f(x) *= x;\n"
2936 " f(x) /= x;\n"
2937 " f(x) %= x;\n"
2938 " f(x) &= x;\n"
2939 " f(x) |= x;\n"
2940 " f(x) ^= x;\n"
2941 " f(x) >>= x;\n"
2942 " f(x) <<= x;\n"
2943 " f(x)[y].z();\n"
2944 " LOG(INFO) << x;\n"
2945 " ifstream(x) >> x;\n"
2946 "}\n",
2947 format("int q() {\n"
2948 " f(x)\n;\n"
2949 " f(x)\n {}\n"
2950 " f(x)\n->g();\n"
2951 " f(x)\n->*g();\n"
2952 " f(x)\n.g();\n"
2953 " f(x)\n = x;\n"
2954 " f(x)\n += x;\n"
2955 " f(x)\n -= x;\n"
2956 " f(x)\n *= x;\n"
2957 " f(x)\n /= x;\n"
2958 " f(x)\n %= x;\n"
2959 " f(x)\n &= x;\n"
2960 " f(x)\n |= x;\n"
2961 " f(x)\n ^= x;\n"
2962 " f(x)\n >>= x;\n"
2963 " f(x)\n <<= x;\n"
2964 " f(x)\n[y].z();\n"
2965 " LOG(INFO)\n << x;\n"
2966 " ifstream(x)\n >> x;\n"
2967 "}\n"));
2968 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002969 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002970 " if (1) {\n"
2971 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002972 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002973 " while (1) {\n"
2974 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002975 " F(x)\n"
2976 " G(x);\n"
2977 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002978 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002979 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002980 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002981 " }\n"
2982 "}\n",
2983 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002984 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002985 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002986 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002987 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002988 "F(x)\n"
2989 "G(x);\n"
2990 "F(x)\n"
2991 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002992 "}\n"));
2993 EXPECT_EQ("class A {\n"
2994 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002995 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002996 " A(X x)\n" // FIXME: function-level try blocks are broken.
2997 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002998 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002999 " }\n"
3000 "};",
3001 format("class A {\n"
3002 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003003 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003004 " A(X x)\n"
3005 " try : t(0) {} catch (...) {}\n"
3006 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00003007 EXPECT_EQ("class SomeClass {\n"
3008 "public:\n"
3009 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3010 "};",
3011 format("class SomeClass {\n"
3012 "public:\n"
3013 " SomeClass()\n"
3014 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3015 "};"));
3016 EXPECT_EQ("class SomeClass {\n"
3017 "public:\n"
3018 " SomeClass()\n"
3019 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3020 "};",
3021 format("class SomeClass {\n"
3022 "public:\n"
3023 " SomeClass()\n"
3024 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3025 "};",
3026 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00003027
3028 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00003029}
3030
Manuel Klimek4fe43002013-05-22 12:51:29 +00003031TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3032 verifyFormat("#define A \\\n"
3033 " f({ \\\n"
3034 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003035 " });",
3036 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00003037}
3038
Manuel Klimekef2cfb12013-01-05 22:14:16 +00003039TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
3040 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
3041}
3042
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003043TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003044 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003045}
3046
Manuel Klimek1058d982013-01-06 20:07:31 +00003047TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3048 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
3049 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3050 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
3051 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3052}
Manuel Klimek1abf7892013-01-04 23:34:14 +00003053
Daniel Jaspere2408e32015-05-06 11:16:43 +00003054TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003055 EXPECT_EQ(
3056 "#define A \\\n int i; \\\n int j;",
3057 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003058 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00003059 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003060 EXPECT_EQ("/* \\ \\ \\\n*/", format("\\\n/* \\ \\ \\\n*/"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00003061 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003062}
3063
Alexander Kornienko00691cf2015-01-12 13:11:12 +00003064TEST_F(FormatTest, DontCrashOnBlockComments) {
3065 EXPECT_EQ(
3066 "int xxxxxxxxx; /* "
3067 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n"
3068 "zzzzzz\n"
3069 "0*/",
3070 format("int xxxxxxxxx; /* "
3071 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n"
3072 "0*/"));
3073}
3074
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003075TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3076 verifyFormat("#define A \\\n"
3077 " int v( \\\n"
3078 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003079 " int i;",
3080 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003081}
3082
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003083TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00003084 EXPECT_EQ(
3085 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3086 " \\\n"
3087 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3088 "\n"
3089 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3090 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3091 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
3092 "\\\n"
3093 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3094 " \n"
3095 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3096 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003097}
3098
Manuel Klimek52b15152013-01-09 15:25:02 +00003099TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3100 EXPECT_EQ("int\n"
3101 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003102 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003103 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003104 verifyFormat("functionCallTo(\n"
3105 " someOtherFunction(\n"
3106 " withSomeParameters, whichInSequence,\n"
3107 " areLongerThanALine(andAnotherCall,\n"
3108 "#define A B\n"
3109 " withMoreParamters,\n"
3110 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003111 " andMoreParameters),\n"
3112 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003113 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003114 verifyFormat("Foo::Foo()\n"
3115 "#ifdef BAR\n"
3116 " : baz(0)\n"
3117 "#endif\n"
3118 "{\n"
3119 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003120 verifyFormat("void f() {\n"
3121 " if (true)\n"
3122 "#ifdef A\n"
3123 " f(42);\n"
3124 " x();\n"
3125 "#else\n"
3126 " g();\n"
3127 " x();\n"
3128 "#endif\n"
3129 "}");
3130 verifyFormat("void f(param1, param2,\n"
3131 " param3,\n"
3132 "#ifdef A\n"
3133 " param4(param5,\n"
3134 "#ifdef A1\n"
3135 " param6,\n"
3136 "#ifdef A2\n"
3137 " param7),\n"
3138 "#else\n"
3139 " param8),\n"
3140 " param9,\n"
3141 "#endif\n"
3142 " param10,\n"
3143 "#endif\n"
3144 " param11)\n"
3145 "#else\n"
3146 " param12)\n"
3147 "#endif\n"
3148 "{\n"
3149 " x();\n"
3150 "}",
3151 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003152 verifyFormat("#if 1\n"
3153 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003154 verifyFormat("#if 1\n"
3155 "#endif\n"
3156 "#if 1\n"
3157 "#else\n"
3158 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003159 verifyFormat("DEBUG({\n"
3160 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3161 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3162 "});\n"
3163 "#if a\n"
3164 "#else\n"
3165 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003166
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003167 verifyIncompleteFormat("void f(\n"
3168 "#if A\n"
3169 " );\n"
3170 "#else\n"
3171 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003172}
3173
Manuel Klimek14bd9172014-01-29 08:49:02 +00003174TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3175 verifyFormat("#endif\n"
3176 "#if B");
3177}
3178
Manuel Klimek88033d72013-10-21 08:11:15 +00003179TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3180 FormatStyle SingleLine = getLLVMStyle();
3181 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003182 verifyFormat("#if 0\n"
3183 "#elif 1\n"
3184 "#endif\n"
3185 "void foo() {\n"
3186 " if (test) foo2();\n"
3187 "}",
3188 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003189}
3190
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003191TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003192 verifyFormat("functionCall({ int i; });");
3193 verifyFormat("functionCall({\n"
3194 " int i;\n"
3195 " int j;\n"
3196 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003197 verifyFormat("functionCall(\n"
3198 " {\n"
3199 " int i;\n"
3200 " int j;\n"
3201 " },\n"
3202 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003203 verifyFormat("functionA(functionB({\n"
3204 " int i;\n"
3205 " int j;\n"
3206 " }),\n"
3207 " aaaa, bbbb, cccc);");
3208 verifyFormat("functionCall(\n"
3209 " {\n"
3210 " int i;\n"
3211 " int j;\n"
3212 " },\n"
3213 " aaaa, bbbb, // comment\n"
3214 " cccc);");
3215 verifyFormat("functionA(functionB({\n"
3216 " int i;\n"
3217 " int j;\n"
3218 " }),\n"
3219 " aaaa, bbbb, // comment\n"
3220 " cccc);");
3221 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3222 verifyFormat("functionCall(aaaa, bbbb, {\n"
3223 " int i;\n"
3224 " int j;\n"
3225 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003226 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003227 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003228 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003229 " int i; // break\n"
3230 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003231 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3232 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003233 verifyFormat("DEBUG({\n"
3234 " if (a)\n"
3235 " f();\n"
3236 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003237}
3238
3239TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003240 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003241 "int i;",
3242 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003243}
3244
3245TEST_F(FormatTest, LayoutNestedBlocks) {
3246 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3247 " struct s {\n"
3248 " int i;\n"
3249 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003250 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003251 " for (int i = 0; i < 10; ++i)\n"
3252 " return;\n"
3253 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003254 verifyFormat("call(parameter, {\n"
3255 " something();\n"
3256 " // Comment using all columns.\n"
3257 " somethingelse();\n"
3258 "});",
3259 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003260 verifyFormat("DEBUG( //\n"
3261 " { f(); }, a);");
3262 verifyFormat("DEBUG( //\n"
3263 " {\n"
3264 " f(); //\n"
3265 " },\n"
3266 " a);");
3267
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003268 EXPECT_EQ("call(parameter, {\n"
3269 " something();\n"
3270 " // Comment too\n"
3271 " // looooooooooong.\n"
3272 " somethingElse();\n"
3273 "});",
3274 format("call(parameter, {\n"
3275 " something();\n"
3276 " // Comment too looooooooooong.\n"
3277 " somethingElse();\n"
3278 "});",
3279 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003280 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003281 EXPECT_EQ("DEBUG({ // comment\n"
3282 " int i;\n"
3283 "});",
3284 format("DEBUG({ // comment\n"
3285 "int i;\n"
3286 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003287 EXPECT_EQ("DEBUG({\n"
3288 " int i;\n"
3289 "\n"
3290 " // comment\n"
3291 " int j;\n"
3292 "});",
3293 format("DEBUG({\n"
3294 " int i;\n"
3295 "\n"
3296 " // comment\n"
3297 " int j;\n"
3298 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003299
3300 verifyFormat("DEBUG({\n"
3301 " if (a)\n"
3302 " return;\n"
3303 "});");
3304 verifyGoogleFormat("DEBUG({\n"
3305 " if (a) return;\n"
3306 "});");
3307 FormatStyle Style = getGoogleStyle();
3308 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003309 verifyFormat("Debug(aaaaa,\n"
3310 " {\n"
3311 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3312 " },\n"
3313 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003314 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003315
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003316 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3317
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003318 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003319}
3320
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003321TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3322 EXPECT_EQ("#define MACRO() \\\n"
3323 " Debug(aaa, /* force line break */ \\\n"
3324 " { \\\n"
3325 " int i; \\\n"
3326 " int j; \\\n"
3327 " })",
3328 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3329 " { int i; int j; })",
3330 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003331
3332 EXPECT_EQ("#define A \\\n"
3333 " [] { \\\n"
3334 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3335 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3336 " }",
3337 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3338 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3339 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003340}
3341
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003342TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3343 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003344 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003345 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003346}
3347
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003348TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3349 FormatStyle Style = getLLVMStyle();
3350 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3351 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3352 verifyFormat("FOO_BEGIN\n"
3353 " FOO_ENTRY\n"
3354 "FOO_END", Style);
3355 verifyFormat("FOO_BEGIN\n"
3356 " NESTED_FOO_BEGIN\n"
3357 " NESTED_FOO_ENTRY\n"
3358 " NESTED_FOO_END\n"
3359 "FOO_END", Style);
3360 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3361 " int x;\n"
3362 " x = 1;\n"
3363 "FOO_END(Baz)", Style);
3364}
3365
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003366//===----------------------------------------------------------------------===//
3367// Line break tests.
3368//===----------------------------------------------------------------------===//
3369
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003370TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003371 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003372 "void f() {\n"
3373 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3374 " parameter, parameter, parameter)),\n"
3375 " SecondLongCall(parameter));\n"
3376 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003377 verifyFormat(
3378 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3379 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3380 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3381 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3382 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003383 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3384 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3385 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3386 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003387 verifyFormat(
3388 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3389 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3390 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3391 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003392 verifyFormat("int a = bbbb && ccc && fffff(\n"
3393 "#define A Just forcing a new line\n"
3394 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003395}
3396
Daniel Jasperd69fc772013-05-08 14:12:04 +00003397TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3398 verifyFormat(
3399 "bool aaaaaaa =\n"
3400 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3401 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003402 verifyFormat(
3403 "bool aaaaaaa =\n"
3404 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3405 " bbbbbbbb();");
3406
Daniel Jasperd69fc772013-05-08 14:12:04 +00003407 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3408 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3409 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003410 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3411 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3412 " ccccccccc == ddddddddddd;");
3413 verifyFormat(
3414 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3415 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3416 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003417
3418 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3419 " aaaaaa) &&\n"
3420 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003421 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3422 " aaaaaa) >>\n"
3423 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003424 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003425 " SourceMgr.getSpellingColumnNumber(\n"
3426 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3427 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003428
Daniel Jasper68d888c2013-06-03 08:42:05 +00003429 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3430 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3431 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003432 verifyFormat("b = a &&\n"
3433 " // Comment\n"
3434 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003435
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003436 // If the LHS of a comparison is not a binary expression itself, the
3437 // additional linebreak confuses many people.
3438 verifyFormat(
3439 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3440 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3441 "}");
3442 verifyFormat(
3443 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3444 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3445 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003446 verifyFormat(
3447 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3448 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3449 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003450 // Even explicit parentheses stress the precedence enough to make the
3451 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003452 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3453 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3454 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003455 // This cases is borderline, but with the indentation it is still readable.
3456 verifyFormat(
3457 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3458 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3459 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3460 "}",
3461 getLLVMStyleWithColumns(75));
3462
3463 // If the LHS is a binary expression, we should still use the additional break
3464 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003465 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3466 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3467 " 5) {\n"
3468 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003469
Daniel Jasper571f1af2013-05-14 20:39:56 +00003470 FormatStyle OnePerLine = getLLVMStyle();
3471 OnePerLine.BinPackParameters = false;
3472 verifyFormat(
3473 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3474 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3475 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3476 OnePerLine);
Daniel Jasperd69fc772013-05-08 14:12:04 +00003477}
3478
Daniel Jasper6bee6822013-04-08 20:33:42 +00003479TEST_F(FormatTest, ExpressionIndentation) {
3480 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3481 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3482 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3483 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3484 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3485 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3486 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3487 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3488 " ccccccccccccccccccccccccccccccccccccccccc;");
3489 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3490 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3491 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3492 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3493 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3494 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3495 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3496 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3497 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3498 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3499 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3500 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003501 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003502 "} else if (aaaaa &&\n"
3503 " bbbbb > // break\n"
3504 " ccccc) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003505 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003506
3507 // Presence of a trailing comment used to change indentation of b.
3508 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3509 " b;\n"
3510 "return aaaaaaaaaaaaaaaaaaa +\n"
3511 " b; //",
3512 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003513}
3514
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003515TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3516 // Not sure what the best system is here. Like this, the LHS can be found
3517 // immediately above an operator (everything with the same or a higher
3518 // indent). The RHS is aligned right of the operator and so compasses
3519 // everything until something with the same indent as the operator is found.
3520 // FIXME: Is this a good system?
3521 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003522 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003523 verifyFormat(
3524 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003525 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3526 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3527 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3528 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3529 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003530 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003531 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3532 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003533 Style);
3534 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003535 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3536 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003537 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3538 Style);
3539 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003540 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3541 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003542 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3543 Style);
3544 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3545 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003546 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3547 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003548 Style);
3549 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003550 "} else if (aaaaa\n"
3551 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003552 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003553 "}",
3554 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003555 verifyFormat("return (a)\n"
3556 " // comment\n"
3557 " + b;",
3558 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003559 verifyFormat(
3560 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3561 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3562 " + cc;",
3563 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003564
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003565 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3566 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3567 Style);
3568
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003569 // Forced by comments.
3570 verifyFormat(
3571 "unsigned ContentSize =\n"
3572 " sizeof(int16_t) // DWARF ARange version number\n"
3573 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3574 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3575 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003576
3577 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3578 " == boost::fusion::at_c<1>(iiii).second;",
3579 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003580
3581 Style.ColumnLimit = 60;
3582 verifyFormat("zzzzzzzzzz\n"
3583 " = bbbbbbbbbbbbbbbbb\n"
3584 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3585 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003586}
3587
Daniel Jasper3219e432014-12-02 13:24:51 +00003588TEST_F(FormatTest, NoOperandAlignment) {
3589 FormatStyle Style = getLLVMStyle();
3590 Style.AlignOperands = false;
3591 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003592 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3593 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3594 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3595 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3596 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3597 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3598 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3599 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3600 " > ccccccccccccccccccccccccccccccccccccccccc;",
3601 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003602
3603 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3604 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3605 " + cc;",
3606 Style);
3607 verifyFormat("int a = aa\n"
3608 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3609 " * cccccccccccccccccccccccccccccccccccc;",
3610 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003611
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003612 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003613 verifyFormat("return (a > b\n"
3614 " // comment1\n"
3615 " // comment2\n"
3616 " || c);",
3617 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003618}
3619
Daniel Jasperac043c92014-09-15 11:11:00 +00003620TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3621 FormatStyle Style = getLLVMStyle();
3622 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3623 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3624 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003625 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3626 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003627}
3628
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003629TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003630 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003631 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3632 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003633 verifyFormat("Constructor()\n"
3634 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003635 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003636 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003637 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003638 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003639
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003640 verifyFormat("template <typename T>\n"
3641 "Constructor() : Initializer(FitsOnTheLine) {}",
3642 getLLVMStyleWithColumns(45));
3643
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003644 verifyFormat(
3645 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003646 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003647
3648 verifyFormat(
3649 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003650 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003651 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003652 verifyFormat(
3653 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003654 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003655 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003656 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3657 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3658 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003659
3660 verifyFormat("Constructor()\n"
3661 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3662 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3663 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003664 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003665
Daniel Jasper65585ed2013-01-28 13:31:35 +00003666 verifyFormat("Constructor()\n"
3667 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003668 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003669
Daniel Jasper62e68172013-02-25 15:59:54 +00003670 verifyFormat("Constructor(int Parameter = 0)\n"
3671 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3672 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003673 verifyFormat("Constructor()\n"
3674 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3675 "}",
3676 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003677 verifyFormat("Constructor()\n"
3678 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3679 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003680
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003681 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003682 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003683 verifyFormat("Constructor()\n"
3684 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3685 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3686 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003687
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003688 FormatStyle OnePerLine = getLLVMStyle();
3689 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003690 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003691 verifyFormat("SomeClass::Constructor()\n"
3692 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3693 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003694 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003695 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003696 verifyFormat("SomeClass::Constructor()\n"
3697 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3698 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003699 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003700 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003701 verifyFormat("MyClass::MyClass(int var)\n"
3702 " : some_var_(var), // 4 space indent\n"
3703 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003704 "}",
3705 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003706 verifyFormat("Constructor()\n"
3707 " : aaaaa(aaaaaa),\n"
3708 " aaaaa(aaaaaa),\n"
3709 " aaaaa(aaaaaa),\n"
3710 " aaaaa(aaaaaa),\n"
3711 " aaaaa(aaaaaa) {}",
3712 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003713 verifyFormat("Constructor()\n"
3714 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3715 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3716 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003717 OnePerLine.BinPackParameters = false;
3718 verifyFormat(
3719 "Constructor()\n"
3720 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3721 " aaaaaaaaaaa().aaa(),\n"
3722 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3723 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003724 OnePerLine.ColumnLimit = 60;
3725 verifyFormat("Constructor()\n"
3726 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3727 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3728 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003729
3730 EXPECT_EQ("Constructor()\n"
3731 " : // Comment forcing unwanted break.\n"
3732 " aaaa(aaaa) {}",
3733 format("Constructor() :\n"
3734 " // Comment forcing unwanted break.\n"
3735 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003736}
3737
3738TEST_F(FormatTest, MemoizationTests) {
3739 // This breaks if the memoization lookup does not take \c Indent and
3740 // \c LastSpace into account.
3741 verifyFormat(
3742 "extern CFRunLoopTimerRef\n"
3743 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3744 " CFTimeInterval interval, CFOptionFlags flags,\n"
3745 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003746 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003747
3748 // Deep nesting somewhat works around our memoization.
3749 verifyFormat(
3750 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3751 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3752 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3753 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3754 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3755 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003756 verifyFormat(
3757 "aaaaa(\n"
3758 " aaaaa,\n"
3759 " aaaaa(\n"
3760 " aaaaa,\n"
3761 " aaaaa(\n"
3762 " aaaaa,\n"
3763 " aaaaa(\n"
3764 " aaaaa,\n"
3765 " aaaaa(\n"
3766 " aaaaa,\n"
3767 " aaaaa(\n"
3768 " aaaaa,\n"
3769 " aaaaa(\n"
3770 " aaaaa,\n"
3771 " aaaaa(\n"
3772 " aaaaa,\n"
3773 " aaaaa(\n"
3774 " aaaaa,\n"
3775 " aaaaa(\n"
3776 " aaaaa,\n"
3777 " aaaaa(\n"
3778 " aaaaa,\n"
3779 " aaaaa(\n"
3780 " aaaaa,\n"
3781 " aaaaa))))))))))));",
3782 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003783 verifyFormat(
3784 "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"
3785 " a),\n"
3786 " a),\n"
3787 " a),\n"
3788 " a),\n"
3789 " a),\n"
3790 " a),\n"
3791 " a),\n"
3792 " a),\n"
3793 " a),\n"
3794 " a),\n"
3795 " a),\n"
3796 " a),\n"
3797 " a),\n"
3798 " a),\n"
3799 " a),\n"
3800 " a),\n"
3801 " a)",
3802 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003803
3804 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003805 FormatStyle OnePerLine = getLLVMStyle();
3806 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003807 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003808 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003809 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003810 for (unsigned i = 0, e = 80; i != e; ++i) {
3811 input += " a,\n";
3812 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003813 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003814 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003815}
3816
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003817TEST_F(FormatTest, BreaksAsHighAsPossible) {
3818 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003819 "void f() {\n"
3820 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3821 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3822 " f();\n"
3823 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003824 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003825 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003826}
3827
Daniel Jasper6728fc12013-04-11 14:29:13 +00003828TEST_F(FormatTest, BreaksFunctionDeclarations) {
3829 // Principially, we break function declarations in a certain order:
3830 // 1) break amongst arguments.
3831 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3832 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003833 verifyFormat("template <class TemplateIt>\n"
3834 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3835 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003836
3837 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003838 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003839 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003840 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003841 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003842
3843 // 3) break after (.
3844 verifyFormat(
3845 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003846 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3847 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003848
3849 // 4) break before after nested name specifiers.
3850 verifyFormat(
3851 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003852 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3853 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003854 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003855
3856 // However, there are exceptions, if a sufficient amount of lines can be
3857 // saved.
3858 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3859 // more adjusting.
3860 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3861 " Cccccccccccccc cccccccccc,\n"
3862 " Cccccccccccccc cccccccccc,\n"
3863 " Cccccccccccccc cccccccccc,\n"
3864 " Cccccccccccccc cccccccccc);");
3865 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003866 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003867 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3868 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3869 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003870 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003871 verifyFormat(
3872 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3873 " Cccccccccccccc cccccccccc,\n"
3874 " Cccccccccccccc cccccccccc,\n"
3875 " Cccccccccccccc cccccccccc,\n"
3876 " Cccccccccccccc cccccccccc,\n"
3877 " Cccccccccccccc cccccccccc,\n"
3878 " Cccccccccccccc cccccccccc);");
3879 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3880 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3881 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3882 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3883 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003884
3885 // Break after multi-line parameters.
3886 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3887 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3888 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3889 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003890 verifyFormat("void SomeLoooooooooooongFunction(\n"
3891 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3892 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3893 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003894
3895 // Treat overloaded operators like other functions.
3896 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3897 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003898 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3899 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003900 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3901 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3902 verifyGoogleFormat(
3903 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3904 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003905 verifyGoogleFormat(
3906 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3907 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003908 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3909 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3910 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3911 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003912 verifyGoogleFormat(
3913 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3914 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3915 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003916 verifyGoogleFormat(
3917 "template <typename T>\n"
3918 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3919 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3920 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003921
3922 FormatStyle Style = getLLVMStyle();
3923 Style.PointerAlignment = FormatStyle::PAS_Left;
3924 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3925 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3926 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003927 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3928 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3929 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003930}
3931
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003932TEST_F(FormatTest, TrailingReturnType) {
3933 verifyFormat("auto foo() -> int;\n");
3934 verifyFormat("struct S {\n"
3935 " auto bar() const -> int;\n"
3936 "};");
3937 verifyFormat("template <size_t Order, typename T>\n"
3938 "auto load_img(const std::string &filename)\n"
3939 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003940 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3941 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003942 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003943 verifyFormat("template <typename T>\n"
3944 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3945 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003946
3947 // Not trailing return types.
3948 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003949}
3950
Daniel Jasper5be31f72013-05-21 09:16:31 +00003951TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003952 // Avoid breaking before trailing 'const' or other trailing annotations, if
3953 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003954 FormatStyle Style = getGoogleStyle();
3955 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003956 verifyFormat("void someLongFunction(\n"
3957 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003958 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003959 verifyFormat("LoooooongReturnType\n"
3960 "someLoooooooongFunction() const {}",
3961 getLLVMStyleWithColumns(47));
3962 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3963 " const {}",
3964 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003965 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3966 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3967 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3968 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3969 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3970 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003971 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3972 " aaaaaaaaaaa aaaaa) const override;");
3973 verifyGoogleFormat(
3974 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3975 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003976
Daniel Jasper5550de62014-02-17 07:57:46 +00003977 // Even if the first parameter has to be wrapped.
3978 verifyFormat("void someLongFunction(\n"
3979 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003980 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003981 verifyFormat("void someLongFunction(\n"
3982 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003983 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003984 verifyFormat("void someLongFunction(\n"
3985 " int someLongParameter) override {}",
3986 Style);
3987 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003988 " int someLongParameter) OVERRIDE {}",
3989 Style);
3990 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003991 " int someLongParameter) final {}",
3992 Style);
3993 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003994 " int someLongParameter) FINAL {}",
3995 Style);
3996 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003997 " int parameter) const override {}",
3998 Style);
3999
Daniel Jaspere3f907f2014-06-02 09:52:08 +00004000 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4001 verifyFormat("void someLongFunction(\n"
4002 " int someLongParameter) const\n"
4003 "{\n"
4004 "}",
4005 Style);
4006
Daniel Jasper5550de62014-02-17 07:57:46 +00004007 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004008 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4009 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4010 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00004011
4012 // Breaking before function-like trailing annotations is fine to keep them
4013 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004014 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4015 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4016 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4017 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4018 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4019 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004020 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4021 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004022 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004023
4024 verifyFormat(
4025 "void aaaaaaaaaaaaaaaaaa()\n"
4026 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4027 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4028 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4029 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004030 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004031 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004032 " GUARDED_BY(aaaaaaaaaaaa);");
4033 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004034 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004035 " GUARDED_BY(aaaaaaaaaaaa);");
4036 verifyGoogleFormat(
4037 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4038 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004039 verifyGoogleFormat(
4040 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4041 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004042}
4043
Daniel Jasperf090f032015-05-18 09:47:22 +00004044TEST_F(FormatTest, FunctionAnnotations) {
4045 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004046 "int OldFunction(const string &parameter) {}");
4047 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004048 "string OldFunction(const string &parameter) {}");
4049 verifyFormat("template <typename T>\n"
4050 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4051 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004052
4053 // Not function annotations.
4054 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4055 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004056 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4057 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004058 verifyFormat("MACRO(abc).function() // wrap\n"
4059 " << abc;");
4060 verifyFormat("MACRO(abc)->function() // wrap\n"
4061 " << abc;");
4062 verifyFormat("MACRO(abc)::function() // wrap\n"
4063 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004064}
4065
Daniel Jasperf7935112012-12-03 18:12:45 +00004066TEST_F(FormatTest, BreaksDesireably) {
4067 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4068 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004069 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004070 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4071 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4072 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004073
4074 verifyFormat(
4075 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004076 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004077
4078 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4079 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4080 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004081
4082 verifyFormat(
4083 "aaaaaaaa(aaaaaaaaaaaaa, aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4084 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4085 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4086 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004087
4088 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4089 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4090
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004091 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004092 "void f() {\n"
4093 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4094 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4095 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004096 verifyFormat(
4097 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4098 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4099 verifyFormat(
4100 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4101 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jaspera44991332015-04-29 13:06:49 +00004102 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4103 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4104 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004105
Daniel Jasper739b85f2015-06-29 10:42:59 +00004106 // Indent consistently independent of call expression and unary operator.
4107 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4108 " dddddddddddddddddddddddddddddd));");
4109 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4110 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004111 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004112 " dddddddddddddddddddddddddddddd));");
4113
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004114 // This test case breaks on an incorrect memoization, i.e. an optimization not
4115 // taking into account the StopAt value.
4116 verifyFormat(
4117 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004118 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4119 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4120 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004121
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004122 verifyFormat("{\n {\n {\n"
4123 " Annotation.SpaceRequiredBefore =\n"
4124 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4125 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4126 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004127
4128 // Break on an outer level if there was a break on an inner level.
4129 EXPECT_EQ("f(g(h(a, // comment\n"
4130 " b, c),\n"
4131 " d, e),\n"
4132 " x, y);",
4133 format("f(g(h(a, // comment\n"
4134 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004135
4136 // Prefer breaking similar line breaks.
4137 verifyFormat(
4138 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4139 " NSTrackingMouseEnteredAndExited |\n"
4140 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004141}
4142
Daniel Jasper18210d72014-10-09 09:52:05 +00004143TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4144 FormatStyle NoBinPacking = getGoogleStyle();
4145 NoBinPacking.BinPackParameters = false;
4146 NoBinPacking.BinPackArguments = true;
4147 verifyFormat("void f() {\n"
4148 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4150 "}",
4151 NoBinPacking);
4152 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4153 " int aaaaaaaaaaaaaaaaaaaa,\n"
4154 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4155 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004156
Daniel Jasper00693b082016-01-09 15:56:47 +00004157 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4158 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4159 " vector<int> bbbbbbbbbbbbbbb);",
4160 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004161 // FIXME: This behavior difference is probably not wanted. However, currently
4162 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4163 // template arguments from BreakBeforeParameter being set because of the
4164 // one-per-line formatting.
4165 verifyFormat(
4166 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4167 " aaaaaaaaaa> aaaaaaaaaa);",
4168 NoBinPacking);
4169 verifyFormat(
4170 "void fffffffffff(\n"
4171 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4172 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004173}
4174
Daniel Jasper9278eb92013-01-16 14:59:02 +00004175TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004176 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004177 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004178 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004179 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4180 " aaaaaaaaaaaaaaaaaaaa,\n"
4181 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4182 NoBinPacking);
4183 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4184 " aaaaaaaaaaaaa,\n"
4185 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4186 NoBinPacking);
4187 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004188 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4189 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4190 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4191 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004192 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4193 NoBinPacking);
4194 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4195 " .aaaaaaaaaaaaaaaaaa();",
4196 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004197 verifyFormat("void f() {\n"
4198 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4199 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4200 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004201 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004202
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004203 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004204 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4205 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004206 " aaaaaaaaaaaa);",
4207 NoBinPacking);
4208 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004209 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4210 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004211 " test);",
4212 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004213
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004214 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4215 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004216 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4217 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004218 NoBinPacking);
4219 verifyFormat("a(\"a\"\n"
4220 " \"a\",\n"
4221 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004222
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004223 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004224 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004225 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004226 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004227 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004228 verifyFormat(
4229 "void f() {\n"
4230 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4231 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004232 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004233 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004234 verifyFormat(
4235 "template <class SomeType, class SomeOtherType>\n"
4236 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4237 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004238}
4239
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004240TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4241 FormatStyle Style = getLLVMStyleWithColumns(15);
4242 Style.ExperimentalAutoDetectBinPacking = true;
4243 EXPECT_EQ("aaa(aaaa,\n"
4244 " aaaa,\n"
4245 " aaaa);\n"
4246 "aaa(aaaa,\n"
4247 " aaaa,\n"
4248 " aaaa);",
4249 format("aaa(aaaa,\n" // one-per-line
4250 " aaaa,\n"
4251 " aaaa );\n"
4252 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4253 Style));
4254 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4255 " aaaa);\n"
4256 "aaa(aaaa, aaaa,\n"
4257 " aaaa);",
4258 format("aaa(aaaa, aaaa,\n" // bin-packed
4259 " aaaa );\n"
4260 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4261 Style));
4262}
4263
Daniel Jasper04468962013-01-18 10:56:38 +00004264TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004265 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4266 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4267 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4268 " .StartsWith(\".init\", ORDER_INIT)\n"
4269 " .StartsWith(\".fini\", ORDER_FINI)\n"
4270 " .StartsWith(\".hash\", ORDER_HASH)\n"
4271 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004272
Daniel Jaspereb50c672013-02-15 20:33:06 +00004273 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004274 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004275 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004276 "aaaaaaa->aaaaaaa\n"
4277 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4278 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004279 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004280 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004281 "aaaaaaa->aaaaaaa\n"
4282 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4283 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4284 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004285 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004286 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004287 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004288 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4289 " aaaaaa->aaaaaaaaaaaa()\n"
4290 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004292 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004293 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004294 "void f() {\n"
4295 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004296 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004297 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004298 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004299 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004300 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004301 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004302 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004303 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004304 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004305 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004306 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004307
4308 verifyFormat(
4309 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4310 verifyFormat("aaaaaaaaaaaaaaa()\n"
4311 " .aaaaaaaaaaaaaaa()\n"
4312 " .aaaaaaaaaaaaaaa()\n"
4313 " .aaaaaaaaaaaaaaa()\n"
4314 " .aaaaaaaaaaaaaaa();");
4315 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4316 " .aaaaaaaaaaaaaaa()\n"
4317 " .aaaaaaaaaaaaaaa()\n"
4318 " .aaaaaaaaaaaaaaa();");
4319 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4320 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4321 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004322 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4323 " ->aaaaaaaaaaaaaae(0)\n"
4324 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004325
Daniel Jasper775954b2015-04-24 10:08:09 +00004326 // Don't linewrap after very short segments.
4327 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4328 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4329 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4330 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4331 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4332 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4333 verifyFormat("aaa()\n"
4334 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4335 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4336 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4337
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004338 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4339 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4340 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4341 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4342 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004343 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004344
Daniel Jaspera41aa532014-09-19 08:01:25 +00004345 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004346 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4347 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004348
4349 // Prefer not to create "hanging" indents.
4350 verifyFormat(
4351 "return !soooooooooooooome_map\n"
4352 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4353 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004354 verifyFormat(
4355 "return aaaaaaaaaaaaaaaa\n"
4356 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4357 " .aaaa(aaaaaaaaaaaaaa);");
4358 // No hanging indent here.
4359 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4360 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4361 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4362 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004363 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4364 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4365 getLLVMStyleWithColumns(60));
4366 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4367 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4368 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4369 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004370 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4371 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4372 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004373}
4374
Daniel Jasperde5c2072012-12-24 00:13:23 +00004375TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4376 verifyFormat(
4377 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004378 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004379 verifyFormat(
4380 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4381 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4382
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004383 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004384 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004385 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4386 " ccccccccccccccccccccccccc) {\n}");
4387
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004388 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004389 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004390 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4391 " ccccccccccccccccccccccccc) {\n}");
4392
Daniel Jasperde5c2072012-12-24 00:13:23 +00004393 verifyFormat(
4394 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004395 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004396 verifyFormat(
4397 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4398 " ccccccccccccccccccccccccc) {\n}");
4399
Daniel Jasper400adc62013-02-08 15:28:42 +00004400 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4401 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4402 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4403 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004404 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4405 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4406 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4407 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4408
Daniel Jasper400adc62013-02-08 15:28:42 +00004409 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4410 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4411 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004412 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4413 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4414 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004415}
4416
Daniel Jasper43b65482013-01-23 12:27:43 +00004417TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004418 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004419 "unsigned Cost =\n"
4420 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4421 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004422 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004423 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4424 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004425
4426 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004427 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4428 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004429 verifyFormat("unsigned OriginalStartColumn =\n"
4430 " SourceMgr.getSpellingColumnNumber(\n"
4431 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4432 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004433}
4434
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004435TEST_F(FormatTest, AlignsAfterAssignments) {
4436 verifyFormat(
4437 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004438 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004439 verifyFormat(
4440 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004441 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004442 verifyFormat(
4443 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004444 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004445 verifyFormat(
4446 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004447 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004448 verifyFormat(
4449 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4450 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4451 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004452}
4453
4454TEST_F(FormatTest, AlignsAfterReturn) {
4455 verifyFormat(
4456 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4457 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4458 verifyFormat(
4459 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4460 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004461 verifyFormat(
4462 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004463 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004464 verifyFormat(
4465 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004466 " aaaaaaaaaaaaaaaaaaaaaa());");
4467 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4468 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4469 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4470 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4471 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004472 verifyFormat("return\n"
4473 " // true if code is one of a or b.\n"
4474 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004475}
4476
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004477TEST_F(FormatTest, AlignsAfterOpenBracket) {
4478 verifyFormat(
4479 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4480 " aaaaaaaaa aaaaaaa) {}");
4481 verifyFormat(
4482 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4483 " aaaaaaaaaaa aaaaaaaaa);");
4484 verifyFormat(
4485 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4486 " aaaaaaaaaaaaaaaaaaaaa));");
4487 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004488 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004489 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4490 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4491 Style);
4492 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4493 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4494 Style);
4495 verifyFormat("SomeLongVariableName->someFunction(\n"
4496 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4497 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004498 verifyFormat(
4499 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4500 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4501 Style);
4502 verifyFormat(
4503 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4504 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4505 Style);
4506 verifyFormat(
4507 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4508 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4509 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004510
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004511 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4512 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4513 " b));",
4514 Style);
4515
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004516 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4517 Style.BinPackArguments = false;
4518 Style.BinPackParameters = false;
4519 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4520 " aaaaaaaaaaa aaaaaaaa,\n"
4521 " aaaaaaaaa aaaaaaa,\n"
4522 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4523 Style);
4524 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4525 " aaaaaaaaaaa aaaaaaaaa,\n"
4526 " aaaaaaaaaaa aaaaaaaaa,\n"
4527 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4528 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004529 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4530 " aaaaaaaaaaaaaaa,\n"
4531 " aaaaaaaaaaaaaaaaaaaaa,\n"
4532 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004533 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004534 verifyFormat(
4535 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4536 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4537 Style);
4538 verifyFormat(
4539 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4540 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4541 Style);
4542 verifyFormat(
4543 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4544 " aaaaaaaaaaaaaaaaaaaaa(\n"
4545 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4546 " aaaaaaaaaaaaaaaa);",
4547 Style);
4548 verifyFormat(
4549 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4550 " aaaaaaaaaaaaaaaaaaaaa(\n"
4551 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4552 " aaaaaaaaaaaaaaaa);",
4553 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004554}
4555
Daniel Jasper3219e432014-12-02 13:24:51 +00004556TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4557 FormatStyle Style = getLLVMStyleWithColumns(40);
4558 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4559 " bbbbbbbbbbbbbbbbbbbbbb);",
4560 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004561 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004562 Style.AlignOperands = false;
4563 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4564 " bbbbbbbbbbbbbbbbbbbbbb);",
4565 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004566 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004567 Style.AlignOperands = true;
4568 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4569 " bbbbbbbbbbbbbbbbbbbbbb);",
4570 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004571 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004572 Style.AlignOperands = false;
4573 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4574 " bbbbbbbbbbbbbbbbbbbbbb);",
4575 Style);
4576}
4577
Daniel Jasper399d24b2013-01-09 07:06:56 +00004578TEST_F(FormatTest, BreaksConditionalExpressions) {
4579 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004580 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
4581 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4582 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004583 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004584 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
4585 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4586 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004587 verifyFormat(
4588 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4589 " : aaaaaaaaaaaaa);");
4590 verifyFormat(
4591 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004592 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004593 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4594 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004595 verifyFormat(
4596 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4597 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4598 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004599 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4600 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4601 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4602 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4603 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4604 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4605 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4606 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4607 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4608 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4609 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4610 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004611 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4612 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4613 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4614 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4615 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004616 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4617 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4618 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004619 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4620 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4621 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4622 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004623 verifyFormat(
4624 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4625 " ? aaaaaaaaaaaaaaa\n"
4626 " : aaaaaaaaaaaaaaa;");
4627 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004628 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004629 " ? b\n"
4630 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004631 verifyFormat("return aaaa == bbbb\n"
4632 " // comment\n"
4633 " ? aaaa\n"
4634 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004635 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004636 " format(TheLine.First,\n"
4637 " IndentForLevel[TheLine.Level] >= 0\n"
4638 " ? IndentForLevel[TheLine.Level]\n"
4639 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004640 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004641 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004642 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4643 " ? aaaaaaaaaaaaaaa\n"
4644 " : bbbbbbbbbbbbbbb //\n"
4645 " ? ccccccccccccccc\n"
4646 " : ddddddddddddddd;");
4647 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4648 " ? aaaaaaaaaaaaaaa\n"
4649 " : (bbbbbbbbbbbbbbb //\n"
4650 " ? ccccccccccccccc\n"
4651 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004652 verifyFormat(
4653 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4654 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4655 " aaaaaaaaaaaaaaaaaaaaa +\n"
4656 " aaaaaaaaaaaaaaaaaaaaa\n"
4657 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004658 verifyFormat(
4659 "aaaaaa = aaaaaaaaaaaa\n"
4660 " ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4661 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4662 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004663
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004664 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004665 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004666 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004667 "void f() {\n"
4668 " g(aaa,\n"
4669 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4670 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4671 " ? aaaaaaaaaaaaaaa\n"
4672 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004673 "}",
4674 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004675 verifyFormat(
4676 "void f() {\n"
4677 " g(aaa,\n"
4678 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4679 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4680 " ?: aaaaaaaaaaaaaaa);\n"
4681 "}",
4682 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004683
4684 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4685 " // comment.\n"
4686 " ccccccccccccccccccccccccccccccccccccccc\n"
4687 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4688 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004689
4690 // Assignments in conditional expressions. Apparently not uncommon :-(.
4691 verifyFormat("return a != b\n"
4692 " // comment\n"
4693 " ? a = b\n"
4694 " : a = b;");
4695 verifyFormat("return a != b\n"
4696 " // comment\n"
4697 " ? a = a != b\n"
4698 " // comment\n"
4699 " ? a = b\n"
4700 " : a\n"
4701 " : a;\n");
4702 verifyFormat("return a != b\n"
4703 " // comment\n"
4704 " ? a\n"
4705 " : a = a != b\n"
4706 " // comment\n"
4707 " ? a = b\n"
4708 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004709}
4710
Daniel Jasper165b29e2013-11-08 00:57:11 +00004711TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4712 FormatStyle Style = getLLVMStyle();
4713 Style.BreakBeforeTernaryOperators = false;
4714 Style.ColumnLimit = 70;
4715 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004716 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
4717 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4718 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004719 Style);
4720 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004721 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
4722 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4723 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004724 Style);
4725 verifyFormat(
4726 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4727 " aaaaaaaaaaaaa);",
4728 Style);
4729 verifyFormat(
4730 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4731 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4732 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4733 " aaaaaaaaaaaaa);",
4734 Style);
4735 verifyFormat(
4736 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4737 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4738 " aaaaaaaaaaaaa);",
4739 Style);
4740 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4741 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4742 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4743 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4744 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4745 Style);
4746 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4747 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4748 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4749 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4750 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4752 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4753 Style);
4754 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4755 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4756 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4757 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4758 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4759 Style);
4760 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4761 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4762 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4763 Style);
4764 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004765 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004766 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4767 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4768 Style);
4769 verifyFormat(
4770 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4771 " aaaaaaaaaaaaaaa :\n"
4772 " aaaaaaaaaaaaaaa;",
4773 Style);
4774 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4775 " aaaaaaaaa ?\n"
4776 " b :\n"
4777 " c);",
4778 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004779 verifyFormat("unsigned Indent =\n"
4780 " format(TheLine.First,\n"
4781 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4782 " IndentForLevel[TheLine.Level] :\n"
4783 " TheLine * 2,\n"
4784 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4785 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004786 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4787 " aaaaaaaaaaaaaaa :\n"
4788 " bbbbbbbbbbbbbbb ? //\n"
4789 " ccccccccccccccc :\n"
4790 " ddddddddddddddd;",
4791 Style);
4792 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4793 " aaaaaaaaaaaaaaa :\n"
4794 " (bbbbbbbbbbbbbbb ? //\n"
4795 " ccccccccccccccc :\n"
4796 " ddddddddddddddd);",
4797 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004798 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4799 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4800 " ccccccccccccccccccccccccccc;",
4801 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004802 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4803 " aaaaa :\n"
4804 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4805 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004806}
4807
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004808TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4809 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4810 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4811 verifyFormat("bool a = true, b = false;");
4812
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004813 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004814 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004815 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004816 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004817 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004818 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004819 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004820 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004821 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4822 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4823 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4824 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4825 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4826 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004827
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004828 FormatStyle Style = getGoogleStyle();
4829 Style.PointerAlignment = FormatStyle::PAS_Left;
4830 Style.DerivePointerAlignment = false;
4831 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4832 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4833 " *b = bbbbbbbbbbbbbbbbbbb;",
4834 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004835 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4836 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4837 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004838 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004839 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004840}
4841
Nico Weber4a5030c2013-01-12 01:28:06 +00004842TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4843 verifyFormat("arr[foo ? bar : baz];");
4844 verifyFormat("f()[foo ? bar : baz];");
4845 verifyFormat("(a + b)[foo ? bar : baz];");
4846 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4847}
4848
Daniel Jasperf7935112012-12-03 18:12:45 +00004849TEST_F(FormatTest, AlignsStringLiterals) {
4850 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4851 " \"short literal\");");
4852 verifyFormat(
4853 "looooooooooooooooooooooooongFunction(\n"
4854 " \"short literal\"\n"
4855 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004856 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4857 " \" string literals\",\n"
4858 " and, other, parameters);");
Manuel Klimek02f640a2013-02-20 15:25:48 +00004859 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4860 " \"5678\";",
4861 format("fun + \"1243\" /* comment */\n"
4862 " \"5678\";",
4863 getLLVMStyleWithColumns(28)));
4864 EXPECT_EQ(
4865 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4866 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4867 " \"aaaaaaaaaaaaaaaa\";",
4868 format("aaaaaa ="
4869 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4870 "aaaaaaaaaaaaaaaaaaaaa\" "
4871 "\"aaaaaaaaaaaaaaaa\";"));
Manuel Klimek0c915712013-02-20 15:32:58 +00004872 verifyFormat("a = a + \"a\"\n"
4873 " \"a\"\n"
4874 " \"a\";");
Daniel Jasper7dd22c51b2013-05-16 04:26:02 +00004875 verifyFormat("f(\"a\", \"b\"\n"
4876 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004877
4878 verifyFormat(
4879 "#define LL_FORMAT \"ll\"\n"
4880 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4881 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004882
4883 verifyFormat("#define A(X) \\\n"
4884 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4885 " \"ccccc\"",
4886 getLLVMStyleWithColumns(23));
4887 verifyFormat("#define A \"def\"\n"
4888 "f(\"abc\" A \"ghi\"\n"
4889 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004890
4891 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004892 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004893 verifyFormat("#define A(X) \\\n"
4894 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4895 " L\"ccccc\"",
4896 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004897
4898 verifyFormat("f(@\"a\"\n"
4899 " @\"b\");");
4900 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004901 " @\"b\"\n"
4902 " @\"c\";");
4903 verifyFormat("NSString s = @\"a\"\n"
4904 " \"b\"\n"
4905 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004906}
4907
Zachary Turner448592e2015-12-18 22:20:15 +00004908TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004909 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004910 // No declarations or definitions should be moved to own line.
4911 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4912 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004913 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004914 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004915 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004916 "int f() { return 1; }\n"
4917 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004918 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004919
4920 // All declarations and definitions should have the return type moved to its
4921 // own
4922 // line.
4923 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4924 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004925 " int\n"
4926 " f() {\n"
4927 " return 1;\n"
4928 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004929 " int\n"
4930 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004931 "};\n"
4932 "int\n"
4933 "f() {\n"
4934 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004935 "}\n"
4936 "int\n"
4937 "g();\n",
4938 Style);
4939
4940 // Top-level definitions, and no kinds of declarations should have the
4941 // return type moved to its own line.
4942 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4943 verifyFormat("class B {\n"
4944 " int f() { return 1; }\n"
4945 " int g();\n"
4946 "};\n"
4947 "int\n"
4948 "f() {\n"
4949 " return 1;\n"
4950 "}\n"
4951 "int g();\n",
4952 Style);
4953
4954 // Top-level definitions and declarations should have the return type moved
4955 // to its own line.
4956 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4957 verifyFormat("class C {\n"
4958 " int f() { return 1; }\n"
4959 " int g();\n"
4960 "};\n"
4961 "int\n"
4962 "f() {\n"
4963 " return 1;\n"
4964 "}\n"
4965 "int\n"
4966 "g();\n",
4967 Style);
4968
4969 // All definitions should have the return type moved to its own line, but no
4970 // kinds of declarations.
4971 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4972 verifyFormat("class D {\n"
4973 " int\n"
4974 " f() {\n"
4975 " return 1;\n"
4976 " }\n"
4977 " int g();\n"
4978 "};\n"
4979 "int\n"
4980 "f() {\n"
4981 " return 1;\n"
4982 "}\n"
4983 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004984 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004985 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004986 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004987 " return \"\";\n"
4988 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004989 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004990 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004991 verifyFormat("template <class T>\n"
4992 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004993 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004994 " return NULL;\n"
4995 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004996 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004997 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00004998 verifyFormat("class C {\n"
4999 " int\n"
5000 " operator+() {\n"
5001 " return 1;\n"
5002 " }\n"
5003 " int\n"
5004 " operator()() {\n"
5005 " return 1;\n"
5006 " }\n"
5007 "};\n",
5008 Style);
5009 verifyFormat("void\n"
5010 "A::operator()() {}\n"
5011 "void\n"
5012 "A::operator>>() {}\n"
5013 "void\n"
5014 "A::operator+() {}\n",
5015 Style);
5016 verifyFormat("void *operator new(std::size_t s);", // No break here.
5017 Style);
5018 verifyFormat("void *\n"
5019 "operator new(std::size_t s) {}",
5020 Style);
5021 verifyFormat("void *\n"
5022 "operator delete[](void *ptr) {}",
5023 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005024 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005025 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005026 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005027 "{\n"
5028 " return \"\";\n"
5029 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005030 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005031 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005032 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005033 "T *\n" // Problem here: no line break
5034 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005035 "{\n"
5036 " return NULL;\n"
5037 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005038 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005039 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005040}
5041
Alexander Kornienko58611712013-07-04 12:02:44 +00005042TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5043 FormatStyle NoBreak = getLLVMStyle();
5044 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5045 FormatStyle Break = getLLVMStyle();
5046 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005047 verifyFormat("aaaa = \"bbbb\"\n"
5048 " \"cccc\";",
5049 NoBreak);
5050 verifyFormat("aaaa =\n"
5051 " \"bbbb\"\n"
5052 " \"cccc\";",
5053 Break);
5054 verifyFormat("aaaa(\"bbbb\"\n"
5055 " \"cccc\");",
5056 NoBreak);
5057 verifyFormat("aaaa(\n"
5058 " \"bbbb\"\n"
5059 " \"cccc\");",
5060 Break);
5061 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5062 " \"cccc\");",
5063 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005064 verifyFormat("aaaa(qqq,\n"
5065 " \"bbbb\"\n"
5066 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005067 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005068 verifyFormat("aaaa(qqq,\n"
5069 " L\"bbbb\"\n"
5070 " L\"cccc\");",
5071 Break);
5072 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5073 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005074 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005075 verifyFormat("string s = someFunction(\n"
5076 " \"abc\"\n"
5077 " \"abc\");",
5078 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005079
Daniel Jasper3251fff2014-06-10 06:27:23 +00005080 // As we break before unary operators, breaking right after them is bad.
5081 verifyFormat("string foo = abc ? \"x\"\n"
5082 " \"blah blah blah blah blah blah\"\n"
5083 " : \"y\";",
5084 Break);
5085
Daniel Jasperc834c702013-07-17 15:38:19 +00005086 // Don't break if there is no column gain.
5087 verifyFormat("f(\"aaaa\"\n"
5088 " \"bbbb\");",
5089 Break);
5090
5091 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005092 EXPECT_EQ("x = \"a\\\n"
5093 "b\\\n"
5094 "c\";",
5095 format("x = \"a\\\n"
5096 "b\\\n"
5097 "c\";",
5098 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005099 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005100 " \"a\\\n"
5101 "b\\\n"
5102 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005103 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005104 "b\\\n"
5105 "c\";",
5106 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005107
5108 // Exempt ObjC strings for now.
5109 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005110 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005111 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005112 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005113 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005114
5115 Break.ColumnLimit = 0;
5116 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005117}
5118
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005119TEST_F(FormatTest, AlignsPipes) {
5120 verifyFormat(
5121 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5122 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5123 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5124 verifyFormat(
5125 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5126 " << aaaaaaaaaaaaaaaaaaaa;");
5127 verifyFormat(
5128 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5129 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5130 verifyFormat(
5131 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5132 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5133 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5134 verifyFormat(
5135 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5136 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5137 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005138 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5139 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5140 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5141 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005142 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5143 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005144 verifyFormat(
5145 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5146 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005147
5148 verifyFormat("return out << \"somepacket = {\\n\"\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00005149 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5150 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5151 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5152 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
Daniel Jasper2603ee02013-02-04 07:34:48 +00005153 " << \"}\";");
Daniel Jasperba9ddb62013-02-06 21:04:05 +00005154
Daniel Jasper0d5e44d2013-07-15 14:12:30 +00005155 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5156 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5157 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
Daniel Jasperba9ddb62013-02-06 21:04:05 +00005158 verifyFormat(
5159 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5160 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5161 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5162 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5163 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
Daniel Jasperf38a0ac2013-03-14 14:00:17 +00005164 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5165 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperfa21c072013-07-15 14:33:14 +00005166 verifyFormat(
5167 "void f() {\n"
5168 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5169 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5170 "}");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005171 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5172 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005173 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5175 " aaaaaaaaaaaaaaaaaaaaa)\n"
5176 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005177 verifyFormat("LOG_IF(aaa == //\n"
5178 " bbb)\n"
5179 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005180
Daniel Jasper4e9678f2013-07-11 20:41:21 +00005181 // Breaking before the first "<<" is generally not desirable.
5182 verifyFormat(
5183 "llvm::errs()\n"
5184 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5185 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5186 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5187 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5188 getLLVMStyleWithColumns(70));
5189 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5190 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5191 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5192 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5193 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5194 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5195 getLLVMStyleWithColumns(70));
5196
Daniel Jasper467ddb12013-08-12 12:58:05 +00005197 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005198 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5199 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005200 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5201 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5202 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005203 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5204 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005205 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5206 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5207 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5208 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5209 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5210 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5211 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005212
Daniel Jasperc238c872013-04-02 14:33:13 +00005213 verifyFormat(
5214 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5215 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005216
5217 // Incomplete string literal.
5218 EXPECT_EQ("llvm::errs() << \"\n"
5219 " << a;",
5220 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005221
5222 verifyFormat("void f() {\n"
5223 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5224 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5225 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005226
5227 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005228 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5229 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5230 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005231
5232 // Handle '\n'.
5233 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5234 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5235 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5236 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5237 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5238 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5239 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005240}
5241
Daniel Jasperf7935112012-12-03 18:12:45 +00005242TEST_F(FormatTest, UnderstandsEquals) {
5243 verifyFormat(
5244 "aaaaaaaaaaaaaaaaa =\n"
5245 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5246 verifyFormat(
5247 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005248 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005249 verifyFormat(
5250 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005251 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005252 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005253 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5254 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005255
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005256 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5257 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005258}
5259
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005260TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005261 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5262 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005263
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005264 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5265 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005266
5267 verifyFormat(
5268 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5269 " Parameter2);");
5270
5271 verifyFormat(
5272 "ShortObject->shortFunction(\n"
5273 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5274 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5275
5276 verifyFormat("loooooooooooooongFunction(\n"
5277 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5278
5279 verifyFormat(
5280 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5281 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5282
Daniel Jasper687af3b2013-02-14 14:26:07 +00005283 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5284 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005285 verifyFormat("void f() {\n"
5286 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5287 " .Times(2)\n"
5288 " .WillRepeatedly(Return(SomeValue));\n"
5289 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005290 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5291 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005292 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005293 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5294 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005295 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005296 verifyFormat("void f() {\n"
5297 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5298 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5299 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005300 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5301 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5302 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5303 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5304 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005305 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5306 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5307 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5308 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5309 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005310
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005311 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005312 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005313 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005314 verifyFormat(
5315 "aaaaaaaaaaa->aaaaaaaaa(\n"
5316 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5317 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005318
5319 verifyFormat(
5320 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5321 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005322 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5323 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5324 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5325 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005326
Daniel Jasper9b334242013-03-15 14:57:30 +00005327 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005328 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5329 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005330
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005331 FormatStyle NoBinPacking = getLLVMStyle();
5332 NoBinPacking.BinPackParameters = false;
5333 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5334 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5335 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5336 " aaaaaaaaaaaaaaaaaaa,\n"
5337 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5338 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005339
5340 // If there is a subsequent call, change to hanging indentation.
5341 verifyFormat(
5342 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5343 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5344 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5345 verifyFormat(
5346 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5347 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005348 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5349 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5350 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5351 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5352 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5353 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005354}
5355
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005356TEST_F(FormatTest, WrapsTemplateDeclarations) {
5357 verifyFormat("template <typename T>\n"
5358 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005359 verifyFormat("template <typename T>\n"
5360 "// T should be one of {A, B}.\n"
5361 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005362 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005363 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005364 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005365 verifyFormat("template <typename T>\n"
5366 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5367 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005368 verifyFormat(
5369 "template <typename T>\n"
5370 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5371 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005372 verifyFormat(
5373 "template <typename T>\n"
5374 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5375 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5376 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005377 verifyFormat("template <typename T>\n"
5378 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005379 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005380 verifyFormat(
5381 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5382 " typename T4 = char>\n"
5383 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005384 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5385 " template <typename> class cccccccccccccccccccccc,\n"
5386 " typename ddddddddddddd>\n"
5387 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005388 verifyFormat(
5389 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5390 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005391
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005392 verifyFormat("void f() {\n"
5393 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5394 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5395 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005396
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005397 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005398 verifyFormat("template <typename T> void f();");
5399 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005400 verifyFormat(
5401 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5402 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5404 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5405 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5406 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5407 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5408 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005409 EXPECT_EQ("static_cast<A< //\n"
5410 " B> *>(\n"
5411 "\n"
5412 " );",
5413 format("static_cast<A<//\n"
5414 " B>*>(\n"
5415 "\n"
5416 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005417 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5418 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005419
5420 FormatStyle AlwaysBreak = getLLVMStyle();
5421 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5422 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5423 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5424 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5425 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5426 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5427 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5428 verifyFormat("template <template <typename> class Fooooooo,\n"
5429 " template <typename> class Baaaaaaar>\n"
5430 "struct C {};",
5431 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005432 verifyFormat("template <typename T> // T can be A, B or C.\n"
5433 "struct C {};",
5434 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005435 verifyFormat("template <enum E> class A {\n"
5436 "public:\n"
5437 " E *f();\n"
5438 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005439}
5440
Daniel Jasper45797022013-01-25 10:57:27 +00005441TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5442 verifyFormat(
5443 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5444 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5445 verifyFormat(
5446 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5447 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5448 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5449
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005450 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005451 verifyFormat(
5452 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5453 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005454 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005455
Daniel Jasper45797022013-01-25 10:57:27 +00005456 verifyFormat(
5457 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005458 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005459
5460 // Breaking at nested name specifiers is generally not desirable.
5461 verifyFormat(
5462 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5463 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005464
5465 verifyFormat(
5466 "aaaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5467 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5468 " aaaaaaaaaaaaaaaaaaaaa);",
5469 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005470
5471 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5472 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5473 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005474}
5475
Daniel Jasperf7935112012-12-03 18:12:45 +00005476TEST_F(FormatTest, UnderstandsTemplateParameters) {
5477 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005478 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005479 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5480 verifyFormat("bool x = a < 1 || 2 > a;");
5481 verifyFormat("bool x = 5 < f<int>();");
5482 verifyFormat("bool x = f<int>() > 5;");
5483 verifyFormat("bool x = 5 < a<int>::x;");
5484 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5485 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5486
5487 verifyGoogleFormat("A<A<int>> a;");
5488 verifyGoogleFormat("A<A<A<int>>> a;");
5489 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005490 verifyGoogleFormat("A<A<int> > a;");
5491 verifyGoogleFormat("A<A<A<int> > > a;");
5492 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005493 verifyGoogleFormat("A<::A<int>> a;");
5494 verifyGoogleFormat("A<::A> a;");
5495 verifyGoogleFormat("A< ::A> a;");
5496 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005497 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5498 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005499 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5500 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005501 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5502 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005503
Nico Weber7533b4d2014-09-24 17:17:32 +00005504 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5505
Daniel Jasperf7935112012-12-03 18:12:45 +00005506 verifyFormat("test >> a >> b;");
5507 verifyFormat("test << a >> b;");
5508
5509 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005510 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005511 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005512 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5513 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005514 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005515 verifyFormat("f(a.operator()<A>());");
5516 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5517 " .template operator()<A>());",
5518 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005519
5520 // Not template parameters.
5521 verifyFormat("return a < b && c > d;");
5522 verifyFormat("void f() {\n"
5523 " while (a < b && c > d) {\n"
5524 " }\n"
5525 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005526 verifyFormat("template <typename... Types>\n"
5527 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005528
5529 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5530 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5531 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005532 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005533 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005534 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005535}
5536
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005537TEST_F(FormatTest, BitshiftOperatorWidth) {
5538 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5539 " bar */",
5540 format("int a=1<<2; /* foo\n"
5541 " bar */"));
5542
5543 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5544 " bar */",
5545 format("int b =256>>1 ; /* foo\n"
5546 " bar */"));
5547}
5548
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005549TEST_F(FormatTest, UnderstandsBinaryOperators) {
5550 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005551 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005552}
5553
5554TEST_F(FormatTest, UnderstandsPointersToMembers) {
5555 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005556 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005557 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005558 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005559 verifyFormat("void f() {\n"
5560 " (a->*f)();\n"
5561 " a->*x;\n"
5562 " (a.*f)();\n"
5563 " ((*a).*f)();\n"
5564 " a.*x;\n"
5565 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005566 verifyFormat("void f() {\n"
5567 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5568 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5569 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005570 verifyFormat(
5571 "(aaaaaaaaaa->*bbbbbbb)(\n"
5572 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005573 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005574 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005575 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005576}
5577
Daniel Jasper8dd40472012-12-21 09:41:31 +00005578TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005579 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005580 verifyFormat("f(-1, -2, -3);");
5581 verifyFormat("a[-1] = 5;");
5582 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005583 verifyFormat("if (i == -1) {\n}");
5584 verifyFormat("if (i != -1) {\n}");
5585 verifyFormat("if (i > -1) {\n}");
5586 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005587 verifyFormat("++(a->f());");
5588 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005589 verifyFormat("(a->f())++;");
5590 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005591 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005592
5593 verifyFormat("a-- > b;");
5594 verifyFormat("b ? -a : c;");
5595 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005596 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005597 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005598 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005599
5600 verifyFormat("return -1;");
5601 verifyFormat("switch (a) {\n"
5602 "case -1:\n"
5603 " break;\n"
5604 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005605 verifyFormat("#define X -1");
5606 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005607
Chandler Carruthf8b72662014-03-02 12:37:31 +00005608 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5609 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005610
5611 verifyFormat("int a = /* confusing comment */ -1;");
5612 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5613 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005614}
5615
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005616TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005617 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005618 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005619 "}");
5620 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005621 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005622 verifyFormat("*aaa = aaaaaaa( // break\n"
5623 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005624}
5625
Daniel Jasper8863ada2013-08-26 08:10:17 +00005626TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005627 verifyFormat("bool operator<();");
5628 verifyFormat("bool operator>();");
5629 verifyFormat("bool operator=();");
5630 verifyFormat("bool operator==();");
5631 verifyFormat("bool operator!=();");
5632 verifyFormat("int operator+();");
5633 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00005634 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005635 verifyFormat("bool operator();");
5636 verifyFormat("bool operator()();");
5637 verifyFormat("bool operator[]();");
5638 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005639 verifyFormat("operator int();");
5640 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005641 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005642 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005643 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005644 verifyFormat("void *operator new(std::size_t size);");
5645 verifyFormat("void *operator new[](std::size_t size);");
5646 verifyFormat("void operator delete(void *ptr);");
5647 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005648 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5649 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005650 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005651 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005652
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005653 verifyFormat(
5654 "ostream &operator<<(ostream &OutputStream,\n"
5655 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005656 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5657 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5658 " return left.group < right.group;\n"
5659 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005660 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005661 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005662
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005663 verifyGoogleFormat("operator void*();");
5664 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005665 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005666
5667 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005668 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5669 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005670}
5671
Daniel Jasper1c220482015-02-25 10:30:06 +00005672TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005673 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5674 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5675 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5676 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5677 verifyFormat("Deleted &operator=(const Deleted &) &;");
5678 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5679 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5680 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5681 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5682 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5683 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005684 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005685 verifyFormat("template <typename T>\n"
5686 "void F(T) && = delete;",
5687 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005688
Daniel Jasperaf642c62015-08-25 13:40:51 +00005689 FormatStyle AlignLeft = getLLVMStyle();
5690 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005691 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005692 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5693 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5694 AlignLeft);
5695 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5696 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005697 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5698 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5699 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5700 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005701 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005702
5703 FormatStyle Spaces = getLLVMStyle();
5704 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005705 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5706 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5707 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5708 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005709
5710 Spaces.SpacesInCStyleCastParentheses = false;
5711 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005712 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5713 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5714 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5715 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005716}
5717
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005718TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005719 verifyFormat("void f() {\n"
5720 " A *a = new A;\n"
5721 " A *a = new (placement) A;\n"
5722 " delete a;\n"
5723 " delete (A *)a;\n"
5724 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005725 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5726 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005727 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5728 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5729 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005730 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005731}
5732
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005733TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005734 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005735 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005736 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005737 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005738 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005739 verifyIndependentOfContext("int a = b * 10;");
5740 verifyIndependentOfContext("int a = 10 * b;");
5741 verifyIndependentOfContext("int a = b * c;");
5742 verifyIndependentOfContext("int a += b * c;");
5743 verifyIndependentOfContext("int a -= b * c;");
5744 verifyIndependentOfContext("int a *= b * c;");
5745 verifyIndependentOfContext("int a /= b * c;");
5746 verifyIndependentOfContext("int a = *b;");
5747 verifyIndependentOfContext("int a = *b * c;");
5748 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005749 verifyIndependentOfContext("int a = b * (10);");
5750 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005751 verifyIndependentOfContext("return 10 * b;");
5752 verifyIndependentOfContext("return *b * *c;");
5753 verifyIndependentOfContext("return a & ~b;");
5754 verifyIndependentOfContext("f(b ? *c : *d);");
5755 verifyIndependentOfContext("int a = b ? *c : *d;");
5756 verifyIndependentOfContext("*b = a;");
5757 verifyIndependentOfContext("a * ~b;");
5758 verifyIndependentOfContext("a * !b;");
5759 verifyIndependentOfContext("a * +b;");
5760 verifyIndependentOfContext("a * -b;");
5761 verifyIndependentOfContext("a * ++b;");
5762 verifyIndependentOfContext("a * --b;");
5763 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005764 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005765 verifyIndependentOfContext("f() * b;");
5766 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005767 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005768 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005769 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005770 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005771 verifyIndependentOfContext("return sizeof(int **);");
5772 verifyIndependentOfContext("return sizeof(int ******);");
5773 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005774 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005775 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005776 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005777 verifyGoogleFormat("return sizeof(int**);");
5778 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5779 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005780 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005781 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005782 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005783 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005784 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005785 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005786 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005787 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005788 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005789 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005790 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005791 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005792 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005793 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005794 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005795 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasper27234032012-12-07 09:52:15 +00005796
Daniel Jasper5b49f472013-01-23 12:10:53 +00005797 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005798
Daniel Jasper5b49f472013-01-23 12:10:53 +00005799 verifyIndependentOfContext("A<int *> a;");
5800 verifyIndependentOfContext("A<int **> a;");
5801 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005802 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005803 verifyIndependentOfContext(
5804 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005805 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005806 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005807 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005808 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005809 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005810
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005811 verifyFormat(
5812 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5813 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5814
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005815 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005816 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005817 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005818 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005819 verifyGoogleFormat("A<int*> a;");
5820 verifyGoogleFormat("A<int**> a;");
5821 verifyGoogleFormat("A<int*, int*> a;");
5822 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005823 verifyGoogleFormat("f(b ? *c : *d);");
5824 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005825 verifyGoogleFormat("Type* t = **x;");
5826 verifyGoogleFormat("Type* t = *++*x;");
5827 verifyGoogleFormat("*++*x;");
5828 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5829 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005830 verifyGoogleFormat(
5831 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005832 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005833 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5834 verifyGoogleFormat("template <typename T>\n"
5835 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005836
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005837 FormatStyle Left = getLLVMStyle();
5838 Left.PointerAlignment = FormatStyle::PAS_Left;
5839 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005840 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005841 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005842
Daniel Jasper5b49f472013-01-23 12:10:53 +00005843 verifyIndependentOfContext("a = *(x + y);");
5844 verifyIndependentOfContext("a = &(x + y);");
5845 verifyIndependentOfContext("*(x + y).call();");
5846 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005847 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005848
Daniel Jasper5b49f472013-01-23 12:10:53 +00005849 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005850 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005851 "int *MyValues = {\n"
5852 " *A, // Operator detection might be confused by the '{'\n"
5853 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005854 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005855
Daniel Jasper5b49f472013-01-23 12:10:53 +00005856 verifyIndependentOfContext("if (int *a = &b)");
5857 verifyIndependentOfContext("if (int &a = *b)");
5858 verifyIndependentOfContext("if (a & b[i])");
5859 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5860 verifyIndependentOfContext("if (*b[i])");
5861 verifyIndependentOfContext("if (int *a = (&b))");
5862 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005863 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005864 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005865 verifyFormat("void f() {\n"
5866 " for (const int &v : Values) {\n"
5867 " }\n"
5868 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005869 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5870 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005871 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005872
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005873 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005874 verifyFormat("#define MACRO \\\n"
5875 " int *i = a * b; \\\n"
5876 " void f(a *b);",
5877 getLLVMStyleWithColumns(19));
5878
Daniel Jasper97b89482013-03-13 07:49:51 +00005879 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005880 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005881 verifyIndependentOfContext("T **t = new T *;");
5882 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005883 verifyGoogleFormat("A = new SomeType*[Length]();");
5884 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005885 verifyGoogleFormat("T** t = new T*;");
5886 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005887
Daniel Jasper990ff972013-05-07 14:17:18 +00005888 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005889 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00005890 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00005891 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5892 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005893 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005894 "typename t::if<x && y>::type f() {}");
5895 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005896 verifyFormat("vector<int *> v;");
5897 verifyFormat("vector<int *const> v;");
5898 verifyFormat("vector<int *const **const *> v;");
5899 verifyFormat("vector<int *volatile> v;");
5900 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005901 verifyFormat("foo<b && false>();");
5902 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005903 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005904 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005905 "template <class T,\n"
5906 " class = typename std::enable_if<\n"
5907 " std::is_integral<T>::value &&\n"
5908 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005909 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005910 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005911 verifyFormat(
5912 "template <class T,\n"
5913 " class = typename ::std::enable_if<\n"
5914 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5915 "void F();",
5916 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005917
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005918 verifyIndependentOfContext("MACRO(int *i);");
5919 verifyIndependentOfContext("MACRO(auto *a);");
5920 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00005921 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00005922 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005923 // FIXME: Is there a way to make this work?
5924 // verifyIndependentOfContext("MACRO(A *a);");
5925
Daniel Jasper32ccb032014-06-23 07:36:18 +00005926 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005927 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005928
Daniel Jasper866468a2014-04-14 13:15:29 +00005929 EXPECT_EQ("#define OP(x) \\\n"
5930 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5931 " return s << a.DebugString(); \\\n"
5932 " }",
5933 format("#define OP(x) \\\n"
5934 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5935 " return s << a.DebugString(); \\\n"
5936 " }",
5937 getLLVMStyleWithColumns(50)));
5938
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005939 // FIXME: We cannot handle this case yet; we might be able to figure out that
5940 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005941 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005942
5943 FormatStyle PointerMiddle = getLLVMStyle();
5944 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5945 verifyFormat("delete *x;", PointerMiddle);
5946 verifyFormat("int * x;", PointerMiddle);
5947 verifyFormat("template <int * y> f() {}", PointerMiddle);
5948 verifyFormat("int * f(int * a) {}", PointerMiddle);
5949 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5950 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5951 verifyFormat("A<int *> a;", PointerMiddle);
5952 verifyFormat("A<int **> a;", PointerMiddle);
5953 verifyFormat("A<int *, int *> a;", PointerMiddle);
5954 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005955 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5956 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005957 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005958
5959 // Member function reference qualifiers aren't binary operators.
5960 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005961 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005962 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005963 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005964 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005965 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005966}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005967
Daniel Jasperee6d6502013-07-17 20:25:02 +00005968TEST_F(FormatTest, UnderstandsAttributes) {
5969 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005970 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5971 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005972 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005973 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005974 verifyFormat("__attribute__((nodebug)) void\n"
5975 "foo() {}\n",
5976 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005977}
5978
Daniel Jasper10cd5812013-05-06 06:35:44 +00005979TEST_F(FormatTest, UnderstandsEllipsis) {
5980 verifyFormat("int printf(const char *fmt, ...);");
5981 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005982 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5983
5984 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005985 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005986 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005987}
5988
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005989TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005990 EXPECT_EQ("int *a;\n"
5991 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005992 "int *a;",
5993 format("int *a;\n"
5994 "int* a;\n"
5995 "int *a;",
5996 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005997 EXPECT_EQ("int* a;\n"
5998 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005999 "int* a;",
6000 format("int* a;\n"
6001 "int* a;\n"
6002 "int *a;",
6003 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006004 EXPECT_EQ("int *a;\n"
6005 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006006 "int *a;",
6007 format("int *a;\n"
6008 "int * a;\n"
6009 "int * a;",
6010 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006011 EXPECT_EQ("auto x = [] {\n"
6012 " int *a;\n"
6013 " int *a;\n"
6014 " int *a;\n"
6015 "};",
6016 format("auto x=[]{int *a;\n"
6017 "int * a;\n"
6018 "int * a;};",
6019 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006020}
6021
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006022TEST_F(FormatTest, UnderstandsRvalueReferences) {
6023 verifyFormat("int f(int &&a) {}");
6024 verifyFormat("int f(int a, char &&b) {}");
6025 verifyFormat("void f() { int &&a = b; }");
6026 verifyGoogleFormat("int f(int a, char&& b) {}");
6027 verifyGoogleFormat("void f() { int&& a = b; }");
6028
Daniel Jasper1eff9082013-05-27 16:36:33 +00006029 verifyIndependentOfContext("A<int &&> a;");
6030 verifyIndependentOfContext("A<int &&, int &&> a;");
6031 verifyGoogleFormat("A<int&&> a;");
6032 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006033
6034 // Not rvalue references:
6035 verifyFormat("template <bool B, bool C> class A {\n"
6036 " static_assert(B && C, \"Something is wrong\");\n"
6037 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006038 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6039 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006040 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006041}
6042
Manuel Klimekc1237a82013-01-23 14:08:21 +00006043TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6044 verifyFormat("void f() {\n"
6045 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006046 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006047 "}",
6048 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006049}
6050
Daniel Jasperef906a92013-01-13 08:01:36 +00006051TEST_F(FormatTest, FormatsCasts) {
6052 verifyFormat("Type *A = static_cast<Type *>(P);");
6053 verifyFormat("Type *A = (Type *)P;");
6054 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6055 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006056 verifyFormat("int a = (int)2.0f;");
6057 verifyFormat("x[(int32)y];");
6058 verifyFormat("x = (int32)y;");
6059 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6060 verifyFormat("int a = (int)*b;");
6061 verifyFormat("int a = (int)2.0f;");
6062 verifyFormat("int a = (int)~0;");
6063 verifyFormat("int a = (int)++a;");
6064 verifyFormat("int a = (int)sizeof(int);");
6065 verifyFormat("int a = (int)+2;");
6066 verifyFormat("my_int a = (my_int)2.0f;");
6067 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006068 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006069 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006070 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006071 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006072 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006073
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006074 verifyFormat("void f() { my_int a = (my_int)*b; }");
6075 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6076 verifyFormat("my_int a = (my_int)~0;");
6077 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006078 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006079 verifyFormat("my_int a = (my_int)1;");
6080 verifyFormat("my_int a = (my_int *)1;");
6081 verifyFormat("my_int a = (const my_int)-1;");
6082 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006083 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006084 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006085 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006086 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006087
6088 // FIXME: single value wrapped with paren will be treated as cast.
6089 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006090
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006091 verifyFormat("{ (void)F; }");
6092
Daniel Jasper998cabc2013-07-18 14:46:07 +00006093 // Don't break after a cast's
6094 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6095 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6096 " bbbbbbbbbbbbbbbbbbbbbb);");
6097
Daniel Jasperef906a92013-01-13 08:01:36 +00006098 // These are not casts.
6099 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006100 verifyFormat("f(foo)->b;");
6101 verifyFormat("f(foo).b;");
6102 verifyFormat("f(foo)(b);");
6103 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006104 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006105 verifyFormat("(*funptr)(foo)[4];");
6106 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006107 verifyFormat("void f(int *);");
6108 verifyFormat("void f(int *) = 0;");
6109 verifyFormat("void f(SmallVector<int>) {}");
6110 verifyFormat("void f(SmallVector<int>);");
6111 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006112 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006113 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006114 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006115 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6116 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006117 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006118
Daniel Jasperba0bda92013-02-23 08:07:18 +00006119 // These are not casts, but at some point were confused with casts.
6120 verifyFormat("virtual void foo(int *) override;");
6121 verifyFormat("virtual void foo(char &) const;");
6122 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006123 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006124 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006125 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006126 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006127
6128 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6129 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006130 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006131 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006132 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6133 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6134 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006135}
6136
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006137TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006138 verifyFormat("A<bool()> a;");
6139 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006140 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006141 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006142 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006143 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006144 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006145 verifyFormat("template <class CallbackClass>\n"
6146 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006147
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006148 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6149 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006150 verifyGoogleFormat(
6151 "template <class CallbackClass>\n"
6152 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006153
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006154 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006155 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006156 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006157 verifyFormat("some_var = function(*some_pointer_var)[0];");
6158 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006159 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006160 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006161}
6162
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006163TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6164 verifyFormat("A (*foo_)[6];");
6165 verifyFormat("vector<int> (*foo_)[6];");
6166}
6167
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006168TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6169 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6170 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6171 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6172 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006173 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6174 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006175
6176 // Different ways of ()-initializiation.
6177 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6178 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6179 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6180 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6181 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6182 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006183 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6184 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006185}
6186
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006187TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006188 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006189 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006190 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006191 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006192 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006193 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006194 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6195 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006196 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6197 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006198 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6199 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006200 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6201 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006202 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6203 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006204 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6205 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6206 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6207 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006208 FormatStyle Indented = getLLVMStyle();
6209 Indented.IndentWrappedFunctionNames = true;
6210 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6211 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6212 Indented);
6213 verifyFormat(
6214 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6215 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6216 Indented);
6217 verifyFormat(
6218 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6219 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6220 Indented);
6221 verifyFormat(
6222 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6223 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6224 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006225
6226 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006227 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6228 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6229 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006230
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006231 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006232 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006233 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006234 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6235 " SourceLocation L, IdentifierIn *II,\n"
6236 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006237 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006238 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006239 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006240 " const SomeType<string, SomeOtherTemplateParameter>\n"
6241 " &ReallyReallyLongParameterName,\n"
6242 " const SomeType<string, SomeOtherTemplateParameter>\n"
6243 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006244 verifyFormat("template <typename A>\n"
6245 "SomeLoooooooooooooooooooooongType<\n"
6246 " typename some_namespace::SomeOtherType<A>::Type>\n"
6247 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006248
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006249 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006250 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6251 " aaaaaaaaaaaaaaaaaaaaaaa;");
6252 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006253 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6254 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006255 verifyGoogleFormat(
6256 "some_namespace::LongReturnType\n"
6257 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006258 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006259
6260 verifyGoogleFormat("template <typename T>\n"
6261 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006262 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006263 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6264 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006265
6266 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006267 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6268 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006269 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6270 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6271 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6272 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6273 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6274 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6275 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006276}
6277
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006278TEST_F(FormatTest, FormatsArrays) {
6279 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6280 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006281 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6282 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006283 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6284 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006285 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6286 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6287 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6288 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6289 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6290 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6291 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6292 verifyFormat(
6293 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6294 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6295 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006296 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6297 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006298
6299 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6300 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006301 verifyFormat(
6302 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6303 " .aaaaaaa[0]\n"
6304 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006305 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006306
6307 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006308
6309 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6310 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006311}
6312
Daniel Jaspere9de2602012-12-06 09:56:08 +00006313TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6314 verifyFormat("(a)->b();");
6315 verifyFormat("--a;");
6316}
6317
Daniel Jasper8b529712012-12-04 13:02:32 +00006318TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006319 verifyFormat("#include <string>\n"
6320 "#include <a/b/c.h>\n"
6321 "#include \"a/b/string\"\n"
6322 "#include \"string.h\"\n"
6323 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006324 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006325 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006326 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006327 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006328 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006329 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6330 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006331 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6332 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006333
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006334 verifyFormat("#import <string>");
6335 verifyFormat("#import <a/b/c.h>");
6336 verifyFormat("#import \"a/b/string\"");
6337 verifyFormat("#import \"string.h\"");
6338 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006339 verifyFormat("#if __has_include(<strstream>)\n"
6340 "#include <strstream>\n"
6341 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006342
Daniel Jasper343643b2014-08-13 08:29:18 +00006343 verifyFormat("#define MY_IMPORT <a/b>");
6344
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006345 // Protocol buffer definition or missing "#".
6346 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6347 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006348
6349 FormatStyle Style = getLLVMStyle();
6350 Style.AlwaysBreakBeforeMultilineStrings = true;
6351 Style.ColumnLimit = 0;
6352 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006353
6354 // But 'import' might also be a regular C++ namespace.
6355 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6356 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006357}
6358
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006359//===----------------------------------------------------------------------===//
6360// Error recovery tests.
6361//===----------------------------------------------------------------------===//
6362
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006363TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006364 FormatStyle NoBinPacking = getLLVMStyle();
6365 NoBinPacking.BinPackParameters = false;
6366 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6367 " double *min_x,\n"
6368 " double *max_x,\n"
6369 " double *min_y,\n"
6370 " double *max_y,\n"
6371 " double *min_z,\n"
6372 " double *max_z, ) {}",
6373 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006374}
6375
Daniel Jasper83a54d22013-01-10 09:26:47 +00006376TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006377 verifyFormat("void f() { return; }\n42");
6378 verifyFormat("void f() {\n"
6379 " if (0)\n"
6380 " return;\n"
6381 "}\n"
6382 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006383 verifyFormat("void f() { return }\n42");
6384 verifyFormat("void f() {\n"
6385 " if (0)\n"
6386 " return\n"
6387 "}\n"
6388 "42");
6389}
6390
6391TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6392 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6393 EXPECT_EQ("void f() {\n"
6394 " if (a)\n"
6395 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006396 "}",
6397 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006398 EXPECT_EQ("namespace N {\n"
6399 "void f()\n"
6400 "}",
6401 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006402 EXPECT_EQ("namespace N {\n"
6403 "void f() {}\n"
6404 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006405 "}",
6406 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006407}
6408
Daniel Jasper2df93312013-01-09 10:16:05 +00006409TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6410 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006411 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006412 " b;",
6413 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006414 verifyFormat("function(\n"
6415 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006416 " LoooooooooooongArgument);\n",
6417 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006418}
6419
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006420TEST_F(FormatTest, IncorrectAccessSpecifier) {
6421 verifyFormat("public:");
6422 verifyFormat("class A {\n"
6423 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006424 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006425 "};");
6426 verifyFormat("public\n"
6427 "int qwerty;");
6428 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006429 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006430 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006431 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006432 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006433 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006434}
Daniel Jasperf7935112012-12-03 18:12:45 +00006435
Daniel Jasper291f9362013-03-20 15:58:10 +00006436TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6437 verifyFormat("{");
6438 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006439 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006440}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006441
6442TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006443 verifyFormat("do {\n}");
6444 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006445 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006446 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006447 "wheeee(fun);");
6448 verifyFormat("do {\n"
6449 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006450 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006451}
6452
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006453TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006454 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006455 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006456 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006457 verifyFormat("while {\n foo;\n foo();\n}");
6458 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006459}
6460
Daniel Jasperc0880a92013-01-04 18:52:56 +00006461TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006462 verifyIncompleteFormat("namespace {\n"
6463 "class Foo { Foo (\n"
6464 "};\n"
6465 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006466}
6467
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006468TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006469 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006470 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6471 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006472 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006473
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006474 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006475 " {\n"
6476 " breakme(\n"
6477 " qwe);\n"
6478 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006479 format("{\n"
6480 " {\n"
6481 " breakme(qwe);\n"
6482 "}\n",
6483 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006484}
6485
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006486TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006487 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006488 " avariable,\n"
6489 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006490 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006491}
6492
Manuel Klimek762dd182013-01-21 10:07:49 +00006493TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006494 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006495}
6496
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006497TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006498 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006499 verifyFormat("vector<int> x{\n"
6500 " 1, 2, 3, 4,\n"
6501 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006502 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6503 verifyFormat("f({1, 2});");
6504 verifyFormat("auto v = Foo{-1};");
6505 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6506 verifyFormat("Class::Class : member{1, 2, 3} {}");
6507 verifyFormat("new vector<int>{1, 2, 3};");
6508 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006509 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006510 verifyFormat("return {arg1, arg2};");
6511 verifyFormat("return {arg1, SomeType{parameter}};");
6512 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6513 verifyFormat("new T{arg1, arg2};");
6514 verifyFormat("f(MyMap[{composite, key}]);");
6515 verifyFormat("class Class {\n"
6516 " T member = {arg1, arg2};\n"
6517 "};");
6518 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006519 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6520 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006521
Daniel Jasper438059e2014-05-22 12:11:13 +00006522 verifyFormat("int foo(int i) { return fo1{}(i); }");
6523 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006524 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006525 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006526 verifyFormat("Node n{1, Node{1000}, //\n"
6527 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006528 verifyFormat("Aaaa aaaaaaa{\n"
6529 " {\n"
6530 " aaaa,\n"
6531 " },\n"
6532 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006533 verifyFormat("class C : public D {\n"
6534 " SomeClass SC{2};\n"
6535 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006536 verifyFormat("class C : public A {\n"
6537 " class D : public B {\n"
6538 " void f() { int i{2}; }\n"
6539 " };\n"
6540 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006541 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006542
Daniel Jasper08434342015-05-26 07:26:26 +00006543 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006544 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006545 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006546 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6547 " bbbbb,\n"
6548 " ccccc,\n"
6549 " ddddd,\n"
6550 " eeeee,\n"
6551 " ffffff,\n"
6552 " ggggg,\n"
6553 " hhhhhh,\n"
6554 " iiiiii,\n"
6555 " jjjjjj,\n"
6556 " kkkkkk};",
6557 NoBinPacking);
6558 verifyFormat("const Aaaaaa aaaaa = {\n"
6559 " aaaaa,\n"
6560 " bbbbb,\n"
6561 " ccccc,\n"
6562 " ddddd,\n"
6563 " eeeee,\n"
6564 " ffffff,\n"
6565 " ggggg,\n"
6566 " hhhhhh,\n"
6567 " iiiiii,\n"
6568 " jjjjjj,\n"
6569 " kkkkkk,\n"
6570 "};",
6571 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006572 verifyFormat(
6573 "const Aaaaaa aaaaa = {\n"
6574 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6575 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6576 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6577 "};",
6578 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006579
Chandler Carruthf8b72662014-03-02 12:37:31 +00006580 // FIXME: The alignment of these trailing comments might be bad. Then again,
6581 // this might be utterly useless in real code.
6582 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006583 " : some_value{ //\n"
6584 " aaaaaaa, //\n"
6585 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006586
Chandler Carruthf8b72662014-03-02 12:37:31 +00006587 // In braced lists, the first comment is always assumed to belong to the
6588 // first element. Thus, it can be moved to the next or previous line as
6589 // appropriate.
6590 EXPECT_EQ("function({// First element:\n"
6591 " 1,\n"
6592 " // Second element:\n"
6593 " 2});",
6594 format("function({\n"
6595 " // First element:\n"
6596 " 1,\n"
6597 " // Second element:\n"
6598 " 2});"));
6599 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6600 " // First element:\n"
6601 " 1,\n"
6602 " // Second element:\n"
6603 " 2};",
6604 format("std::vector<int> MyNumbers{// First element:\n"
6605 " 1,\n"
6606 " // Second element:\n"
6607 " 2};",
6608 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00006609 // A trailing comma should still lead to an enforced line break.
6610 EXPECT_EQ("vector<int> SomeVector = {\n"
6611 " // aaa\n"
6612 " 1, 2,\n"
6613 "};",
6614 format("vector<int> SomeVector = { // aaa\n"
6615 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006616
Chandler Carruthf8b72662014-03-02 12:37:31 +00006617 FormatStyle ExtraSpaces = getLLVMStyle();
6618 ExtraSpaces.Cpp11BracedListStyle = false;
6619 ExtraSpaces.ColumnLimit = 75;
6620 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6621 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6622 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6623 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6624 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6625 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6626 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6627 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6628 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6629 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6630 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6631 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6632 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6633 verifyFormat("class Class {\n"
6634 " T member = { arg1, arg2 };\n"
6635 "};",
6636 ExtraSpaces);
6637 verifyFormat(
6638 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6639 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6640 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6641 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6642 ExtraSpaces);
6643 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006644 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006645 ExtraSpaces);
6646 verifyFormat(
6647 "someFunction(OtherParam,\n"
6648 " BracedList{ // comment 1 (Forcing interesting break)\n"
6649 " param1, param2,\n"
6650 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006651 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006652 ExtraSpaces);
6653 verifyFormat(
6654 "std::this_thread::sleep_for(\n"
6655 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6656 ExtraSpaces);
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006657 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaa{\n"
6658 " aaaaaaa,\n"
6659 " aaaaaaaaaa,\n"
6660 " aaaaa,\n"
6661 " aaaaaaaaaaaaaaa,\n"
6662 " aaa,\n"
6663 " aaaaaaaaaa,\n"
6664 " a,\n"
6665 " aaaaaaaaaaaaaaaaaaaaa,\n"
6666 " aaaaaaaaaaaa,\n"
6667 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6668 " aaaaaaa,\n"
6669 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006670 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006671}
6672
Daniel Jasper33b909c2013-10-25 14:29:37 +00006673TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006674 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6675 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6676 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6677 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6678 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6679 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006680 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006681 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006682 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006683 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6684 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006685 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006686 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6687 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6688 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6689 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6690 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6691 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6692 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006693 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006694 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6695 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006696 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6697 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6698 " // Separating comment.\n"
6699 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6700 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6701 " // Leading comment\n"
6702 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6703 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006704 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6705 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006706 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006707 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6708 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006709 getLLVMStyleWithColumns(38));
6710 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006711 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6712 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006713 verifyFormat(
6714 "static unsigned SomeValues[10][3] = {\n"
6715 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6716 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6717 verifyFormat("static auto fields = new vector<string>{\n"
6718 " \"aaaaaaaaaaaaa\",\n"
6719 " \"aaaaaaaaaaaaa\",\n"
6720 " \"aaaaaaaaaaaa\",\n"
6721 " \"aaaaaaaaaaaaaa\",\n"
6722 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6723 " \"aaaaaaaaaaaa\",\n"
6724 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6725 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006726 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6727 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6728 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6729 " 3, cccccccccccccccccccccc};",
6730 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006731
6732 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006733 verifyFormat("vector<int> x = {\n"
6734 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6735 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006736 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006737 verifyFormat("vector<int> x = {\n"
6738 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006739 "};",
6740 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006741 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6742 " 1, 1, 1, 1,\n"
6743 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006744 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006745
Daniel Jasper60c27072015-05-13 08:16:00 +00006746 // Trailing comment in the first line.
6747 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6748 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6749 " 111111111, 222222222, 3333333333, 444444444, //\n"
6750 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006751 // Trailing comment in the last line.
6752 verifyFormat("int aaaaa[] = {\n"
6753 " 1, 2, 3, // comment\n"
6754 " 4, 5, 6 // comment\n"
6755 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006756
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006757 // With nested lists, we should either format one item per line or all nested
6758 // lists one on line.
6759 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006760 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6761 " {aaaaaaaaaaaaaaaaaaa},\n"
6762 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6763 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006764 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006765 verifyFormat(
6766 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006767 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6768 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6769 " {aaa, aaa},\n"
6770 " {aaa, aaa},\n"
6771 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6772 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6773 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006774
6775 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006776 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
6777 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006778
6779 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006780
Daniel Jaspereb65e912015-12-21 18:31:15 +00006781 // No braced initializer here.
6782 verifyFormat("void f() {\n"
6783 " struct Dummy {};\n"
6784 " f(v);\n"
6785 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006786
6787 // Long lists should be formatted in columns even if they are nested.
6788 verifyFormat(
6789 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6790 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6791 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6792 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6793 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6794 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006795}
6796
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006797TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006798 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006799 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006800
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006801 verifyFormat("void f() { return 42; }");
6802 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006803 " return 42;\n"
6804 "}",
6805 DoNotMerge);
6806 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006807 " // Comment\n"
6808 "}");
6809 verifyFormat("{\n"
6810 "#error {\n"
6811 " int a;\n"
6812 "}");
6813 verifyFormat("{\n"
6814 " int a;\n"
6815 "#error {\n"
6816 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006817 verifyFormat("void f() {} // comment");
6818 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006819 verifyFormat("void f() {\n"
6820 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006821 DoNotMerge);
6822 verifyFormat("void f() {\n"
6823 " int a;\n"
6824 "} // comment",
6825 DoNotMerge);
6826 verifyFormat("void f() {\n"
6827 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006828 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006829
6830 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6831 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6832
6833 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6834 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006835 verifyFormat("class C {\n"
6836 " C()\n"
6837 " : iiiiiiii(nullptr),\n"
6838 " kkkkkkk(nullptr),\n"
6839 " mmmmmmm(nullptr),\n"
6840 " nnnnnnn(nullptr) {}\n"
6841 "};",
6842 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006843
6844 FormatStyle NoColumnLimit = getLLVMStyle();
6845 NoColumnLimit.ColumnLimit = 0;
6846 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6847 EXPECT_EQ("class C {\n"
6848 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006849 "};",
6850 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006851 EXPECT_EQ("A()\n"
6852 " : b(0) {\n"
6853 "}",
6854 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6855
6856 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006857 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6858 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006859 EXPECT_EQ("A()\n"
6860 " : b(0) {\n"
6861 "}",
6862 format("A():b(0){}", DoNotMergeNoColumnLimit));
6863 EXPECT_EQ("A()\n"
6864 " : b(0) {\n"
6865 "}",
6866 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006867
6868 verifyFormat("#define A \\\n"
6869 " void f() { \\\n"
6870 " int i; \\\n"
6871 " }",
6872 getLLVMStyleWithColumns(20));
6873 verifyFormat("#define A \\\n"
6874 " void f() { int i; }",
6875 getLLVMStyleWithColumns(21));
6876 verifyFormat("#define A \\\n"
6877 " void f() { \\\n"
6878 " int i; \\\n"
6879 " } \\\n"
6880 " int j;",
6881 getLLVMStyleWithColumns(22));
6882 verifyFormat("#define A \\\n"
6883 " void f() { int i; } \\\n"
6884 " int j;",
6885 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006886}
6887
Daniel Jasperd74cf402014-04-08 12:46:38 +00006888TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6889 FormatStyle MergeInlineOnly = getLLVMStyle();
6890 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6891 verifyFormat("class C {\n"
6892 " int f() { return 42; }\n"
6893 "};",
6894 MergeInlineOnly);
6895 verifyFormat("int f() {\n"
6896 " return 42;\n"
6897 "}",
6898 MergeInlineOnly);
6899}
6900
Manuel Klimeke01bab52013-01-15 13:38:33 +00006901TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6902 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006903 verifyFormat("struct foo a = {bar};\nint n;");
6904 verifyFormat("class foo a = {bar};\nint n;");
6905 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006906
6907 // Elaborate types inside function definitions.
6908 verifyFormat("struct foo f() {}\nint n;");
6909 verifyFormat("class foo f() {}\nint n;");
6910 verifyFormat("union foo f() {}\nint n;");
6911
6912 // Templates.
6913 verifyFormat("template <class X> void f() {}\nint n;");
6914 verifyFormat("template <struct X> void f() {}\nint n;");
6915 verifyFormat("template <union X> void f() {}\nint n;");
6916
6917 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006918 verifyFormat("struct {\n} n;");
6919 verifyFormat(
6920 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006921 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006922 verifyFormat("class MACRO Z {\n} n;");
6923 verifyFormat("class MACRO(X) Z {\n} n;");
6924 verifyFormat("class __attribute__(X) Z {\n} n;");
6925 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006926 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006927 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006928 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6929 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006930
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006931 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006932 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006933
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006934 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006935 verifyFormat(
6936 "template <typename F>\n"
6937 "Matcher(const Matcher<F> &Other,\n"
6938 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6939 " !is_same<F, T>::value>::type * = 0)\n"
6940 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6941
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006942 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006943 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006944 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006945
6946 // FIXME:
6947 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006948 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006949
Manuel Klimeke01bab52013-01-15 13:38:33 +00006950 // Elaborate types where incorrectly parsing the structural element would
6951 // break the indent.
6952 verifyFormat("if (true)\n"
6953 " class X x;\n"
6954 "else\n"
6955 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006956
6957 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006958 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006959}
6960
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006961TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00006962 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
6963 format("#error Leave all white!!!!! space* alone!\n"));
6964 EXPECT_EQ(
6965 "#warning Leave all white!!!!! space* alone!\n",
6966 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006967 EXPECT_EQ("#error 1", format(" # error 1"));
6968 EXPECT_EQ("#warning 1", format(" # warning 1"));
6969}
6970
Daniel Jasper4431aa92013-04-23 13:54:04 +00006971TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00006972 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00006973 verifyFormat("#if (AAAA && BBBB)");
6974 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00006975 // FIXME: Come up with a better indentation for #elif.
6976 verifyFormat(
6977 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
6978 " defined(BBBBBBBB)\n"
6979 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
6980 " defined(BBBBBBBB)\n"
6981 "#endif",
6982 getLLVMStyleWithColumns(65));
6983}
6984
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006985TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
6986 FormatStyle AllowsMergedIf = getGoogleStyle();
6987 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
6988 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
6989 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00006990 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
6991 EXPECT_EQ("if (true) return 42;",
6992 format("if (true)\nreturn 42;", AllowsMergedIf));
6993 FormatStyle ShortMergedIf = AllowsMergedIf;
6994 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006995 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006996 " if (true) return 42;",
6997 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006998 verifyFormat("#define A \\\n"
6999 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007000 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007001 "#define B",
7002 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007003 verifyFormat("#define A \\\n"
7004 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007005 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007006 "g();",
7007 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007008 verifyFormat("{\n"
7009 "#ifdef A\n"
7010 " // Comment\n"
7011 " if (true) continue;\n"
7012 "#endif\n"
7013 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007014 " if (true) continue;\n"
7015 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007016 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007017 ShortMergedIf.ColumnLimit = 29;
7018 verifyFormat("#define A \\\n"
7019 " if (aaaaaaaaaa) return 1; \\\n"
7020 " return 2;",
7021 ShortMergedIf);
7022 ShortMergedIf.ColumnLimit = 28;
7023 verifyFormat("#define A \\\n"
7024 " if (aaaaaaaaaa) \\\n"
7025 " return 1; \\\n"
7026 " return 2;",
7027 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007028}
7029
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007030TEST_F(FormatTest, BlockCommentsInControlLoops) {
7031 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7032 " f();\n"
7033 "}");
7034 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7035 " f();\n"
7036 "} /* another comment */ else /* comment #3 */ {\n"
7037 " g();\n"
7038 "}");
7039 verifyFormat("while (0) /* a comment in a strange place */ {\n"
7040 " f();\n"
7041 "}");
7042 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
7043 " f();\n"
7044 "}");
7045 verifyFormat("do /* a comment in a strange place */ {\n"
7046 " f();\n"
7047 "} /* another comment */ while (0);");
7048}
7049
7050TEST_F(FormatTest, BlockComments) {
7051 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7052 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007053 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007054 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007055 " b\n"
7056 "/* */\n"
7057 "someCall(\n"
7058 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007059 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007060 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007061 "someCall(parameter);",
7062 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007063
7064 EXPECT_EQ("#define A\n"
7065 "/* */ someCall(\n"
7066 " parameter);",
7067 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007068 "/* */someCall(parameter);",
7069 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007070 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007071 EXPECT_EQ("/*\n"
7072 "*\n"
7073 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007074 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007075 "*/",
7076 format("/*\n"
7077 "*\n"
7078 " * aaaaaa aaaaaa\n"
7079 "*/",
7080 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007081 EXPECT_EQ("/*\n"
7082 "**\n"
7083 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007084 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007085 "*/",
7086 format("/*\n"
7087 "**\n"
7088 "* aaaaaa aaaaaa\n"
7089 "*/",
7090 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007091 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7092 " /* line 1\n"
7093 " bbbbbbbbbbbb */\n"
7094 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7095 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7096 " /* line 1\n"
7097 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7098 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007099
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007100 FormatStyle NoBinPacking = getLLVMStyle();
7101 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007102 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7103 " 2, /* comment 2 */\n"
7104 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007105 " aaaa,\n"
7106 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007107 format("someFunction (1, /* comment 1 */\n"
7108 " 2, /* comment 2 */ \n"
7109 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007110 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007111 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007112 verifyFormat(
7113 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7114 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7115 EXPECT_EQ(
7116 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7117 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7119 format(
7120 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7121 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7122 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007123 EXPECT_EQ(
7124 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7125 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7126 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7127 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7128 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7129 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007130
7131 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007132
7133 EXPECT_EQ("/*\n"
7134 " **\n"
7135 " */",
7136 format("/*\n"
7137 " **\n"
7138 " */"));
7139 EXPECT_EQ("/*\n"
7140 " *q\n"
7141 " */",
7142 format("/*\n"
7143 " *q\n"
7144 " */"));
7145 EXPECT_EQ("/*\n"
7146 " * q\n"
7147 " */",
7148 format("/*\n"
7149 " * q\n"
7150 " */"));
7151 EXPECT_EQ("/*\n"
7152 " **/",
7153 format("/*\n"
7154 " **/"));
7155 EXPECT_EQ("/*\n"
7156 " ***/",
7157 format("/*\n"
7158 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007159}
7160
Manuel Klimek82b836a2013-02-06 16:40:56 +00007161TEST_F(FormatTest, BlockCommentsInMacros) {
7162 EXPECT_EQ("#define A \\\n"
7163 " { \\\n"
7164 " /* one line */ \\\n"
7165 " someCall();",
7166 format("#define A { \\\n"
7167 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007168 " someCall();",
7169 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007170 EXPECT_EQ("#define A \\\n"
7171 " { \\\n"
7172 " /* previous */ \\\n"
7173 " /* one line */ \\\n"
7174 " someCall();",
7175 format("#define A { \\\n"
7176 " /* previous */ \\\n"
7177 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007178 " someCall();",
7179 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007180}
7181
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007182TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7183 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007184 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007185 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007186 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007187 "};",
7188 getLLVMStyleWithColumns(15)));
7189 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007190 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007191 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007192 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007193 "};",
7194 getLLVMStyleWithColumns(15)));
7195
7196 // FIXME: The formatting is still wrong here.
7197 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007198 " 1111 /* a\n"
7199 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007200 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007201 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007202 "};",
7203 getLLVMStyleWithColumns(15)));
7204}
7205
Manuel Klimek82b836a2013-02-06 16:40:56 +00007206TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007207 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007208 " // a\n"
7209 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007210}
7211
Manuel Klimekd33516e2013-01-23 10:09:28 +00007212TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007213 verifyFormat("void f(int *a);");
7214 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007215 verifyFormat("class A {\n void f(int *a);\n};");
7216 verifyFormat("class A {\n int *a;\n};");
7217 verifyFormat("namespace a {\n"
7218 "namespace b {\n"
7219 "class A {\n"
7220 " void f() {}\n"
7221 " int *a;\n"
7222 "};\n"
7223 "}\n"
7224 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007225}
7226
Manuel Klimekd33516e2013-01-23 10:09:28 +00007227TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7228 verifyFormat("while");
7229 verifyFormat("operator");
7230}
7231
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007232TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7233 // This code would be painfully slow to format if we didn't skip it.
7234 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
7235 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7236 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7237 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7238 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7239 "A(1, 1)\n"
7240 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7241 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7242 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7243 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7244 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7245 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7246 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7247 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7248 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7249 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7250 // Deeply nested part is untouched, rest is formatted.
7251 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7252 format(std::string("int i;\n") + Code + "int j;\n",
7253 getLLVMStyle(), IC_ExpectIncomplete));
7254}
7255
Nico Weber7e6a7a12013-01-08 17:56:31 +00007256//===----------------------------------------------------------------------===//
7257// Objective-C tests.
7258//===----------------------------------------------------------------------===//
7259
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007260TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7261 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7262 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7263 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007264 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007265 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7266 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7267 format("-(NSInteger)Method3:(id)anObject;"));
7268 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7269 format("-(NSInteger)Method4:(id)anObject;"));
7270 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7271 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7272 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7273 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007274 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7275 "forAllCells:(BOOL)flag;",
7276 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7277 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007278
7279 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007280 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7281 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007282 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7283 " inRange:(NSRange)range\n"
7284 " outRange:(NSRange)out_range\n"
7285 " outRange1:(NSRange)out_range1\n"
7286 " outRange2:(NSRange)out_range2\n"
7287 " outRange3:(NSRange)out_range3\n"
7288 " outRange4:(NSRange)out_range4\n"
7289 " outRange5:(NSRange)out_range5\n"
7290 " outRange6:(NSRange)out_range6\n"
7291 " outRange7:(NSRange)out_range7\n"
7292 " outRange8:(NSRange)out_range8\n"
7293 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007294
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007295 // When the function name has to be wrapped.
7296 FormatStyle Style = getLLVMStyle();
7297 Style.IndentWrappedFunctionNames = false;
7298 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7299 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7300 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7301 "}",
7302 Style);
7303 Style.IndentWrappedFunctionNames = true;
7304 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7305 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7306 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7307 "}",
7308 Style);
7309
Nico Weberd6f962f2013-01-10 20:18:33 +00007310 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007311 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007312 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7313 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007314 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007315
Daniel Jasper37194282013-05-28 08:33:00 +00007316 verifyFormat("- (int (*)())foo:(int (*)())f;");
7317 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007318
7319 // If there's no return type (very rare in practice!), LLVM and Google style
7320 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007321 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007322 verifyFormat("- foo:(int)f;");
7323 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007324}
7325
Nico Weber7eecf4b2013-01-09 20:25:35 +00007326TEST_F(FormatTest, FormatObjCInterface) {
Nico Webera6087752013-01-10 20:12:55 +00007327 verifyFormat("@interface Foo : NSObject <NSSomeDelegate> {\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007328 "@public\n"
7329 " int field1;\n"
7330 "@protected\n"
7331 " int field2;\n"
7332 "@private\n"
7333 " int field3;\n"
7334 "@package\n"
7335 " int field4;\n"
7336 "}\n"
7337 "+ (id)init;\n"
7338 "@end");
7339
Nico Weber7eecf4b2013-01-09 20:25:35 +00007340 verifyGoogleFormat("@interface Foo : NSObject<NSSomeDelegate> {\n"
7341 " @public\n"
7342 " int field1;\n"
7343 " @protected\n"
7344 " int field2;\n"
7345 " @private\n"
7346 " int field3;\n"
7347 " @package\n"
7348 " int field4;\n"
7349 "}\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007350 "+ (id)init;\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007351 "@end");
7352
Nico Weber6029d4f2013-01-22 16:53:59 +00007353 verifyFormat("@interface /* wait for it */ Foo\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007354 "+ (id)init;\n"
7355 "// Look, a comment!\n"
7356 "- (int)answerWith:(int)i;\n"
7357 "@end");
7358
7359 verifyFormat("@interface Foo\n"
Nico Weberd8ffe752013-01-09 21:42:32 +00007360 "@end\n"
7361 "@interface Bar\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007362 "@end");
7363
7364 verifyFormat("@interface Foo : Bar\n"
7365 "+ (id)init;\n"
7366 "@end");
7367
Nico Weber6029d4f2013-01-22 16:53:59 +00007368 verifyFormat("@interface Foo : /**/ Bar /**/ <Baz, /**/ Quux>\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007369 "+ (id)init;\n"
7370 "@end");
7371
Nico Webera6087752013-01-10 20:12:55 +00007372 verifyGoogleFormat("@interface Foo : Bar<Baz, Quux>\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007373 "+ (id)init;\n"
Nico Webera6087752013-01-10 20:12:55 +00007374 "@end");
7375
Nico Weber2bb00742013-01-10 19:19:14 +00007376 verifyFormat("@interface Foo (HackStuff)\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007377 "+ (id)init;\n"
7378 "@end");
7379
Nico Weber2bb00742013-01-10 19:19:14 +00007380 verifyFormat("@interface Foo ()\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007381 "+ (id)init;\n"
7382 "@end");
7383
Nico Webera6087752013-01-10 20:12:55 +00007384 verifyFormat("@interface Foo (HackStuff) <MyProtocol>\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007385 "+ (id)init;\n"
7386 "@end");
7387
Daniel Jasper20e15562015-04-16 07:02:19 +00007388 verifyGoogleFormat("@interface Foo (HackStuff)<MyProtocol>\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007389 "+ (id)init;\n"
Nico Webera6087752013-01-10 20:12:55 +00007390 "@end");
7391
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007392 verifyFormat("@interface Foo {\n"
7393 " int _i;\n"
7394 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007395 "+ (id)init;\n"
7396 "@end");
7397
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007398 verifyFormat("@interface Foo : Bar {\n"
7399 " int _i;\n"
7400 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007401 "+ (id)init;\n"
7402 "@end");
7403
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007404 verifyFormat("@interface Foo : Bar <Baz, Quux> {\n"
7405 " int _i;\n"
7406 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007407 "+ (id)init;\n"
7408 "@end");
7409
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007410 verifyFormat("@interface Foo (HackStuff) {\n"
7411 " int _i;\n"
7412 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007413 "+ (id)init;\n"
7414 "@end");
7415
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007416 verifyFormat("@interface Foo () {\n"
7417 " int _i;\n"
7418 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007419 "+ (id)init;\n"
7420 "@end");
7421
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007422 verifyFormat("@interface Foo (HackStuff) <MyProtocol> {\n"
7423 " int _i;\n"
7424 "}\n"
Nico Weber7eecf4b2013-01-09 20:25:35 +00007425 "+ (id)init;\n"
7426 "@end");
Daniel Jasper437c3f52014-04-28 07:34:48 +00007427
7428 FormatStyle OnePerLine = getGoogleStyle();
7429 OnePerLine.BinPackParameters = false;
Daniel Jasper20e15562015-04-16 07:02:19 +00007430 verifyFormat("@interface aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ()<\n"
Daniel Jasper437c3f52014-04-28 07:34:48 +00007431 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7432 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7433 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7434 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
7435 "}",
7436 OnePerLine);
Nico Weber7eecf4b2013-01-09 20:25:35 +00007437}
7438
Nico Weber2ce0ac52013-01-09 23:25:37 +00007439TEST_F(FormatTest, FormatObjCImplementation) {
7440 verifyFormat("@implementation Foo : NSObject {\n"
7441 "@public\n"
7442 " int field1;\n"
7443 "@protected\n"
7444 " int field2;\n"
7445 "@private\n"
7446 " int field3;\n"
7447 "@package\n"
7448 " int field4;\n"
7449 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007450 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007451 "@end");
7452
7453 verifyGoogleFormat("@implementation Foo : NSObject {\n"
7454 " @public\n"
7455 " int field1;\n"
7456 " @protected\n"
7457 " int field2;\n"
7458 " @private\n"
7459 " int field3;\n"
7460 " @package\n"
7461 " int field4;\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
7466 verifyFormat("@implementation Foo\n"
7467 "+ (id)init {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +00007468 " if (true)\n"
7469 " return nil;\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007470 "}\n"
7471 "// Look, a comment!\n"
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007472 "- (int)answerWith:(int)i {\n"
7473 " return i;\n"
7474 "}\n"
Nico Webera21aaae2013-01-11 21:14:08 +00007475 "+ (int)answerWith:(int)i {\n"
7476 " return i;\n"
7477 "}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007478 "@end");
7479
7480 verifyFormat("@implementation Foo\n"
7481 "@end\n"
7482 "@implementation Bar\n"
7483 "@end");
7484
Daniel Jasper91b032a2014-05-22 12:46:38 +00007485 EXPECT_EQ("@implementation Foo : Bar\n"
7486 "+ (id)init {\n}\n"
7487 "- (void)foo {\n}\n"
7488 "@end",
7489 format("@implementation Foo : Bar\n"
7490 "+(id)init{}\n"
7491 "-(void)foo{}\n"
7492 "@end"));
Nico Weber2ce0ac52013-01-09 23:25:37 +00007493
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007494 verifyFormat("@implementation Foo {\n"
7495 " int _i;\n"
7496 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007497 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007498 "@end");
7499
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007500 verifyFormat("@implementation Foo : Bar {\n"
7501 " int _i;\n"
7502 "}\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007503 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007504 "@end");
7505
Nico Weber2bb00742013-01-10 19:19:14 +00007506 verifyFormat("@implementation Foo (HackStuff)\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007507 "+ (id)init {\n}\n"
Nico Weber2ce0ac52013-01-09 23:25:37 +00007508 "@end");
Daniel Jaspera15da302013-08-28 08:04:23 +00007509 verifyFormat("@implementation ObjcClass\n"
7510 "- (void)method;\n"
7511 "{}\n"
7512 "@end");
Nico Weber2ce0ac52013-01-09 23:25:37 +00007513}
7514
Nico Weber8696a8d2013-01-09 21:15:03 +00007515TEST_F(FormatTest, FormatObjCProtocol) {
7516 verifyFormat("@protocol Foo\n"
7517 "@property(weak) id delegate;\n"
7518 "- (NSUInteger)numberOfThings;\n"
7519 "@end");
7520
Nico Webera6087752013-01-10 20:12:55 +00007521 verifyFormat("@protocol MyProtocol <NSObject>\n"
Nico Weber8696a8d2013-01-09 21:15:03 +00007522 "- (NSUInteger)numberOfThings;\n"
7523 "@end");
7524
Nico Webera6087752013-01-10 20:12:55 +00007525 verifyGoogleFormat("@protocol MyProtocol<NSObject>\n"
Nico Weber772fbfd2013-01-17 06:14:50 +00007526 "- (NSUInteger)numberOfThings;\n"
Nico Webera6087752013-01-10 20:12:55 +00007527 "@end");
7528
Nico Weber8696a8d2013-01-09 21:15:03 +00007529 verifyFormat("@protocol Foo;\n"
7530 "@protocol Bar;\n");
Nico Weberd8ffe752013-01-09 21:42:32 +00007531
7532 verifyFormat("@protocol Foo\n"
7533 "@end\n"
7534 "@protocol Bar\n"
7535 "@end");
Nico Weber51306d22013-01-10 00:25:19 +00007536
7537 verifyFormat("@protocol myProtocol\n"
7538 "- (void)mandatoryWithInt:(int)i;\n"
7539 "@optional\n"
7540 "- (void)optional;\n"
7541 "@required\n"
7542 "- (void)required;\n"
Nico Weberbbe28b32013-01-10 00:42:07 +00007543 "@optional\n"
7544 "@property(assign) int madProp;\n"
Nico Weber51306d22013-01-10 00:25:19 +00007545 "@end\n");
Daniel Jasper9688ff12013-08-01 13:46:58 +00007546
7547 verifyFormat("@property(nonatomic, assign, readonly)\n"
7548 " int *looooooooooooooooooooooooooooongNumber;\n"
7549 "@property(nonatomic, assign, readonly)\n"
7550 " NSString *looooooooooooooooooooooooooooongName;");
Benjamin Kramere21cb742014-01-08 15:59:42 +00007551
7552 verifyFormat("@implementation PR18406\n"
7553 "}\n"
7554 "@end");
Nico Weber8696a8d2013-01-09 21:15:03 +00007555}
7556
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007557TEST_F(FormatTest, FormatObjCMethodDeclarations) {
7558 verifyFormat("- (void)doSomethingWith:(GTMFoo *)theFoo\n"
7559 " rect:(NSRect)theRect\n"
7560 " interval:(float)theInterval {\n"
7561 "}");
7562 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
Daniel Jasper06a26952016-01-04 07:29:07 +00007563 " longKeyword:(NSRect)theRect\n"
7564 " longerKeyword:(float)theInterval\n"
7565 " error:(NSError **)theError {\n"
7566 "}");
7567 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007568 " longKeyword:(NSRect)theRect\n"
7569 " evenLongerKeyword:(float)theInterval\n"
7570 " error:(NSError **)theError {\n"
7571 "}");
Daniel Jasperec8e8382014-10-11 08:24:56 +00007572 verifyFormat("- (instancetype)initXxxxxx:(id<x>)x\n"
7573 " y:(id<yyyyyyyyyyyyyyyyyyyy>)y\n"
7574 " NS_DESIGNATED_INITIALIZER;",
7575 getLLVMStyleWithColumns(60));
Daniel Jasper3c44c222015-07-16 22:58:24 +00007576
7577 // Continuation indent width should win over aligning colons if the function
7578 // name is long.
7579 FormatStyle continuationStyle = getGoogleStyle();
7580 continuationStyle.ColumnLimit = 40;
7581 continuationStyle.IndentWrappedFunctionNames = true;
7582 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
7583 " dontAlignNamef:(NSRect)theRect {\n"
7584 "}",
7585 continuationStyle);
7586
7587 // Make sure we don't break aligning for short parameter names.
7588 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
7589 " aShortf:(NSRect)theRect {\n"
7590 "}",
7591 continuationStyle);
Daniel Jasperfd36f0b2016-11-12 07:38:22 +00007592
7593 // Format pairs correctly.
7594 verifyFormat("- (void)drawRectOn:(id)surface\n"
7595 " ofSize:(aaaaaaaa)height\n"
7596 " :(size_t)width\n"
7597 " atOrigin:(size_t)x\n"
7598 " :(size_t)y\n"
7599 " aaaaa:(a)yyy\n"
7600 " bbb:(d)cccc;");
7601 verifyFormat("- (void)drawRectOn:(id)surface ofSize:(aaa)height:(bbb)width;");
7602 verifyFormat("- (void)drawRectOn:(id)surface\n"
7603 " ofSize:(size_t)height\n"
7604 " :(size_t)width;",
7605 getLLVMStyleWithColumns(60));
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007606}
7607
Nico Webera7252d82013-01-12 06:18:40 +00007608TEST_F(FormatTest, FormatObjCMethodExpr) {
7609 verifyFormat("[foo bar:baz];");
7610 verifyFormat("return [foo bar:baz];");
Daniel Jasperea772b4d2014-10-16 08:38:51 +00007611 verifyFormat("return (a)[foo bar:baz];");
Nico Webera7252d82013-01-12 06:18:40 +00007612 verifyFormat("f([foo bar:baz]);");
7613 verifyFormat("f(2, [foo bar:baz]);");
7614 verifyFormat("f(2, a ? b : c);");
7615 verifyFormat("[[self initWithInt:4] bar:[baz quux:arrrr]];");
7616
Nico Weberb76de882013-02-05 16:21:00 +00007617 // Unary operators.
7618 verifyFormat("int a = +[foo bar:baz];");
7619 verifyFormat("int a = -[foo bar:baz];");
7620 verifyFormat("int a = ![foo bar:baz];");
7621 verifyFormat("int a = ~[foo bar:baz];");
7622 verifyFormat("int a = ++[foo bar:baz];");
7623 verifyFormat("int a = --[foo bar:baz];");
7624 verifyFormat("int a = sizeof [foo bar:baz];");
Alexander Kornienko1e808872013-06-28 12:51:24 +00007625 verifyFormat("int a = alignof [foo bar:baz];", getGoogleStyle());
Nico Weber5d2624e2013-02-06 06:20:11 +00007626 verifyFormat("int a = &[foo bar:baz];");
7627 verifyFormat("int a = *[foo bar:baz];");
Nico Weberb76de882013-02-05 16:21:00 +00007628 // FIXME: Make casts work, without breaking f()[4].
Daniel Jaspera44991332015-04-29 13:06:49 +00007629 // verifyFormat("int a = (int)[foo bar:baz];");
7630 // verifyFormat("return (int)[foo bar:baz];");
7631 // verifyFormat("(void)[foo bar:baz];");
Nico Webera7892392013-02-13 03:48:27 +00007632 verifyFormat("return (MyType *)[self.tableView cellForRowAtIndexPath:cell];");
Nico Weberb76de882013-02-05 16:21:00 +00007633
7634 // Binary operators.
Nico Webera7252d82013-01-12 06:18:40 +00007635 verifyFormat("[foo bar:baz], [foo bar:baz];");
7636 verifyFormat("[foo bar:baz] = [foo bar:baz];");
7637 verifyFormat("[foo bar:baz] *= [foo bar:baz];");
7638 verifyFormat("[foo bar:baz] /= [foo bar:baz];");
7639 verifyFormat("[foo bar:baz] %= [foo bar:baz];");
7640 verifyFormat("[foo bar:baz] += [foo bar:baz];");
7641 verifyFormat("[foo bar:baz] -= [foo bar:baz];");
7642 verifyFormat("[foo bar:baz] <<= [foo bar:baz];");
7643 verifyFormat("[foo bar:baz] >>= [foo bar:baz];");
7644 verifyFormat("[foo bar:baz] &= [foo bar:baz];");
7645 verifyFormat("[foo bar:baz] ^= [foo bar:baz];");
7646 verifyFormat("[foo bar:baz] |= [foo bar:baz];");
7647 verifyFormat("[foo bar:baz] ? [foo bar:baz] : [foo bar:baz];");
7648 verifyFormat("[foo bar:baz] || [foo bar:baz];");
7649 verifyFormat("[foo bar:baz] && [foo bar:baz];");
7650 verifyFormat("[foo bar:baz] | [foo bar:baz];");
7651 verifyFormat("[foo bar:baz] ^ [foo bar:baz];");
7652 verifyFormat("[foo bar:baz] & [foo bar:baz];");
7653 verifyFormat("[foo bar:baz] == [foo bar:baz];");
7654 verifyFormat("[foo bar:baz] != [foo bar:baz];");
7655 verifyFormat("[foo bar:baz] >= [foo bar:baz];");
7656 verifyFormat("[foo bar:baz] <= [foo bar:baz];");
7657 verifyFormat("[foo bar:baz] > [foo bar:baz];");
7658 verifyFormat("[foo bar:baz] < [foo bar:baz];");
7659 verifyFormat("[foo bar:baz] >> [foo bar:baz];");
7660 verifyFormat("[foo bar:baz] << [foo bar:baz];");
7661 verifyFormat("[foo bar:baz] - [foo bar:baz];");
7662 verifyFormat("[foo bar:baz] + [foo bar:baz];");
7663 verifyFormat("[foo bar:baz] * [foo bar:baz];");
7664 verifyFormat("[foo bar:baz] / [foo bar:baz];");
7665 verifyFormat("[foo bar:baz] % [foo bar:baz];");
7666 // Whew!
7667
Nico Weber29f9dea2013-02-11 15:32:15 +00007668 verifyFormat("return in[42];");
Daniel Jasper3a623db2014-12-18 12:11:01 +00007669 verifyFormat("for (auto v : in[1]) {\n}");
Daniel Jasper2b1865c2015-04-15 07:26:18 +00007670 verifyFormat("for (int i = 0; i < in[a]; ++i) {\n}");
7671 verifyFormat("for (int i = 0; in[a] < i; ++i) {\n}");
7672 verifyFormat("for (int i = 0; i < n; ++i, ++in[a]) {\n}");
7673 verifyFormat("for (int i = 0; i < n; ++i, in[a]++) {\n}");
7674 verifyFormat("for (int i = 0; i < f(in[a]); ++i, in[a]++) {\n}");
Nico Weber29f9dea2013-02-11 15:32:15 +00007675 verifyFormat("for (id foo in [self getStuffFor:bla]) {\n"
7676 "}");
Daniel Jasper78580792014-10-20 12:01:45 +00007677 verifyFormat("[self aaaaa:MACRO(a, b:, c:)];");
Daniel Jaspercdb58b22015-05-15 09:05:31 +00007678 verifyFormat("[self aaaaa:(1 + 2) bbbbb:3];");
7679 verifyFormat("[self aaaaa:(Type)a bbbbb:3];");
Nico Weber29f9dea2013-02-11 15:32:15 +00007680
Nico Webera7252d82013-01-12 06:18:40 +00007681 verifyFormat("[self stuffWithInt:(4 + 2) float:4.5];");
7682 verifyFormat("[self stuffWithInt:a ? b : c float:4.5];");
7683 verifyFormat("[self stuffWithInt:a ? [self foo:bar] : c];");
7684 verifyFormat("[self stuffWithInt:a ? (e ? f : g) : c];");
7685 verifyFormat("[cond ? obj1 : obj2 methodWithParam:param]");
Nico Weber5c8709b2013-01-12 23:41:33 +00007686 verifyFormat("[button setAction:@selector(zoomOut:)];");
Nico Weber2827a7e2013-01-12 23:48:49 +00007687 verifyFormat("[color getRed:&r green:&g blue:&b alpha:&a];");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007688
Nico Webera7252d82013-01-12 06:18:40 +00007689 verifyFormat("arr[[self indexForFoo:a]];");
7690 verifyFormat("throw [self errorFor:a];");
7691 verifyFormat("@throw [self errorFor:a];");
7692
Nico Weberec9e4102013-06-25 00:55:57 +00007693 verifyFormat("[(id)foo bar:(id)baz quux:(id)snorf];");
7694 verifyFormat("[(id)foo bar:(id) ? baz : quux];");
7695 verifyFormat("4 > 4 ? (id)a : (id)baz;");
7696
Nico Weberc9d73612013-01-12 22:48:47 +00007697 // This tests that the formatter doesn't break after "backing" but before ":",
7698 // which would be at 80 columns.
Nico Webera7252d82013-01-12 06:18:40 +00007699 verifyFormat(
7700 "void f() {\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007701 " if ((self = [super initWithContentRect:contentRect\n"
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007702 " styleMask:styleMask ?: otherMask\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007703 " backing:NSBackingStoreBuffered\n"
7704 " defer:YES]))");
7705
Daniel Jasperc697ad22013-02-06 10:05:46 +00007706 verifyFormat(
7707 "[foo checkThatBreakingAfterColonWorksOk:\n"
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007708 " [bar ifItDoes:reduceOverallLineLengthLikeInThisCase]];");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007709
7710 verifyFormat("[myObj short:arg1 // Force line break\n"
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007711 " longKeyword:arg2 != nil ? arg2 : @\"longKeyword\"\n"
7712 " evenLongerKeyword:arg3 ?: @\"evenLongerKeyword\"\n"
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007713 " error:arg4];");
7714 verifyFormat(
7715 "void f() {\n"
7716 " popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
7717 " initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n"
7718 " pos.width(), pos.height())\n"
7719 " styleMask:NSBorderlessWindowMask\n"
7720 " backing:NSBackingStoreBuffered\n"
7721 " defer:NO]);\n"
7722 "}");
Daniel Jasper4478e522013-11-08 17:33:24 +00007723 verifyFormat(
7724 "void f() {\n"
7725 " popup_wdow_.reset([[RenderWidgetPopupWindow alloc]\n"
7726 " iniithContentRect:NSMakRet(origin_global.x, origin_global.y,\n"
7727 " pos.width(), pos.height())\n"
7728 " syeMask:NSBorderlessWindowMask\n"
7729 " bking:NSBackingStoreBuffered\n"
7730 " der:NO]);\n"
7731 "}",
7732 getLLVMStyleWithColumns(70));
Daniel Jasper18210d72014-10-09 09:52:05 +00007733 verifyFormat(
7734 "void f() {\n"
7735 " popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
7736 " initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n"
7737 " pos.width(), pos.height())\n"
7738 " styleMask:NSBorderlessWindowMask\n"
7739 " backing:NSBackingStoreBuffered\n"
7740 " defer:NO]);\n"
7741 "}",
7742 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasperc697ad22013-02-06 10:05:46 +00007743 verifyFormat("[contentsContainer replaceSubview:[subviews objectAtIndex:0]\n"
7744 " with:contentsNativeView];");
7745
7746 verifyFormat(
7747 "[pboard addTypes:[NSArray arrayWithObject:kBookmarkButtonDragType]\n"
7748 " owner:nillllll];");
7749
Daniel Jasperc697ad22013-02-06 10:05:46 +00007750 verifyFormat(
Daniel Jasperacc33662013-02-08 08:22:00 +00007751 "[pboard setData:[NSData dataWithBytes:&button length:sizeof(button)]\n"
Daniel Jasperc697ad22013-02-06 10:05:46 +00007752 " forType:kBookmarkButtonDragType];");
7753
7754 verifyFormat("[defaultCenter addObserver:self\n"
7755 " selector:@selector(willEnterFullscreen)\n"
7756 " name:kWillEnterFullscreenNotification\n"
7757 " object:nil];");
Daniel Jasperc485b4e2013-02-06 16:00:26 +00007758 verifyFormat("[image_rep drawInRect:drawRect\n"
7759 " fromRect:NSZeroRect\n"
7760 " operation:NSCompositeCopy\n"
7761 " fraction:1.0\n"
7762 " respectFlipped:NO\n"
7763 " hints:nil];");
Daniel Jaspereb536682015-05-06 12:48:06 +00007764 verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7765 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasper9c950132015-05-07 14:19:59 +00007766 verifyFormat("[aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
7767 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jaspera7b14262015-05-13 10:23:03 +00007768 verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaa[aaaaaaaaaaaaaaaaaaaaa]\n"
7769 " aaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasper00492f92016-01-05 13:03:50 +00007770 verifyFormat("[call aaaaaaaa.aaaaaa.aaaaaaaa.aaaaaaaa.aaaaaaaa.aaaaaaaa\n"
7771 " .aaaaaaaa];", // FIXME: Indentation seems off.
Daniel Jaspered41f772015-05-19 11:06:33 +00007772 getLLVMStyleWithColumns(60));
Nico Weberac9bde22013-02-06 16:54:35 +00007773
7774 verifyFormat(
7775 "scoped_nsobject<NSTextField> message(\n"
7776 " // The frame will be fixed up when |-setMessageText:| is called.\n"
7777 " [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 0, 0)]);");
Daniel Jasper7cdc78b2013-08-01 23:13:03 +00007778 verifyFormat("[self aaaaaa:bbbbbbbbbbbbb\n"
7779 " aaaaaaaaaa:bbbbbbbbbbbbbbbbb\n"
7780 " aaaaa:bbbbbbbbbbb + bbbbbbbbbbbb\n"
7781 " aaaa:bbb];");
Daniel Jasper4478e522013-11-08 17:33:24 +00007782 verifyFormat("[self param:function( //\n"
7783 " parameter)]");
Daniel Jasperf48b5ab2013-11-07 19:23:49 +00007784 verifyFormat(
7785 "[self aaaaaaaaaa:aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |\n"
7786 " aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |\n"
7787 " aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa];");
Daniel Jaspera1ea4cb2013-10-26 17:00:22 +00007788
Daniel Jasper2746a302015-05-06 13:13:03 +00007789 // FIXME: This violates the column limit.
7790 verifyFormat(
7791 "[aaaaaaaaaaaaaaaaaaaaaaaaa\n"
7792 " aaaaaaaaaaaaaaaaa:aaaaaaaa\n"
7793 " aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];",
7794 getLLVMStyleWithColumns(60));
7795
Daniel Jaspera1ea4cb2013-10-26 17:00:22 +00007796 // Variadic parameters.
7797 verifyFormat(
7798 "NSArray *myStrings = [NSArray stringarray:@\"a\", @\"b\", nil];");
Daniel Jasperf48b5ab2013-11-07 19:23:49 +00007799 verifyFormat(
7800 "[self aaaaaaaaaaaaa:aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
7801 " aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
7802 " aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa];");
Daniel Jasperb302f9a2013-11-08 02:08:01 +00007803 verifyFormat("[self // break\n"
7804 " a:a\n"
7805 " aaa:aaa];");
Daniel Jasper3460b252013-12-18 07:08:51 +00007806 verifyFormat("bool a = ([aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaa ||\n"
7807 " [aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperfd36f0b2016-11-12 07:38:22 +00007808
7809 // Formats pair-parameters.
7810 verifyFormat("[I drawRectOn:surface ofSize:aa:bbb atOrigin:cc:dd];");
7811 verifyFormat("[I drawRectOn:surface //\n"
7812 " ofSize:aa:bbb\n"
7813 " atOrigin:cc:dd];");
Nico Webera7252d82013-01-12 06:18:40 +00007814}
7815
Nico Weber12d5bab2013-01-07 15:56:25 +00007816TEST_F(FormatTest, ObjCAt) {
Nico Weber803d61d2013-01-07 16:07:07 +00007817 verifyFormat("@autoreleasepool");
Nico Webere89c42f2013-01-07 16:14:28 +00007818 verifyFormat("@catch");
7819 verifyFormat("@class");
Nico Weber803d61d2013-01-07 16:07:07 +00007820 verifyFormat("@compatibility_alias");
7821 verifyFormat("@defs");
Nico Webera8876502013-01-07 15:17:23 +00007822 verifyFormat("@dynamic");
Nico Weber803d61d2013-01-07 16:07:07 +00007823 verifyFormat("@encode");
7824 verifyFormat("@end");
7825 verifyFormat("@finally");
7826 verifyFormat("@implementation");
7827 verifyFormat("@import");
7828 verifyFormat("@interface");
7829 verifyFormat("@optional");
7830 verifyFormat("@package");
Nico Webere89c42f2013-01-07 16:14:28 +00007831 verifyFormat("@private");
Nico Weber803d61d2013-01-07 16:07:07 +00007832 verifyFormat("@property");
Nico Webere89c42f2013-01-07 16:14:28 +00007833 verifyFormat("@protected");
Nico Weber803d61d2013-01-07 16:07:07 +00007834 verifyFormat("@protocol");
Nico Webere89c42f2013-01-07 16:14:28 +00007835 verifyFormat("@public");
Nico Weber803d61d2013-01-07 16:07:07 +00007836 verifyFormat("@required");
7837 verifyFormat("@selector");
7838 verifyFormat("@synchronized");
7839 verifyFormat("@synthesize");
Nico Webere89c42f2013-01-07 16:14:28 +00007840 verifyFormat("@throw");
7841 verifyFormat("@try");
Nico Weber803d61d2013-01-07 16:07:07 +00007842
Nico Weber12d5bab2013-01-07 15:56:25 +00007843 EXPECT_EQ("@interface", format("@ interface"));
7844
7845 // The precise formatting of this doesn't matter, nobody writes code like
7846 // this.
7847 verifyFormat("@ /*foo*/ interface");
Nico Webera8876502013-01-07 15:17:23 +00007848}
7849
Nico Weberd8cdb532013-01-08 19:15:23 +00007850TEST_F(FormatTest, ObjCSnippets) {
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007851 verifyFormat("@autoreleasepool {\n"
7852 " foo();\n"
7853 "}");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007854 verifyFormat("@class Foo, Bar;");
Nico Weberd8cdb532013-01-08 19:15:23 +00007855 verifyFormat("@compatibility_alias AliasName ExistingClass;");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007856 verifyFormat("@dynamic textColor;");
Nico Webere3025672013-01-18 05:11:47 +00007857 verifyFormat("char *buf1 = @encode(int *);");
7858 verifyFormat("char *buf1 = @encode(typeof(4 * 5));");
Nico Weber44449172013-02-12 16:17:07 +00007859 verifyFormat("char *buf1 = @encode(int **);");
Nico Weber4cc98742013-01-08 20:16:23 +00007860 verifyFormat("Protocol *proto = @protocol(p1);");
Nico Weber250fe712013-01-18 02:43:57 +00007861 verifyFormat("SEL s = @selector(foo:);");
Manuel Klimek2acb7b72013-01-11 19:17:44 +00007862 verifyFormat("@synchronized(self) {\n"
7863 " f();\n"
7864 "}");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007865
Nico Webera2a84952013-01-10 21:30:42 +00007866 verifyFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
7867 verifyGoogleFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
7868
Nico Weber7e6a7a12013-01-08 17:56:31 +00007869 verifyFormat("@property(assign, nonatomic) CGFloat hoverAlpha;");
Nico Webera2a84952013-01-10 21:30:42 +00007870 verifyFormat("@property(assign, getter=isEditable) BOOL editable;");
7871 verifyGoogleFormat("@property(assign, getter=isEditable) BOOL editable;");
Daniel Jaspere9beea22014-01-28 15:20:33 +00007872 verifyFormat("@property (assign, getter=isEditable) BOOL editable;",
7873 getMozillaStyle());
7874 verifyFormat("@property BOOL editable;", getMozillaStyle());
7875 verifyFormat("@property (assign, getter=isEditable) BOOL editable;",
7876 getWebKitStyle());
7877 verifyFormat("@property BOOL editable;", getWebKitStyle());
Nico Webere8d78242013-06-25 00:25:40 +00007878
7879 verifyFormat("@import foo.bar;\n"
7880 "@import baz;");
Nico Weber7e6a7a12013-01-08 17:56:31 +00007881}
7882
Daniel Jasper9cb1ac282015-10-07 15:09:08 +00007883TEST_F(FormatTest, ObjCForIn) {
7884 verifyFormat("- (void)test {\n"
7885 " for (NSString *n in arrayOfStrings) {\n"
7886 " foo(n);\n"
7887 " }\n"
7888 "}");
7889 verifyFormat("- (void)test {\n"
7890 " for (NSString *n in (__bridge NSArray *)arrayOfStrings) {\n"
7891 " foo(n);\n"
7892 " }\n"
7893 "}");
7894}
7895
Nico Weber0588b502013-02-07 00:19:29 +00007896TEST_F(FormatTest, ObjCLiterals) {
7897 verifyFormat("@\"String\"");
7898 verifyFormat("@1");
7899 verifyFormat("@+4.8");
7900 verifyFormat("@-4");
7901 verifyFormat("@1LL");
7902 verifyFormat("@.5");
7903 verifyFormat("@'c'");
7904 verifyFormat("@true");
7905
7906 verifyFormat("NSNumber *smallestInt = @(-INT_MAX - 1);");
7907 verifyFormat("NSNumber *piOverTwo = @(M_PI / 2);");
7908 verifyFormat("NSNumber *favoriteColor = @(Green);");
7909 verifyFormat("NSString *path = @(getenv(\"PATH\"));");
Daniel Jasperb1c19f82014-01-10 07:44:53 +00007910
7911 verifyFormat("[dictionary setObject:@(1) forKey:@\"number\"];");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007912}
Nico Weber0588b502013-02-07 00:19:29 +00007913
Daniel Jasperb596fb22013-10-24 10:31:50 +00007914TEST_F(FormatTest, ObjCDictLiterals) {
Nico Weber0588b502013-02-07 00:19:29 +00007915 verifyFormat("@{");
Nico Weber372d8dc2013-02-10 20:35:35 +00007916 verifyFormat("@{}");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007917 verifyFormat("@{@\"one\" : @1}");
7918 verifyFormat("return @{@\"one\" : @1;");
Daniel Jaspera125d532014-03-21 12:38:57 +00007919 verifyFormat("@{@\"one\" : @1}");
Manuel Klimek1a18c402013-04-12 14:13:36 +00007920
Chandler Carruthf8b72662014-03-02 12:37:31 +00007921 verifyFormat("@{@\"one\" : @{@2 : @1}}");
Daniel Jaspera125d532014-03-21 12:38:57 +00007922 verifyFormat("@{\n"
7923 " @\"one\" : @{@2 : @1},\n"
7924 "}");
Manuel Klimek1a18c402013-04-12 14:13:36 +00007925
Chandler Carruthf8b72662014-03-02 12:37:31 +00007926 verifyFormat("@{1 > 2 ? @\"one\" : @\"two\" : 1 > 2 ? @1 : @2}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007927 verifyIncompleteFormat("[self setDict:@{}");
7928 verifyIncompleteFormat("[self setDict:@{@1 : @2}");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007929 verifyFormat("NSLog(@\"%@\", @{@1 : @2, @2 : @3}[@1]);");
Nico Weber372d8dc2013-02-10 20:35:35 +00007930 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007931 "NSDictionary *masses = @{@\"H\" : @1.0078, @\"He\" : @4.0026};");
Nico Weber33c68e92013-02-10 20:39:05 +00007932 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007933 "NSDictionary *settings = @{AVEncoderKey : @(AVAudioQualityMax)};");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007934
Daniel Jaspera44991332015-04-29 13:06:49 +00007935 verifyFormat("NSDictionary *d = @{\n"
7936 " @\"nam\" : NSUserNam(),\n"
7937 " @\"dte\" : [NSDate date],\n"
7938 " @\"processInfo\" : [NSProcessInfo processInfo]\n"
7939 "};");
Nico Weberced7d412013-05-26 05:39:26 +00007940 verifyFormat(
Daniel Jasperd489dd32013-10-20 16:45:46 +00007941 "@{\n"
7942 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee : "
7943 "regularFont,\n"
7944 "};");
Daniel Jasperb8f61682013-10-22 15:45:58 +00007945 verifyGoogleFormat(
7946 "@{\n"
7947 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee : "
7948 "regularFont,\n"
7949 "};");
Daniel Jasper1fd6f1f2014-03-17 14:32:47 +00007950 verifyFormat(
7951 "@{\n"
7952 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee :\n"
7953 " reeeeeeeeeeeeeeeeeeeeeeeegularFont,\n"
7954 "};");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007955
7956 // We should try to be robust in case someone forgets the "@".
Daniel Jaspera44991332015-04-29 13:06:49 +00007957 verifyFormat("NSDictionary *d = {\n"
7958 " @\"nam\" : NSUserNam(),\n"
7959 " @\"dte\" : [NSDate date],\n"
7960 " @\"processInfo\" : [NSProcessInfo processInfo]\n"
7961 "};");
Daniel Jasper335ff262014-05-28 09:11:53 +00007962 verifyFormat("NSMutableDictionary *dictionary =\n"
7963 " [NSMutableDictionary dictionaryWithDictionary:@{\n"
7964 " aaaaaaaaaaaaaaaaaaaaa : aaaaaaaaaaaaa,\n"
7965 " bbbbbbbbbbbbbbbbbb : bbbbb,\n"
7966 " cccccccccccccccc : ccccccccccccccc\n"
7967 " }];");
Daniel Jasper4d724492015-10-12 03:19:07 +00007968
7969 // Ensure that casts before the key are kept on the same line as the key.
7970 verifyFormat(
7971 "NSDictionary *d = @{\n"
7972 " (aaaaaaaa id)aaaaaaaaa : (aaaaaaaa id)aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7973 " (aaaaaaaa id)aaaaaaaaaaaaaa : (aaaaaaaa id)aaaaaaaaaaaaaa,\n"
7974 "};");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007975}
7976
7977TEST_F(FormatTest, ObjCArrayLiterals) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007978 verifyIncompleteFormat("@[");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007979 verifyFormat("@[]");
7980 verifyFormat(
7981 "NSArray *array = @[ @\" Hey \", NSApp, [NSNumber numberWithInt:42] ];");
7982 verifyFormat("return @[ @3, @[], @[ @4, @5 ] ];");
7983 verifyFormat("NSArray *array = @[ [foo description] ];");
7984
7985 verifyFormat(
7986 "NSArray *some_variable = @[\n"
7987 " aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" : @\"aaaaaaaaaaaaaa\",\n"
7988 " @\"aaaaaaaaaaaaaaaaa\",\n"
7989 " @\"aaaaaaaaaaaaaaaaa\",\n"
Daniel Jasper50780ce2016-01-13 16:41:34 +00007990 " @\"aaaaaaaaaaaaaaaaa\",\n"
7991 "];");
7992 verifyFormat(
7993 "NSArray *some_variable = @[\n"
7994 " aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" : @\"aaaaaaaaaaaaaa\",\n"
7995 " @\"aaaaaaaaaaaaaaaa\", @\"aaaaaaaaaaaaaaaa\", @\"aaaaaaaaaaaaaaaa\"\n"
Daniel Jasperb8f61682013-10-22 15:45:58 +00007996 "];");
Daniel Jasperb596fb22013-10-24 10:31:50 +00007997 verifyFormat("NSArray *some_variable = @[\n"
7998 " @\"aaaaaaaaaaaaaaaaa\",\n"
7999 " @\"aaaaaaaaaaaaaaaaa\",\n"
8000 " @\"aaaaaaaaaaaaaaaaa\",\n"
8001 " @\"aaaaaaaaaaaaaaaaa\",\n"
8002 "];");
Daniel Jasper308062b2015-02-27 08:41:05 +00008003 verifyFormat("NSArray *array = @[\n"
8004 " @\"a\",\n"
8005 " @\"a\",\n" // Trailing comma -> one per line.
8006 "];");
Daniel Jasperb596fb22013-10-24 10:31:50 +00008007
8008 // We should try to be robust in case someone forgets the "@".
8009 verifyFormat("NSArray *some_variable = [\n"
8010 " @\"aaaaaaaaaaaaaaaaa\",\n"
8011 " @\"aaaaaaaaaaaaaaaaa\",\n"
8012 " @\"aaaaaaaaaaaaaaaaa\",\n"
8013 " @\"aaaaaaaaaaaaaaaaa\",\n"
8014 "];");
Daniel Jasper4bf0d802013-11-23 14:27:27 +00008015 verifyFormat(
8016 "- (NSAttributedString *)attributedStringForSegment:(NSUInteger)segment\n"
8017 " index:(NSUInteger)index\n"
8018 " nonDigitAttributes:\n"
8019 " (NSDictionary *)noDigitAttributes;");
Daniel Jasperf841d3a2015-05-28 07:21:50 +00008020 verifyFormat("[someFunction someLooooooooooooongParameter:@[\n"
8021 " NSBundle.mainBundle.infoDictionary[@\"a\"]\n"
8022 "]];");
Nico Weber0588b502013-02-07 00:19:29 +00008023}
8024
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008025TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00008026 EXPECT_EQ("\"some text \"\n"
8027 "\"other\";",
8028 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00008029 EXPECT_EQ("\"some text \"\n"
8030 "\"other\";",
8031 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008032 EXPECT_EQ(
8033 "#define A \\\n"
8034 " \"some \" \\\n"
8035 " \"text \" \\\n"
8036 " \"other\";",
8037 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
8038 EXPECT_EQ(
8039 "#define A \\\n"
8040 " \"so \" \\\n"
8041 " \"text \" \\\n"
8042 " \"other\";",
8043 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
8044
8045 EXPECT_EQ("\"some text\"",
8046 format("\"some text\"", getLLVMStyleWithColumns(1)));
8047 EXPECT_EQ("\"some text\"",
8048 format("\"some text\"", getLLVMStyleWithColumns(11)));
8049 EXPECT_EQ("\"some \"\n"
8050 "\"text\"",
8051 format("\"some text\"", getLLVMStyleWithColumns(10)));
8052 EXPECT_EQ("\"some \"\n"
8053 "\"text\"",
8054 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00008055 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008056 "\" tex\"\n"
8057 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008058 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00008059 EXPECT_EQ("\"some\"\n"
8060 "\" tex\"\n"
8061 "\" and\"",
8062 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
8063 EXPECT_EQ("\"some\"\n"
8064 "\"/tex\"\n"
8065 "\"/and\"",
8066 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008067
8068 EXPECT_EQ("variable =\n"
8069 " \"long string \"\n"
8070 " \"literal\";",
8071 format("variable = \"long string literal\";",
8072 getLLVMStyleWithColumns(20)));
8073
8074 EXPECT_EQ("variable = f(\n"
8075 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00008076 " \"literal\",\n"
8077 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00008078 " loooooooooooooooooooong);",
8079 format("variable = f(\"long string literal\", short, "
8080 "loooooooooooooooooooong);",
8081 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008082
Daniel Jaspera44991332015-04-29 13:06:49 +00008083 EXPECT_EQ(
8084 "f(g(\"long string \"\n"
8085 " \"literal\"),\n"
8086 " b);",
8087 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008088 EXPECT_EQ("f(g(\"long string \"\n"
8089 " \"literal\",\n"
8090 " a),\n"
8091 " b);",
8092 format("f(g(\"long string literal\", a), b);",
8093 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008094 EXPECT_EQ(
8095 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00008096 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008097 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8098 EXPECT_EQ("f(\"one two three four five six \"\n"
8099 " \"seven\".split(\n"
8100 " really_looooong_variable));",
8101 format("f(\"one two three four five six seven\"."
8102 "split(really_looooong_variable));",
8103 getLLVMStyleWithColumns(33)));
8104
8105 EXPECT_EQ("f(\"some \"\n"
8106 " \"text\",\n"
8107 " other);",
8108 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008109
8110 // Only break as a last resort.
8111 verifyFormat(
8112 "aaaaaaaaaaaaaaaaaaaa(\n"
8113 " aaaaaaaaaaaaaaaaaaaa,\n"
8114 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008115
Daniel Jaspera44991332015-04-29 13:06:49 +00008116 EXPECT_EQ("\"splitmea\"\n"
8117 "\"trandomp\"\n"
8118 "\"oint\"",
8119 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008120
Daniel Jaspera44991332015-04-29 13:06:49 +00008121 EXPECT_EQ("\"split/\"\n"
8122 "\"pathat/\"\n"
8123 "\"slashes\"",
8124 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008125
Daniel Jaspera44991332015-04-29 13:06:49 +00008126 EXPECT_EQ("\"split/\"\n"
8127 "\"pathat/\"\n"
8128 "\"slashes\"",
8129 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008130 EXPECT_EQ("\"split at \"\n"
8131 "\"spaces/at/\"\n"
8132 "\"slashes.at.any$\"\n"
8133 "\"non-alphanumeric%\"\n"
8134 "\"1111111111characte\"\n"
8135 "\"rs\"",
8136 format("\"split at "
8137 "spaces/at/"
8138 "slashes.at."
8139 "any$non-"
8140 "alphanumeric%"
8141 "1111111111characte"
8142 "rs\"",
8143 getLLVMStyleWithColumns(20)));
8144
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008145 // Verify that splitting the strings understands
8146 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008147 EXPECT_EQ(
8148 "aaaaaaaaaaaa(\n"
8149 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8150 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8151 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8152 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8153 "aaaaaaaaaaaaaaaaaaaaaa\");",
8154 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008155 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8156 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8157 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8158 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8159 "aaaaaaaaaaaaaaaaaaaaaa\";",
8160 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008161 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8162 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8163 format("llvm::outs() << "
8164 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8165 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008166 EXPECT_EQ("ffff(\n"
8167 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8168 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8169 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8170 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8171 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008172
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008173 FormatStyle Style = getLLVMStyleWithColumns(12);
8174 Style.BreakStringLiterals = false;
8175 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8176
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008177 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8178 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00008179 EXPECT_EQ("#define A \\\n"
8180 " \"some \" \\\n"
8181 " \"text \" \\\n"
8182 " \"other\";",
8183 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008184}
8185
Manuel Klimek9e321992015-07-28 15:50:24 +00008186TEST_F(FormatTest, FullyRemoveEmptyLines) {
8187 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8188 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8189 EXPECT_EQ("int i = a(b());",
8190 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8191}
8192
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008193TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8194 EXPECT_EQ(
8195 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8196 "(\n"
8197 " \"x\t\");",
8198 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8199 "aaaaaaa("
8200 "\"x\t\");"));
8201}
8202
Daniel Jasper174b0122014-01-09 14:18:12 +00008203TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008204 EXPECT_EQ(
8205 "u8\"utf8 string \"\n"
8206 "u8\"literal\";",
8207 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8208 EXPECT_EQ(
8209 "u\"utf16 string \"\n"
8210 "u\"literal\";",
8211 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8212 EXPECT_EQ(
8213 "U\"utf32 string \"\n"
8214 "U\"literal\";",
8215 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8216 EXPECT_EQ("L\"wide string \"\n"
8217 "L\"literal\";",
8218 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008219 EXPECT_EQ("@\"NSString \"\n"
8220 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008221 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008222
8223 // This input makes clang-format try to split the incomplete unicode escape
8224 // sequence, which used to lead to a crasher.
8225 verifyNoCrash(
8226 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8227 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008228}
8229
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008230TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8231 FormatStyle Style = getGoogleStyleWithColumns(15);
8232 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8233 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8234 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8235 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8236 EXPECT_EQ("u8R\"x(raw literal)x\";",
8237 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008238}
8239
8240TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8241 FormatStyle Style = getLLVMStyleWithColumns(20);
8242 EXPECT_EQ(
8243 "_T(\"aaaaaaaaaaaaaa\")\n"
8244 "_T(\"aaaaaaaaaaaaaa\")\n"
8245 "_T(\"aaaaaaaaaaaa\")",
8246 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8247 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
8248 " _T(\"aaaaaa\"),\n"
8249 " z);",
8250 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8251
8252 // FIXME: Handle embedded spaces in one iteration.
8253 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8254 // "_T(\"aaaaaaaaaaaaa\")\n"
8255 // "_T(\"aaaaaaaaaaaaa\")\n"
8256 // "_T(\"a\")",
8257 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8258 // getLLVMStyleWithColumns(20)));
8259 EXPECT_EQ(
8260 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8261 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008262 EXPECT_EQ("f(\n"
8263 "#if !TEST\n"
8264 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8265 "#endif\n"
8266 " );",
8267 format("f(\n"
8268 "#if !TEST\n"
8269 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8270 "#endif\n"
8271 ");"));
8272 EXPECT_EQ("f(\n"
8273 "\n"
8274 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8275 format("f(\n"
8276 "\n"
8277 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008278}
8279
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008280TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008281 EXPECT_EQ(
8282 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8283 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8284 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8285 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8286 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8287 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8288}
8289
8290TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8291 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008292 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008293 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8294 "multiline raw string literal xxxxxxxxxxxxxx\n"
8295 ")x\",\n"
8296 " a),\n"
8297 " b);",
8298 format("fffffffffff(g(R\"x(\n"
8299 "multiline raw string literal xxxxxxxxxxxxxx\n"
8300 ")x\", a), b);",
8301 getGoogleStyleWithColumns(20)));
8302 EXPECT_EQ("fffffffffff(\n"
8303 " g(R\"x(qqq\n"
8304 "multiline raw string literal xxxxxxxxxxxxxx\n"
8305 ")x\",\n"
8306 " a),\n"
8307 " b);",
8308 format("fffffffffff(g(R\"x(qqq\n"
8309 "multiline raw string literal xxxxxxxxxxxxxx\n"
8310 ")x\", a), b);",
8311 getGoogleStyleWithColumns(20)));
8312
8313 EXPECT_EQ("fffffffffff(R\"x(\n"
8314 "multiline raw string literal xxxxxxxxxxxxxx\n"
8315 ")x\");",
8316 format("fffffffffff(R\"x(\n"
8317 "multiline raw string literal xxxxxxxxxxxxxx\n"
8318 ")x\");",
8319 getGoogleStyleWithColumns(20)));
8320 EXPECT_EQ("fffffffffff(R\"x(\n"
8321 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008322 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008323 format("fffffffffff(R\"x(\n"
8324 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008325 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008326 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008327 EXPECT_EQ("fffffffffff(\n"
8328 " R\"x(\n"
8329 "multiline raw string literal xxxxxxxxxxxxxx\n"
8330 ")x\" +\n"
8331 " bbbbbb);",
8332 format("fffffffffff(\n"
8333 " R\"x(\n"
8334 "multiline raw string literal xxxxxxxxxxxxxx\n"
8335 ")x\" + bbbbbb);",
8336 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008337}
8338
Alexander Kornienkobe633902013-06-14 11:46:10 +00008339TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008340 verifyFormat("string a = \"unterminated;");
8341 EXPECT_EQ("function(\"unterminated,\n"
8342 " OtherParameter);",
8343 format("function( \"unterminated,\n"
8344 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008345}
8346
8347TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008348 FormatStyle Style = getLLVMStyle();
8349 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008350 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008351 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008352}
8353
Daniel Jaspera44991332015-04-29 13:06:49 +00008354TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008355
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008356TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8357 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8358 " \"ddeeefff\");",
8359 format("someFunction(\"aaabbbcccdddeeefff\");",
8360 getLLVMStyleWithColumns(25)));
8361 EXPECT_EQ("someFunction1234567890(\n"
8362 " \"aaabbbcccdddeeefff\");",
8363 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8364 getLLVMStyleWithColumns(26)));
8365 EXPECT_EQ("someFunction1234567890(\n"
8366 " \"aaabbbcccdddeeeff\"\n"
8367 " \"f\");",
8368 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8369 getLLVMStyleWithColumns(25)));
8370 EXPECT_EQ("someFunction1234567890(\n"
8371 " \"aaabbbcccdddeeeff\"\n"
8372 " \"f\");",
8373 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8374 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008375 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8376 " \"ddde \"\n"
8377 " \"efff\");",
8378 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008379 getLLVMStyleWithColumns(25)));
8380 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8381 " \"ddeeefff\");",
8382 format("someFunction(\"aaabbbccc ddeeefff\");",
8383 getLLVMStyleWithColumns(25)));
8384 EXPECT_EQ("someFunction1234567890(\n"
8385 " \"aaabb \"\n"
8386 " \"cccdddeeefff\");",
8387 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8388 getLLVMStyleWithColumns(25)));
8389 EXPECT_EQ("#define A \\\n"
8390 " string s = \\\n"
8391 " \"123456789\" \\\n"
8392 " \"0\"; \\\n"
8393 " int i;",
8394 format("#define A string s = \"1234567890\"; int i;",
8395 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008396 // FIXME: Put additional penalties on breaking at non-whitespace locations.
8397 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8398 " \"dddeeeff\"\n"
8399 " \"f\");",
8400 format("someFunction(\"aaabbbcc dddeeefff\");",
8401 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008402}
8403
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008404TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008405 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8406 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008407 EXPECT_EQ("\"test\"\n"
8408 "\"\\n\"",
8409 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8410 EXPECT_EQ("\"tes\\\\\"\n"
8411 "\"n\"",
8412 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8413 EXPECT_EQ("\"\\\\\\\\\"\n"
8414 "\"\\n\"",
8415 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008416 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008417 EXPECT_EQ("\"\\uff01\"\n"
8418 "\"test\"",
8419 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8420 EXPECT_EQ("\"\\Uff01ff02\"",
8421 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8422 EXPECT_EQ("\"\\x000000000001\"\n"
8423 "\"next\"",
8424 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8425 EXPECT_EQ("\"\\x000000000001next\"",
8426 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8427 EXPECT_EQ("\"\\x000000000001\"",
8428 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8429 EXPECT_EQ("\"test\"\n"
8430 "\"\\000000\"\n"
8431 "\"000001\"",
8432 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8433 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008434 "\"00000000\"\n"
8435 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008436 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008437}
8438
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008439TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8440 verifyFormat("void f() {\n"
8441 " return g() {}\n"
8442 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008443 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008444 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008445 "}");
8446}
8447
Manuel Klimek421147e2014-01-24 09:25:23 +00008448TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8449 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008450 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008451}
8452
Manuel Klimek13b97d82013-05-13 08:42:42 +00008453TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8454 verifyFormat("class X {\n"
8455 " void f() {\n"
8456 " }\n"
8457 "};",
8458 getLLVMStyleWithColumns(12));
8459}
8460
8461TEST_F(FormatTest, ConfigurableIndentWidth) {
8462 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8463 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008464 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008465 verifyFormat("void f() {\n"
8466 " someFunction();\n"
8467 " if (true) {\n"
8468 " f();\n"
8469 " }\n"
8470 "}",
8471 EightIndent);
8472 verifyFormat("class X {\n"
8473 " void f() {\n"
8474 " }\n"
8475 "};",
8476 EightIndent);
8477 verifyFormat("int x[] = {\n"
8478 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008479 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008480 EightIndent);
8481}
8482
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008483TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008484 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008485 "f();",
8486 getLLVMStyleWithColumns(8));
8487}
8488
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008489TEST_F(FormatTest, ConfigurableUseOfTab) {
8490 FormatStyle Tab = getLLVMStyleWithColumns(42);
8491 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008492 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008493 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008494
8495 EXPECT_EQ("if (aaaaaaaa && // q\n"
8496 " bb)\t\t// w\n"
8497 "\t;",
8498 format("if (aaaaaaaa &&// q\n"
8499 "bb)// w\n"
8500 ";",
8501 Tab));
8502 EXPECT_EQ("if (aaa && bbb) // w\n"
8503 "\t;",
8504 format("if(aaa&&bbb)// w\n"
8505 ";",
8506 Tab));
8507
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008508 verifyFormat("class X {\n"
8509 "\tvoid f() {\n"
8510 "\t\tsomeFunction(parameter1,\n"
8511 "\t\t\t parameter2);\n"
8512 "\t}\n"
8513 "};",
8514 Tab);
8515 verifyFormat("#define A \\\n"
8516 "\tvoid f() { \\\n"
8517 "\t\tsomeFunction( \\\n"
8518 "\t\t parameter1, \\\n"
8519 "\t\t parameter2); \\\n"
8520 "\t}",
8521 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008522
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008523 Tab.TabWidth = 4;
8524 Tab.IndentWidth = 8;
8525 verifyFormat("class TabWidth4Indent8 {\n"
8526 "\t\tvoid f() {\n"
8527 "\t\t\t\tsomeFunction(parameter1,\n"
8528 "\t\t\t\t\t\t\t parameter2);\n"
8529 "\t\t}\n"
8530 "};",
8531 Tab);
8532
8533 Tab.TabWidth = 4;
8534 Tab.IndentWidth = 4;
8535 verifyFormat("class TabWidth4Indent4 {\n"
8536 "\tvoid f() {\n"
8537 "\t\tsomeFunction(parameter1,\n"
8538 "\t\t\t\t\t parameter2);\n"
8539 "\t}\n"
8540 "};",
8541 Tab);
8542
8543 Tab.TabWidth = 8;
8544 Tab.IndentWidth = 4;
8545 verifyFormat("class TabWidth8Indent4 {\n"
8546 " void f() {\n"
8547 "\tsomeFunction(parameter1,\n"
8548 "\t\t parameter2);\n"
8549 " }\n"
8550 "};",
8551 Tab);
8552
Alexander Kornienko39856b72013-09-10 09:38:25 +00008553 Tab.TabWidth = 8;
8554 Tab.IndentWidth = 8;
8555 EXPECT_EQ("/*\n"
8556 "\t a\t\tcomment\n"
8557 "\t in multiple lines\n"
8558 " */",
8559 format(" /*\t \t \n"
8560 " \t \t a\t\tcomment\t \t\n"
8561 " \t \t in multiple lines\t\n"
8562 " \t */",
8563 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008564
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008565 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008566 verifyFormat("{\n"
8567 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8568 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8569 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8570 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8571 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8572 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008573 "};",
8574 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008575 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008576 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008577 "\ta2,\n"
8578 "\ta3\n"
8579 "};",
8580 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008581 EXPECT_EQ("if (aaaaaaaa && // q\n"
8582 " bb) // w\n"
8583 "\t;",
8584 format("if (aaaaaaaa &&// q\n"
8585 "bb)// w\n"
8586 ";",
8587 Tab));
8588 verifyFormat("class X {\n"
8589 "\tvoid f() {\n"
8590 "\t\tsomeFunction(parameter1,\n"
8591 "\t\t parameter2);\n"
8592 "\t}\n"
8593 "};",
8594 Tab);
8595 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008596 "\tQ(\n"
8597 "\t {\n"
8598 "\t\t int a;\n"
8599 "\t\t someFunction(aaaaaaaa,\n"
8600 "\t\t bbbbbbb);\n"
8601 "\t },\n"
8602 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008603 "}",
8604 Tab);
8605 EXPECT_EQ("{\n"
8606 "\t/* aaaa\n"
8607 "\t bbbb */\n"
8608 "}",
8609 format("{\n"
8610 "/* aaaa\n"
8611 " bbbb */\n"
8612 "}",
8613 Tab));
8614 EXPECT_EQ("{\n"
8615 "\t/*\n"
8616 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8617 "\t bbbbbbbbbbbbb\n"
8618 "\t*/\n"
8619 "}",
8620 format("{\n"
8621 "/*\n"
8622 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8623 "*/\n"
8624 "}",
8625 Tab));
8626 EXPECT_EQ("{\n"
8627 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8628 "\t// bbbbbbbbbbbbb\n"
8629 "}",
8630 format("{\n"
8631 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8632 "}",
8633 Tab));
8634 EXPECT_EQ("{\n"
8635 "\t/*\n"
8636 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8637 "\t bbbbbbbbbbbbb\n"
8638 "\t*/\n"
8639 "}",
8640 format("{\n"
8641 "\t/*\n"
8642 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8643 "\t*/\n"
8644 "}",
8645 Tab));
8646 EXPECT_EQ("{\n"
8647 "\t/*\n"
8648 "\n"
8649 "\t*/\n"
8650 "}",
8651 format("{\n"
8652 "\t/*\n"
8653 "\n"
8654 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008655 "}",
8656 Tab));
8657 EXPECT_EQ("{\n"
8658 "\t/*\n"
8659 " asdf\n"
8660 "\t*/\n"
8661 "}",
8662 format("{\n"
8663 "\t/*\n"
8664 " asdf\n"
8665 "\t*/\n"
8666 "}",
8667 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008668
8669 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008670 EXPECT_EQ("/*\n"
8671 " a\t\tcomment\n"
8672 " in multiple lines\n"
8673 " */",
8674 format(" /*\t \t \n"
8675 " \t \t a\t\tcomment\t \t\n"
8676 " \t \t in multiple lines\t\n"
8677 " \t */",
8678 Tab));
8679 EXPECT_EQ("/* some\n"
8680 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008681 format(" \t \t /* some\n"
8682 " \t \t comment */",
8683 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008684 EXPECT_EQ("int a; /* some\n"
8685 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008686 format(" \t \t int a; /* some\n"
8687 " \t \t comment */",
8688 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008689
Alexander Kornienko39856b72013-09-10 09:38:25 +00008690 EXPECT_EQ("int a; /* some\n"
8691 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008692 format(" \t \t int\ta; /* some\n"
8693 " \t \t comment */",
8694 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008695 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8696 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008697 format(" \t \t f(\"\t\t\"); /* some\n"
8698 " \t \t comment */",
8699 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008700 EXPECT_EQ("{\n"
8701 " /*\n"
8702 " * Comment\n"
8703 " */\n"
8704 " int i;\n"
8705 "}",
8706 format("{\n"
8707 "\t/*\n"
8708 "\t * Comment\n"
8709 "\t */\n"
8710 "\t int i;\n"
8711 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008712
8713 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8714 Tab.TabWidth = 8;
8715 Tab.IndentWidth = 8;
8716 EXPECT_EQ("if (aaaaaaaa && // q\n"
8717 " bb) // w\n"
8718 "\t;",
8719 format("if (aaaaaaaa &&// q\n"
8720 "bb)// w\n"
8721 ";",
8722 Tab));
8723 EXPECT_EQ("if (aaa && bbb) // w\n"
8724 "\t;",
8725 format("if(aaa&&bbb)// w\n"
8726 ";",
8727 Tab));
8728 verifyFormat("class X {\n"
8729 "\tvoid f() {\n"
8730 "\t\tsomeFunction(parameter1,\n"
8731 "\t\t\t parameter2);\n"
8732 "\t}\n"
8733 "};",
8734 Tab);
8735 verifyFormat("#define A \\\n"
8736 "\tvoid f() { \\\n"
8737 "\t\tsomeFunction( \\\n"
8738 "\t\t parameter1, \\\n"
8739 "\t\t parameter2); \\\n"
8740 "\t}",
8741 Tab);
8742 Tab.TabWidth = 4;
8743 Tab.IndentWidth = 8;
8744 verifyFormat("class TabWidth4Indent8 {\n"
8745 "\t\tvoid f() {\n"
8746 "\t\t\t\tsomeFunction(parameter1,\n"
8747 "\t\t\t\t\t\t\t parameter2);\n"
8748 "\t\t}\n"
8749 "};",
8750 Tab);
8751 Tab.TabWidth = 4;
8752 Tab.IndentWidth = 4;
8753 verifyFormat("class TabWidth4Indent4 {\n"
8754 "\tvoid f() {\n"
8755 "\t\tsomeFunction(parameter1,\n"
8756 "\t\t\t\t\t parameter2);\n"
8757 "\t}\n"
8758 "};",
8759 Tab);
8760 Tab.TabWidth = 8;
8761 Tab.IndentWidth = 4;
8762 verifyFormat("class TabWidth8Indent4 {\n"
8763 " void f() {\n"
8764 "\tsomeFunction(parameter1,\n"
8765 "\t\t parameter2);\n"
8766 " }\n"
8767 "};",
8768 Tab);
8769 Tab.TabWidth = 8;
8770 Tab.IndentWidth = 8;
8771 EXPECT_EQ("/*\n"
8772 "\t a\t\tcomment\n"
8773 "\t in multiple lines\n"
8774 " */",
8775 format(" /*\t \t \n"
8776 " \t \t a\t\tcomment\t \t\n"
8777 " \t \t in multiple lines\t\n"
8778 " \t */",
8779 Tab));
8780 verifyFormat("{\n"
8781 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8782 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8783 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8784 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8785 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8786 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8787 "};",
8788 Tab);
8789 verifyFormat("enum AA {\n"
8790 "\ta1, // Force multiple lines\n"
8791 "\ta2,\n"
8792 "\ta3\n"
8793 "};",
8794 Tab);
8795 EXPECT_EQ("if (aaaaaaaa && // q\n"
8796 " bb) // w\n"
8797 "\t;",
8798 format("if (aaaaaaaa &&// q\n"
8799 "bb)// w\n"
8800 ";",
8801 Tab));
8802 verifyFormat("class X {\n"
8803 "\tvoid f() {\n"
8804 "\t\tsomeFunction(parameter1,\n"
8805 "\t\t\t parameter2);\n"
8806 "\t}\n"
8807 "};",
8808 Tab);
8809 verifyFormat("{\n"
8810 "\tQ(\n"
8811 "\t {\n"
8812 "\t\t int a;\n"
8813 "\t\t someFunction(aaaaaaaa,\n"
8814 "\t\t\t\t bbbbbbb);\n"
8815 "\t },\n"
8816 "\t p);\n"
8817 "}",
8818 Tab);
8819 EXPECT_EQ("{\n"
8820 "\t/* aaaa\n"
8821 "\t bbbb */\n"
8822 "}",
8823 format("{\n"
8824 "/* aaaa\n"
8825 " bbbb */\n"
8826 "}",
8827 Tab));
8828 EXPECT_EQ("{\n"
8829 "\t/*\n"
8830 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8831 "\t bbbbbbbbbbbbb\n"
8832 "\t*/\n"
8833 "}",
8834 format("{\n"
8835 "/*\n"
8836 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8837 "*/\n"
8838 "}",
8839 Tab));
8840 EXPECT_EQ("{\n"
8841 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8842 "\t// bbbbbbbbbbbbb\n"
8843 "}",
8844 format("{\n"
8845 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8846 "}",
8847 Tab));
8848 EXPECT_EQ("{\n"
8849 "\t/*\n"
8850 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8851 "\t bbbbbbbbbbbbb\n"
8852 "\t*/\n"
8853 "}",
8854 format("{\n"
8855 "\t/*\n"
8856 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8857 "\t*/\n"
8858 "}",
8859 Tab));
8860 EXPECT_EQ("{\n"
8861 "\t/*\n"
8862 "\n"
8863 "\t*/\n"
8864 "}",
8865 format("{\n"
8866 "\t/*\n"
8867 "\n"
8868 "\t*/\n"
8869 "}",
8870 Tab));
8871 EXPECT_EQ("{\n"
8872 "\t/*\n"
8873 " asdf\n"
8874 "\t*/\n"
8875 "}",
8876 format("{\n"
8877 "\t/*\n"
8878 " asdf\n"
8879 "\t*/\n"
8880 "}",
8881 Tab));
8882 EXPECT_EQ("/*\n"
8883 "\t a\t\tcomment\n"
8884 "\t in multiple lines\n"
8885 " */",
8886 format(" /*\t \t \n"
8887 " \t \t a\t\tcomment\t \t\n"
8888 " \t \t in multiple lines\t\n"
8889 " \t */",
8890 Tab));
8891 EXPECT_EQ("/* some\n"
8892 " comment */",
8893 format(" \t \t /* some\n"
8894 " \t \t comment */",
8895 Tab));
8896 EXPECT_EQ("int a; /* some\n"
8897 " comment */",
8898 format(" \t \t int a; /* some\n"
8899 " \t \t comment */",
8900 Tab));
8901 EXPECT_EQ("int a; /* some\n"
8902 "comment */",
8903 format(" \t \t int\ta; /* some\n"
8904 " \t \t comment */",
8905 Tab));
8906 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8907 " comment */",
8908 format(" \t \t f(\"\t\t\"); /* some\n"
8909 " \t \t comment */",
8910 Tab));
8911 EXPECT_EQ("{\n"
8912 " /*\n"
8913 " * Comment\n"
8914 " */\n"
8915 " int i;\n"
8916 "}",
8917 format("{\n"
8918 "\t/*\n"
8919 "\t * Comment\n"
8920 "\t */\n"
8921 "\t int i;\n"
8922 "}"));
8923 Tab.AlignConsecutiveAssignments = true;
8924 Tab.AlignConsecutiveDeclarations = true;
8925 Tab.TabWidth = 4;
8926 Tab.IndentWidth = 4;
8927 verifyFormat("class Assign {\n"
8928 "\tvoid f() {\n"
8929 "\t\tint x = 123;\n"
8930 "\t\tint random = 4;\n"
8931 "\t\tstd::string alphabet =\n"
8932 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8933 "\t}\n"
8934 "};",
8935 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008936}
8937
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008938TEST_F(FormatTest, CalculatesOriginalColumn) {
8939 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8940 "q\"; /* some\n"
8941 " comment */",
8942 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8943 "q\"; /* some\n"
8944 " comment */",
8945 getLLVMStyle()));
8946 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8947 "/* some\n"
8948 " comment */",
8949 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8950 " /* some\n"
8951 " comment */",
8952 getLLVMStyle()));
8953 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8954 "qqq\n"
8955 "/* some\n"
8956 " comment */",
8957 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8958 "qqq\n"
8959 " /* some\n"
8960 " comment */",
8961 getLLVMStyle()));
8962 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8963 "wwww; /* some\n"
8964 " comment */",
8965 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8966 "wwww; /* some\n"
8967 " comment */",
8968 getLLVMStyle()));
8969}
8970
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008971TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008972 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008973 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008974
8975 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008976 " continue;",
8977 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008978 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008979 " continue;",
8980 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008981 verifyFormat("if(true)\n"
8982 " f();\n"
8983 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008984 " f();",
8985 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008986 verifyFormat("do {\n"
8987 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008988 "} while(something());",
8989 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008990 verifyFormat("switch(x) {\n"
8991 "default:\n"
8992 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008993 "}",
8994 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008995 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008996 verifyFormat("size_t x = sizeof(x);", NoSpace);
8997 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8998 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8999 verifyFormat("alignas(128) char a[128];", NoSpace);
9000 verifyFormat("size_t x = alignof(MyType);", NoSpace);
9001 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
9002 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009003 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009004 verifyFormat("T A::operator()();", NoSpace);
9005 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009006
9007 FormatStyle Space = getLLVMStyle();
9008 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
9009
9010 verifyFormat("int f ();", Space);
9011 verifyFormat("void f (int a, T b) {\n"
9012 " while (true)\n"
9013 " continue;\n"
9014 "}",
9015 Space);
9016 verifyFormat("if (true)\n"
9017 " f ();\n"
9018 "else if (true)\n"
9019 " f ();",
9020 Space);
9021 verifyFormat("do {\n"
9022 " do_something ();\n"
9023 "} while (something ());",
9024 Space);
9025 verifyFormat("switch (x) {\n"
9026 "default:\n"
9027 " break;\n"
9028 "}",
9029 Space);
9030 verifyFormat("A::A () : a (1) {}", Space);
9031 verifyFormat("void f () __attribute__ ((asdf));", Space);
9032 verifyFormat("*(&a + 1);\n"
9033 "&((&a)[1]);\n"
9034 "a[(b + c) * d];\n"
9035 "(((a + 1) * 2) + 3) * 4;",
9036 Space);
9037 verifyFormat("#define A(x) x", Space);
9038 verifyFormat("#define A (x) x", Space);
9039 verifyFormat("#if defined(x)\n"
9040 "#endif",
9041 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00009042 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00009043 verifyFormat("size_t x = sizeof (x);", Space);
9044 verifyFormat("auto f (int x) -> decltype (x);", Space);
9045 verifyFormat("int f (T x) noexcept (x.create ());", Space);
9046 verifyFormat("alignas (128) char a[128];", Space);
9047 verifyFormat("size_t x = alignof (MyType);", Space);
9048 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
9049 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009050 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009051 verifyFormat("T A::operator() ();", Space);
9052 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009053}
9054
9055TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
9056 FormatStyle Spaces = getLLVMStyle();
9057
9058 Spaces.SpacesInParentheses = true;
9059 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009060 verifyFormat("call();", Spaces);
9061 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009062 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
9063 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009064 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009065 " continue;",
9066 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009067 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009068 " continue;",
9069 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009070 verifyFormat("if ( true )\n"
9071 " f();\n"
9072 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009073 " f();",
9074 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009075 verifyFormat("do {\n"
9076 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009077 "} while ( something() );",
9078 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009079 verifyFormat("switch ( x ) {\n"
9080 "default:\n"
9081 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009082 "}",
9083 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009084
9085 Spaces.SpacesInParentheses = false;
9086 Spaces.SpacesInCStyleCastParentheses = true;
9087 verifyFormat("Type *A = ( Type * )P;", Spaces);
9088 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9089 verifyFormat("x = ( int32 )y;", Spaces);
9090 verifyFormat("int a = ( int )(2.0f);", Spaces);
9091 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9092 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9093 verifyFormat("#define x (( int )-1)", Spaces);
9094
Daniel Jasper92e09822015-03-18 12:59:19 +00009095 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00009096 Spaces.SpacesInParentheses = false;
9097 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009098 Spaces.SpacesInCStyleCastParentheses = true;
9099 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009100 verifyFormat("call( );", Spaces);
9101 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009102 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009103 " continue;",
9104 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009105 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009106 " continue;",
9107 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009108 verifyFormat("if (true)\n"
9109 " f( );\n"
9110 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009111 " f( );",
9112 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009113 verifyFormat("do {\n"
9114 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009115 "} while (something( ));",
9116 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009117 verifyFormat("switch (x) {\n"
9118 "default:\n"
9119 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009120 "}",
9121 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009122
Daniel Jasper92e09822015-03-18 12:59:19 +00009123 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009124 Spaces.SpaceAfterCStyleCast = true;
9125 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009126 verifyFormat("call( );", Spaces);
9127 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009128 verifyFormat("while (( bool ) 1)\n"
9129 " continue;",
9130 Spaces);
9131 verifyFormat("for (;;)\n"
9132 " continue;",
9133 Spaces);
9134 verifyFormat("if (true)\n"
9135 " f( );\n"
9136 "else if (true)\n"
9137 " f( );",
9138 Spaces);
9139 verifyFormat("do {\n"
9140 " do_something(( int ) i);\n"
9141 "} while (something( ));",
9142 Spaces);
9143 verifyFormat("switch (x) {\n"
9144 "default:\n"
9145 " break;\n"
9146 "}",
9147 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009148
9149 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009150 Spaces.SpacesInCStyleCastParentheses = false;
9151 Spaces.SpaceAfterCStyleCast = true;
9152 verifyFormat("while ((bool) 1)\n"
9153 " continue;",
9154 Spaces);
9155 verifyFormat("do {\n"
9156 " do_something((int) i);\n"
9157 "} while (something( ));",
9158 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009159}
9160
Daniel Jasperad981f82014-08-26 11:41:14 +00009161TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9162 verifyFormat("int a[5];");
9163 verifyFormat("a[3] += 42;");
9164
9165 FormatStyle Spaces = getLLVMStyle();
9166 Spaces.SpacesInSquareBrackets = true;
9167 // Lambdas unchanged.
9168 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9169 verifyFormat("return [i, args...] {};", Spaces);
9170
9171 // Not lambdas.
9172 verifyFormat("int a[ 5 ];", Spaces);
9173 verifyFormat("a[ 3 ] += 42;", Spaces);
9174 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9175 verifyFormat("double &operator[](int i) { return 0; }\n"
9176 "int i;",
9177 Spaces);
9178 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9179 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9180 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9181}
9182
Daniel Jasperd94bff32013-09-25 15:15:02 +00009183TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9184 verifyFormat("int a = 5;");
9185 verifyFormat("a += 42;");
9186 verifyFormat("a or_eq 8;");
9187
9188 FormatStyle Spaces = getLLVMStyle();
9189 Spaces.SpaceBeforeAssignmentOperators = false;
9190 verifyFormat("int a= 5;", Spaces);
9191 verifyFormat("a+= 42;", Spaces);
9192 verifyFormat("a or_eq 8;", Spaces);
9193}
9194
Daniel Jaspera44991332015-04-29 13:06:49 +00009195TEST_F(FormatTest, AlignConsecutiveAssignments) {
9196 FormatStyle Alignment = getLLVMStyle();
9197 Alignment.AlignConsecutiveAssignments = false;
9198 verifyFormat("int a = 5;\n"
9199 "int oneTwoThree = 123;",
9200 Alignment);
9201 verifyFormat("int a = 5;\n"
9202 "int oneTwoThree = 123;",
9203 Alignment);
9204
9205 Alignment.AlignConsecutiveAssignments = true;
9206 verifyFormat("int a = 5;\n"
9207 "int oneTwoThree = 123;",
9208 Alignment);
9209 verifyFormat("int a = method();\n"
9210 "int oneTwoThree = 133;",
9211 Alignment);
9212 verifyFormat("a &= 5;\n"
9213 "bcd *= 5;\n"
9214 "ghtyf += 5;\n"
9215 "dvfvdb -= 5;\n"
9216 "a /= 5;\n"
9217 "vdsvsv %= 5;\n"
9218 "sfdbddfbdfbb ^= 5;\n"
9219 "dvsdsv |= 5;\n"
9220 "int dsvvdvsdvvv = 123;",
9221 Alignment);
9222 verifyFormat("int i = 1, j = 10;\n"
9223 "something = 2000;",
9224 Alignment);
9225 verifyFormat("something = 2000;\n"
9226 "int i = 1, j = 10;\n",
9227 Alignment);
9228 verifyFormat("something = 2000;\n"
9229 "another = 911;\n"
9230 "int i = 1, j = 10;\n"
9231 "oneMore = 1;\n"
9232 "i = 2;",
9233 Alignment);
9234 verifyFormat("int a = 5;\n"
9235 "int one = 1;\n"
9236 "method();\n"
9237 "int oneTwoThree = 123;\n"
9238 "int oneTwo = 12;",
9239 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009240 verifyFormat("int oneTwoThree = 123;\n"
9241 "int oneTwo = 12;\n"
9242 "method();\n",
9243 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009244 verifyFormat("int oneTwoThree = 123; // comment\n"
9245 "int oneTwo = 12; // comment",
9246 Alignment);
9247 EXPECT_EQ("int a = 5;\n"
9248 "\n"
9249 "int oneTwoThree = 123;",
9250 format("int a = 5;\n"
9251 "\n"
9252 "int oneTwoThree= 123;",
9253 Alignment));
9254 EXPECT_EQ("int a = 5;\n"
9255 "int one = 1;\n"
9256 "\n"
9257 "int oneTwoThree = 123;",
9258 format("int a = 5;\n"
9259 "int one = 1;\n"
9260 "\n"
9261 "int oneTwoThree = 123;",
9262 Alignment));
9263 EXPECT_EQ("int a = 5;\n"
9264 "int one = 1;\n"
9265 "\n"
9266 "int oneTwoThree = 123;\n"
9267 "int oneTwo = 12;",
9268 format("int a = 5;\n"
9269 "int one = 1;\n"
9270 "\n"
9271 "int oneTwoThree = 123;\n"
9272 "int oneTwo = 12;",
9273 Alignment));
9274 Alignment.AlignEscapedNewlinesLeft = true;
9275 verifyFormat("#define A \\\n"
9276 " int aaaa = 12; \\\n"
9277 " int b = 23; \\\n"
9278 " int ccc = 234; \\\n"
9279 " int dddddddddd = 2345;",
9280 Alignment);
9281 Alignment.AlignEscapedNewlinesLeft = false;
9282 verifyFormat("#define A "
9283 " \\\n"
9284 " int aaaa = 12; "
9285 " \\\n"
9286 " int b = 23; "
9287 " \\\n"
9288 " int ccc = 234; "
9289 " \\\n"
9290 " int dddddddddd = 2345;",
9291 Alignment);
9292 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9293 "k = 4, int l = 5,\n"
9294 " int m = 6) {\n"
9295 " int j = 10;\n"
9296 " otherThing = 1;\n"
9297 "}",
9298 Alignment);
9299 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9300 " int i = 1;\n"
9301 " int j = 2;\n"
9302 " int big = 10000;\n"
9303 "}",
9304 Alignment);
9305 verifyFormat("class C {\n"
9306 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009307 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009308 " virtual void f() = 0;\n"
9309 "};",
9310 Alignment);
9311 verifyFormat("int i = 1;\n"
9312 "if (SomeType t = getSomething()) {\n"
9313 "}\n"
9314 "int j = 2;\n"
9315 "int big = 10000;",
9316 Alignment);
9317 verifyFormat("int j = 7;\n"
9318 "for (int k = 0; k < N; ++k) {\n"
9319 "}\n"
9320 "int j = 2;\n"
9321 "int big = 10000;\n"
9322 "}",
9323 Alignment);
9324 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9325 verifyFormat("int i = 1;\n"
9326 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9327 " = someLooooooooooooooooongFunction();\n"
9328 "int j = 2;",
9329 Alignment);
9330 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9331 verifyFormat("int i = 1;\n"
9332 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9333 " someLooooooooooooooooongFunction();\n"
9334 "int j = 2;",
9335 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009336
9337 verifyFormat("auto lambda = []() {\n"
9338 " auto i = 0;\n"
9339 " return 0;\n"
9340 "};\n"
9341 "int i = 0;\n"
9342 "auto v = type{\n"
9343 " i = 1, //\n"
9344 " (i = 2), //\n"
9345 " i = 3 //\n"
9346 "};",
9347 Alignment);
9348
Daniel Jaspera44991332015-04-29 13:06:49 +00009349 // FIXME: Should align all three assignments
9350 verifyFormat(
9351 "int i = 1;\n"
9352 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9353 " loooooooooooooooooooooongParameterB);\n"
9354 "int j = 2;",
9355 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009356
9357 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9358 " typename B = very_long_type_name_1,\n"
9359 " typename T_2 = very_long_type_name_2>\n"
9360 "auto foo() {}\n",
9361 Alignment);
9362 verifyFormat("int a, b = 1;\n"
9363 "int c = 2;\n"
9364 "int dd = 3;\n",
9365 Alignment);
9366 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9367 "float b[1][] = {{3.f}};\n",
9368 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009369}
9370
Daniel Jaspere12597c2015-10-01 10:06:54 +00009371TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9372 FormatStyle Alignment = getLLVMStyle();
9373 Alignment.AlignConsecutiveDeclarations = false;
9374 verifyFormat("float const a = 5;\n"
9375 "int oneTwoThree = 123;",
9376 Alignment);
9377 verifyFormat("int a = 5;\n"
9378 "float const oneTwoThree = 123;",
9379 Alignment);
9380
9381 Alignment.AlignConsecutiveDeclarations = true;
9382 verifyFormat("float const a = 5;\n"
9383 "int oneTwoThree = 123;",
9384 Alignment);
9385 verifyFormat("int a = method();\n"
9386 "float const oneTwoThree = 133;",
9387 Alignment);
9388 verifyFormat("int i = 1, j = 10;\n"
9389 "something = 2000;",
9390 Alignment);
9391 verifyFormat("something = 2000;\n"
9392 "int i = 1, j = 10;\n",
9393 Alignment);
9394 verifyFormat("float something = 2000;\n"
9395 "double another = 911;\n"
9396 "int i = 1, j = 10;\n"
9397 "const int *oneMore = 1;\n"
9398 "unsigned i = 2;",
9399 Alignment);
9400 verifyFormat("float a = 5;\n"
9401 "int one = 1;\n"
9402 "method();\n"
9403 "const double oneTwoThree = 123;\n"
9404 "const unsigned int oneTwo = 12;",
9405 Alignment);
9406 verifyFormat("int oneTwoThree{0}; // comment\n"
9407 "unsigned oneTwo; // comment",
9408 Alignment);
9409 EXPECT_EQ("float const a = 5;\n"
9410 "\n"
9411 "int oneTwoThree = 123;",
9412 format("float const a = 5;\n"
9413 "\n"
9414 "int oneTwoThree= 123;",
9415 Alignment));
9416 EXPECT_EQ("float a = 5;\n"
9417 "int one = 1;\n"
9418 "\n"
9419 "unsigned oneTwoThree = 123;",
9420 format("float a = 5;\n"
9421 "int one = 1;\n"
9422 "\n"
9423 "unsigned oneTwoThree = 123;",
9424 Alignment));
9425 EXPECT_EQ("float a = 5;\n"
9426 "int one = 1;\n"
9427 "\n"
9428 "unsigned oneTwoThree = 123;\n"
9429 "int oneTwo = 12;",
9430 format("float a = 5;\n"
9431 "int one = 1;\n"
9432 "\n"
9433 "unsigned oneTwoThree = 123;\n"
9434 "int oneTwo = 12;",
9435 Alignment));
9436 Alignment.AlignConsecutiveAssignments = true;
9437 verifyFormat("float something = 2000;\n"
9438 "double another = 911;\n"
9439 "int i = 1, j = 10;\n"
9440 "const int *oneMore = 1;\n"
9441 "unsigned i = 2;",
9442 Alignment);
9443 verifyFormat("int oneTwoThree = {0}; // comment\n"
9444 "unsigned oneTwo = 0; // comment",
9445 Alignment);
9446 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9447 " int const i = 1;\n"
9448 " int * j = 2;\n"
9449 " int big = 10000;\n"
9450 "\n"
9451 " unsigned oneTwoThree = 123;\n"
9452 " int oneTwo = 12;\n"
9453 " method();\n"
9454 " float k = 2;\n"
9455 " int ll = 10000;\n"
9456 "}",
9457 format("void SomeFunction(int parameter= 0) {\n"
9458 " int const i= 1;\n"
9459 " int *j=2;\n"
9460 " int big = 10000;\n"
9461 "\n"
9462 "unsigned oneTwoThree =123;\n"
9463 "int oneTwo = 12;\n"
9464 " method();\n"
9465 "float k= 2;\n"
9466 "int ll=10000;\n"
9467 "}",
9468 Alignment));
9469 Alignment.AlignConsecutiveAssignments = false;
9470 Alignment.AlignEscapedNewlinesLeft = true;
9471 verifyFormat("#define A \\\n"
9472 " int aaaa = 12; \\\n"
9473 " float b = 23; \\\n"
9474 " const int ccc = 234; \\\n"
9475 " unsigned dddddddddd = 2345;",
9476 Alignment);
9477 Alignment.AlignEscapedNewlinesLeft = false;
9478 Alignment.ColumnLimit = 30;
9479 verifyFormat("#define A \\\n"
9480 " int aaaa = 12; \\\n"
9481 " float b = 23; \\\n"
9482 " const int ccc = 234; \\\n"
9483 " int dddddddddd = 2345;",
9484 Alignment);
9485 Alignment.ColumnLimit = 80;
9486 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9487 "k = 4, int l = 5,\n"
9488 " int m = 6) {\n"
9489 " const int j = 10;\n"
9490 " otherThing = 1;\n"
9491 "}",
9492 Alignment);
9493 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9494 " int const i = 1;\n"
9495 " int * j = 2;\n"
9496 " int big = 10000;\n"
9497 "}",
9498 Alignment);
9499 verifyFormat("class C {\n"
9500 "public:\n"
9501 " int i = 1;\n"
9502 " virtual void f() = 0;\n"
9503 "};",
9504 Alignment);
9505 verifyFormat("float i = 1;\n"
9506 "if (SomeType t = getSomething()) {\n"
9507 "}\n"
9508 "const unsigned j = 2;\n"
9509 "int big = 10000;",
9510 Alignment);
9511 verifyFormat("float j = 7;\n"
9512 "for (int k = 0; k < N; ++k) {\n"
9513 "}\n"
9514 "unsigned j = 2;\n"
9515 "int big = 10000;\n"
9516 "}",
9517 Alignment);
9518 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9519 verifyFormat("float i = 1;\n"
9520 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9521 " = someLooooooooooooooooongFunction();\n"
9522 "int j = 2;",
9523 Alignment);
9524 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9525 verifyFormat("int i = 1;\n"
9526 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9527 " someLooooooooooooooooongFunction();\n"
9528 "int j = 2;",
9529 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009530
9531 Alignment.AlignConsecutiveAssignments = true;
9532 verifyFormat("auto lambda = []() {\n"
9533 " auto ii = 0;\n"
9534 " float j = 0;\n"
9535 " return 0;\n"
9536 "};\n"
9537 "int i = 0;\n"
9538 "float i2 = 0;\n"
9539 "auto v = type{\n"
9540 " i = 1, //\n"
9541 " (i = 2), //\n"
9542 " i = 3 //\n"
9543 "};",
9544 Alignment);
9545 Alignment.AlignConsecutiveAssignments = false;
9546
Daniel Jaspere12597c2015-10-01 10:06:54 +00009547 // FIXME: Should align all three declarations
9548 verifyFormat(
9549 "int i = 1;\n"
9550 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9551 " loooooooooooooooooooooongParameterB);\n"
9552 "int j = 2;",
9553 Alignment);
9554
9555 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9556 // We expect declarations and assignments to align, as long as it doesn't
9557 // exceed the column limit, starting a new alignemnt sequence whenever it
9558 // happens.
9559 Alignment.AlignConsecutiveAssignments = true;
9560 Alignment.ColumnLimit = 30;
9561 verifyFormat("float ii = 1;\n"
9562 "unsigned j = 2;\n"
9563 "int someVerylongVariable = 1;\n"
9564 "AnotherLongType ll = 123456;\n"
9565 "VeryVeryLongType k = 2;\n"
9566 "int myvar = 1;",
9567 Alignment);
9568 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009569 Alignment.AlignConsecutiveAssignments = false;
9570
9571 verifyFormat(
9572 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9573 " typename LongType, typename B>\n"
9574 "auto foo() {}\n",
9575 Alignment);
9576 verifyFormat("float a, b = 1;\n"
9577 "int c = 2;\n"
9578 "int dd = 3;\n",
9579 Alignment);
9580 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9581 "float b[1][] = {{3.f}};\n",
9582 Alignment);
9583 Alignment.AlignConsecutiveAssignments = true;
9584 verifyFormat("float a, b = 1;\n"
9585 "int c = 2;\n"
9586 "int dd = 3;\n",
9587 Alignment);
9588 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9589 "float b[1][] = {{3.f}};\n",
9590 Alignment);
9591 Alignment.AlignConsecutiveAssignments = false;
9592
9593 Alignment.ColumnLimit = 30;
9594 Alignment.BinPackParameters = false;
9595 verifyFormat("void foo(float a,\n"
9596 " float b,\n"
9597 " int c,\n"
9598 " uint32_t *d) {\n"
9599 " int * e = 0;\n"
9600 " float f = 0;\n"
9601 " double g = 0;\n"
9602 "}\n"
9603 "void bar(ino_t a,\n"
9604 " int b,\n"
9605 " uint32_t *c,\n"
9606 " bool d) {}\n",
9607 Alignment);
9608 Alignment.BinPackParameters = true;
9609 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009610}
9611
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009612TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009613 FormatStyle LinuxBraceStyle = getLLVMStyle();
9614 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009615 verifyFormat("namespace a\n"
9616 "{\n"
9617 "class A\n"
9618 "{\n"
9619 " void f()\n"
9620 " {\n"
9621 " if (true) {\n"
9622 " a();\n"
9623 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009624 " } else {\n"
9625 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009626 " }\n"
9627 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009628 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009629 "};\n"
9630 "struct B {\n"
9631 " int x;\n"
9632 "};\n"
9633 "}\n",
9634 LinuxBraceStyle);
9635 verifyFormat("enum X {\n"
9636 " Y = 0,\n"
9637 "}\n",
9638 LinuxBraceStyle);
9639 verifyFormat("struct S {\n"
9640 " int Type;\n"
9641 " union {\n"
9642 " int x;\n"
9643 " double y;\n"
9644 " } Value;\n"
9645 " class C\n"
9646 " {\n"
9647 " MyFavoriteType Value;\n"
9648 " } Class;\n"
9649 "}\n",
9650 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009651}
9652
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009653TEST_F(FormatTest, MozillaBraceBreaking) {
9654 FormatStyle MozillaBraceStyle = getLLVMStyle();
9655 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9656 verifyFormat("namespace a {\n"
9657 "class A\n"
9658 "{\n"
9659 " void f()\n"
9660 " {\n"
9661 " if (true) {\n"
9662 " a();\n"
9663 " b();\n"
9664 " }\n"
9665 " }\n"
9666 " void g() { return; }\n"
9667 "};\n"
9668 "enum E\n"
9669 "{\n"
9670 " A,\n"
9671 " // foo\n"
9672 " B,\n"
9673 " C\n"
9674 "};\n"
9675 "struct B\n"
9676 "{\n"
9677 " int x;\n"
9678 "};\n"
9679 "}\n",
9680 MozillaBraceStyle);
9681 verifyFormat("struct S\n"
9682 "{\n"
9683 " int Type;\n"
9684 " union\n"
9685 " {\n"
9686 " int x;\n"
9687 " double y;\n"
9688 " } Value;\n"
9689 " class C\n"
9690 " {\n"
9691 " MyFavoriteType Value;\n"
9692 " } Class;\n"
9693 "}\n",
9694 MozillaBraceStyle);
9695}
9696
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009697TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009698 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9699 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009700 verifyFormat("namespace a {\n"
9701 "class A {\n"
9702 " void f()\n"
9703 " {\n"
9704 " if (true) {\n"
9705 " a();\n"
9706 " b();\n"
9707 " }\n"
9708 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009709 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009710 "};\n"
9711 "struct B {\n"
9712 " int x;\n"
9713 "};\n"
9714 "}\n",
9715 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009716
Daniel Jasperd9670872014-08-05 12:06:20 +00009717 verifyFormat("void foo()\n"
9718 "{\n"
9719 " if (a) {\n"
9720 " a();\n"
9721 " }\n"
9722 " else {\n"
9723 " b();\n"
9724 " }\n"
9725 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009726 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009727
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009728 verifyFormat("#ifdef _DEBUG\n"
9729 "int foo(int i = 0)\n"
9730 "#else\n"
9731 "int foo(int i = 5)\n"
9732 "#endif\n"
9733 "{\n"
9734 " return i;\n"
9735 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009736 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009737
9738 verifyFormat("void foo() {}\n"
9739 "void bar()\n"
9740 "#ifdef _DEBUG\n"
9741 "{\n"
9742 " foo();\n"
9743 "}\n"
9744 "#else\n"
9745 "{\n"
9746 "}\n"
9747 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009748 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009749
9750 verifyFormat("void foobar() { int i = 5; }\n"
9751 "#ifdef _DEBUG\n"
9752 "void bar() {}\n"
9753 "#else\n"
9754 "void bar() { foobar(); }\n"
9755 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009756 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009757}
9758
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009759TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009760 FormatStyle AllmanBraceStyle = getLLVMStyle();
9761 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009762 verifyFormat("namespace a\n"
9763 "{\n"
9764 "class A\n"
9765 "{\n"
9766 " void f()\n"
9767 " {\n"
9768 " if (true)\n"
9769 " {\n"
9770 " a();\n"
9771 " b();\n"
9772 " }\n"
9773 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009774 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009775 "};\n"
9776 "struct B\n"
9777 "{\n"
9778 " int x;\n"
9779 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009780 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009781 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009782
9783 verifyFormat("void f()\n"
9784 "{\n"
9785 " if (true)\n"
9786 " {\n"
9787 " a();\n"
9788 " }\n"
9789 " else if (false)\n"
9790 " {\n"
9791 " b();\n"
9792 " }\n"
9793 " else\n"
9794 " {\n"
9795 " c();\n"
9796 " }\n"
9797 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009798 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009799
9800 verifyFormat("void f()\n"
9801 "{\n"
9802 " for (int i = 0; i < 10; ++i)\n"
9803 " {\n"
9804 " a();\n"
9805 " }\n"
9806 " while (false)\n"
9807 " {\n"
9808 " b();\n"
9809 " }\n"
9810 " do\n"
9811 " {\n"
9812 " c();\n"
9813 " } while (false)\n"
9814 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009815 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009816
9817 verifyFormat("void f(int a)\n"
9818 "{\n"
9819 " switch (a)\n"
9820 " {\n"
9821 " case 0:\n"
9822 " break;\n"
9823 " case 1:\n"
9824 " {\n"
9825 " break;\n"
9826 " }\n"
9827 " case 2:\n"
9828 " {\n"
9829 " }\n"
9830 " break;\n"
9831 " default:\n"
9832 " break;\n"
9833 " }\n"
9834 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009835 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009836
9837 verifyFormat("enum X\n"
9838 "{\n"
9839 " Y = 0,\n"
9840 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009841 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009842 verifyFormat("enum X\n"
9843 "{\n"
9844 " Y = 0\n"
9845 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009846 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009847
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009848 verifyFormat("@interface BSApplicationController ()\n"
9849 "{\n"
9850 "@private\n"
9851 " id _extraIvar;\n"
9852 "}\n"
9853 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009854 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009855
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009856 verifyFormat("#ifdef _DEBUG\n"
9857 "int foo(int i = 0)\n"
9858 "#else\n"
9859 "int foo(int i = 5)\n"
9860 "#endif\n"
9861 "{\n"
9862 " return i;\n"
9863 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009864 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009865
9866 verifyFormat("void foo() {}\n"
9867 "void bar()\n"
9868 "#ifdef _DEBUG\n"
9869 "{\n"
9870 " foo();\n"
9871 "}\n"
9872 "#else\n"
9873 "{\n"
9874 "}\n"
9875 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009876 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009877
9878 verifyFormat("void foobar() { int i = 5; }\n"
9879 "#ifdef _DEBUG\n"
9880 "void bar() {}\n"
9881 "#else\n"
9882 "void bar() { foobar(); }\n"
9883 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009884 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009885
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009886 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009887 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009888 " // ...\n"
9889 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009890 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009891 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009892 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009893 " // ...\n"
9894 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009895 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009896 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009897 // .. or dict literals.
9898 verifyFormat("void f()\n"
9899 "{\n"
9900 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9901 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009902 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009903 verifyFormat("int f()\n"
9904 "{ // comment\n"
9905 " return 42;\n"
9906 "}",
9907 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009908
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009909 AllmanBraceStyle.ColumnLimit = 19;
9910 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9911 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009912 verifyFormat("void f()\n"
9913 "{\n"
9914 " int i;\n"
9915 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009916 AllmanBraceStyle);
9917 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009918
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009919 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009920 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9921 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9922 verifyFormat("void f(bool b)\n"
9923 "{\n"
9924 " if (b)\n"
9925 " {\n"
9926 " return;\n"
9927 " }\n"
9928 "}\n",
9929 BreakBeforeBraceShortIfs);
9930 verifyFormat("void f(bool b)\n"
9931 "{\n"
9932 " if (b) return;\n"
9933 "}\n",
9934 BreakBeforeBraceShortIfs);
9935 verifyFormat("void f(bool b)\n"
9936 "{\n"
9937 " while (b)\n"
9938 " {\n"
9939 " return;\n"
9940 " }\n"
9941 "}\n",
9942 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009943}
9944
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009945TEST_F(FormatTest, GNUBraceBreaking) {
9946 FormatStyle GNUBraceStyle = getLLVMStyle();
9947 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9948 verifyFormat("namespace a\n"
9949 "{\n"
9950 "class A\n"
9951 "{\n"
9952 " void f()\n"
9953 " {\n"
9954 " int a;\n"
9955 " {\n"
9956 " int b;\n"
9957 " }\n"
9958 " if (true)\n"
9959 " {\n"
9960 " a();\n"
9961 " b();\n"
9962 " }\n"
9963 " }\n"
9964 " void g() { return; }\n"
9965 "}\n"
9966 "}",
9967 GNUBraceStyle);
9968
9969 verifyFormat("void f()\n"
9970 "{\n"
9971 " if (true)\n"
9972 " {\n"
9973 " a();\n"
9974 " }\n"
9975 " else if (false)\n"
9976 " {\n"
9977 " b();\n"
9978 " }\n"
9979 " else\n"
9980 " {\n"
9981 " c();\n"
9982 " }\n"
9983 "}\n",
9984 GNUBraceStyle);
9985
9986 verifyFormat("void f()\n"
9987 "{\n"
9988 " for (int i = 0; i < 10; ++i)\n"
9989 " {\n"
9990 " a();\n"
9991 " }\n"
9992 " while (false)\n"
9993 " {\n"
9994 " b();\n"
9995 " }\n"
9996 " do\n"
9997 " {\n"
9998 " c();\n"
9999 " }\n"
10000 " while (false);\n"
10001 "}\n",
10002 GNUBraceStyle);
10003
10004 verifyFormat("void f(int a)\n"
10005 "{\n"
10006 " switch (a)\n"
10007 " {\n"
10008 " case 0:\n"
10009 " break;\n"
10010 " case 1:\n"
10011 " {\n"
10012 " break;\n"
10013 " }\n"
10014 " case 2:\n"
10015 " {\n"
10016 " }\n"
10017 " break;\n"
10018 " default:\n"
10019 " break;\n"
10020 " }\n"
10021 "}\n",
10022 GNUBraceStyle);
10023
10024 verifyFormat("enum X\n"
10025 "{\n"
10026 " Y = 0,\n"
10027 "}\n",
10028 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010029
10030 verifyFormat("@interface BSApplicationController ()\n"
10031 "{\n"
10032 "@private\n"
10033 " id _extraIvar;\n"
10034 "}\n"
10035 "@end\n",
10036 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010037
10038 verifyFormat("#ifdef _DEBUG\n"
10039 "int foo(int i = 0)\n"
10040 "#else\n"
10041 "int foo(int i = 5)\n"
10042 "#endif\n"
10043 "{\n"
10044 " return i;\n"
10045 "}",
10046 GNUBraceStyle);
10047
10048 verifyFormat("void foo() {}\n"
10049 "void bar()\n"
10050 "#ifdef _DEBUG\n"
10051 "{\n"
10052 " foo();\n"
10053 "}\n"
10054 "#else\n"
10055 "{\n"
10056 "}\n"
10057 "#endif",
10058 GNUBraceStyle);
10059
10060 verifyFormat("void foobar() { int i = 5; }\n"
10061 "#ifdef _DEBUG\n"
10062 "void bar() {}\n"
10063 "#else\n"
10064 "void bar() { foobar(); }\n"
10065 "#endif",
10066 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010067}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010068
10069TEST_F(FormatTest, WebKitBraceBreaking) {
10070 FormatStyle WebKitBraceStyle = getLLVMStyle();
10071 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
10072 verifyFormat("namespace a {\n"
10073 "class A {\n"
10074 " void f()\n"
10075 " {\n"
10076 " if (true) {\n"
10077 " a();\n"
10078 " b();\n"
10079 " }\n"
10080 " }\n"
10081 " void g() { return; }\n"
10082 "};\n"
10083 "enum E {\n"
10084 " A,\n"
10085 " // foo\n"
10086 " B,\n"
10087 " C\n"
10088 "};\n"
10089 "struct B {\n"
10090 " int x;\n"
10091 "};\n"
10092 "}\n",
10093 WebKitBraceStyle);
10094 verifyFormat("struct S {\n"
10095 " int Type;\n"
10096 " union {\n"
10097 " int x;\n"
10098 " double y;\n"
10099 " } Value;\n"
10100 " class C {\n"
10101 " MyFavoriteType Value;\n"
10102 " } Class;\n"
10103 "};\n",
10104 WebKitBraceStyle);
10105}
10106
Manuel Klimekd5735502013-08-12 03:51:17 +000010107TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10108 verifyFormat("void f() {\n"
10109 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010110 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010111 " }\n"
10112 "}\n",
10113 getLLVMStyle());
10114}
10115
Daniel Jasper9613c812013-08-07 16:29:23 +000010116TEST_F(FormatTest, UnderstandsPragmas) {
10117 verifyFormat("#pragma omp reduction(| : var)");
10118 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010119
10120 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10121 "(including parentheses).",
10122 format("#pragma mark Any non-hyphenated or hyphenated string "
10123 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010124}
10125
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010126TEST_F(FormatTest, UnderstandPragmaOption) {
10127 verifyFormat("#pragma option -C -A");
10128
10129 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10130}
10131
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010132#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10133 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010134 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10135 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010136
10137TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010138 SmallVector<FormatStyle, 3> Styles;
10139 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010140
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010141 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010142 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10143 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10144 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010145
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010146 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010147 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10148 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10149 EXPECT_ALL_STYLES_EQUAL(Styles);
10150
Nico Weber514ecc82014-02-02 20:50:45 +000010151 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010152 EXPECT_TRUE(
10153 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10154 EXPECT_TRUE(
10155 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10156 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010157
Nico Weber514ecc82014-02-02 20:50:45 +000010158 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010159 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10160 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10161 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010162
10163 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010164 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10165 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10166 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010167
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010168 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010169 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10170 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10171 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010172
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010173 Styles[0] = getGNUStyle();
10174 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10175 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10176 EXPECT_ALL_STYLES_EQUAL(Styles);
10177
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010178 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10179}
10180
10181TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10182 SmallVector<FormatStyle, 8> Styles;
10183 Styles.resize(2);
10184
10185 Styles[0] = getGoogleStyle();
10186 Styles[1] = getLLVMStyle();
10187 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10188 EXPECT_ALL_STYLES_EQUAL(Styles);
10189
10190 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010191 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010192 Styles[1] = getLLVMStyle();
10193 Styles[1].Language = FormatStyle::LK_JavaScript;
10194 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10195
10196 Styles[2] = getLLVMStyle();
10197 Styles[2].Language = FormatStyle::LK_JavaScript;
10198 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10199 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010200 &Styles[2])
10201 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010202
10203 Styles[3] = getLLVMStyle();
10204 Styles[3].Language = FormatStyle::LK_JavaScript;
10205 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10206 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010207 &Styles[3])
10208 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010209
10210 Styles[4] = getLLVMStyle();
10211 Styles[4].Language = FormatStyle::LK_JavaScript;
10212 EXPECT_EQ(0, parseConfiguration("---\n"
10213 "BasedOnStyle: LLVM\n"
10214 "IndentWidth: 123\n"
10215 "---\n"
10216 "BasedOnStyle: Google\n"
10217 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010218 &Styles[4])
10219 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010220 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010221}
10222
Daniel Jasper91881d92014-09-29 08:07:46 +000010223#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010224 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010225 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010226 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010227 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010228 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010229
Daniel Jasper91881d92014-09-29 08:07:46 +000010230#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10231
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010232#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10233 Style.STRUCT.FIELD = false; \
10234 EXPECT_EQ(0, \
10235 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10236 .value()); \
10237 EXPECT_TRUE(Style.STRUCT.FIELD); \
10238 EXPECT_EQ(0, \
10239 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10240 .value()); \
10241 EXPECT_FALSE(Style.STRUCT.FIELD);
10242
10243#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10244 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10245
Daniel Jasper00853002014-09-16 16:22:30 +000010246#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10247 EXPECT_NE(VALUE, Style.FIELD); \
10248 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10249 EXPECT_EQ(VALUE, Style.FIELD)
10250
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010251TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010252 FormatStyle Style = {};
10253 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010254 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +000010255 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010256 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010257 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010258 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010259 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010260 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010261 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010262 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010263 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010264 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010265 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010266 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010267 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010268 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +000010269 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010270 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010271 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010272 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010273 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010274 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010275 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010276 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010277 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010278 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010279 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010280 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010281 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010282 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010283 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010284 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010285 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010286 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010287 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010288 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010289 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010290 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010291 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010292
10293 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10294 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10295 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10296 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10297 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10298 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10299 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10300 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
10301 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10302 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10303 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010304}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010305
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010306#undef CHECK_PARSE_BOOL
10307
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010308TEST_F(FormatTest, ParsesConfiguration) {
10309 FormatStyle Style = {};
10310 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010311 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010312 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10313 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010314 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010315 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10316 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010317 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10318 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010319 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10320 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10321 PenaltyReturnTypeOnItsOwnLine, 1234u);
10322 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10323 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010324 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010325 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010326 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010327
Daniel Jasper553d4872014-06-17 12:40:34 +000010328 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010329 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10330 FormatStyle::PAS_Left);
10331 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10332 FormatStyle::PAS_Right);
10333 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10334 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010335 // For backward compatibility:
10336 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10337 FormatStyle::PAS_Left);
10338 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10339 FormatStyle::PAS_Right);
10340 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10341 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010342
Alexander Kornienkod6538332013-05-07 15:32:14 +000010343 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010344 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10345 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010346 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10347 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10348 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10349
Daniel Jasperac043c92014-09-15 11:11:00 +000010350 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010351 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10352 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010353 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10354 FormatStyle::BOS_None);
10355 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10356 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010357 // For backward compatibility:
10358 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10359 FormatStyle::BOS_None);
10360 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10361 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010362
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010363 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10364 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10365 FormatStyle::BAS_Align);
10366 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10367 FormatStyle::BAS_DontAlign);
10368 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10369 FormatStyle::BAS_AlwaysBreak);
10370 // For backward compatibility:
10371 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10372 FormatStyle::BAS_DontAlign);
10373 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10374 FormatStyle::BAS_Align);
10375
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010376 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010377 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10378 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10379 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010380 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10381 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010382 // For backward compatibility:
10383 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10384 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010385
Daniel Jasperd74cf402014-04-08 12:46:38 +000010386 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010387 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10388 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10389 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10390 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010391 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10392 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010393 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10394 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010395 // For backward compatibility:
10396 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10397 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10398 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10399 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010400
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010401 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10402 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10403 FormatStyle::SBPO_Never);
10404 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10405 FormatStyle::SBPO_Always);
10406 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10407 FormatStyle::SBPO_ControlStatements);
10408 // For backward compatibility:
10409 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10410 FormatStyle::SBPO_Never);
10411 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10412 FormatStyle::SBPO_ControlStatements);
10413
Alexander Kornienkod6538332013-05-07 15:32:14 +000010414 Style.ColumnLimit = 123;
10415 FormatStyle BaseStyle = getLLVMStyle();
10416 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10417 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10418
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010419 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10420 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10421 FormatStyle::BS_Attach);
10422 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10423 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010424 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10425 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010426 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10427 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010428 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10429 FormatStyle::BS_Allman);
10430 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010431 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10432 FormatStyle::BS_WebKit);
10433 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10434 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010435
Zachary Turner448592e2015-12-18 22:20:15 +000010436 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10437 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10438 FormatStyle::RTBS_None);
10439 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10440 FormatStyle::RTBS_All);
10441 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010442 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010443 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10444 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10445 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10446 AlwaysBreakAfterReturnType,
10447 FormatStyle::RTBS_TopLevelDefinitions);
10448
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010449 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10450 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10451 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10452 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10453 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10454 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10455 AlwaysBreakAfterDefinitionReturnType,
10456 FormatStyle::DRTBS_TopLevel);
10457
Daniel Jasper65ee3472013-07-31 23:16:02 +000010458 Style.NamespaceIndentation = FormatStyle::NI_All;
10459 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10460 FormatStyle::NI_None);
10461 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10462 FormatStyle::NI_Inner);
10463 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10464 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010465
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010466 // FIXME: This is required because parsing a configuration simply overwrites
10467 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010468 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010469 std::vector<std::string> BoostForeach;
10470 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010471 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010472 std::vector<std::string> BoostAndQForeach;
10473 BoostAndQForeach.push_back("BOOST_FOREACH");
10474 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010475 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10476 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010477
10478 Style.IncludeCategories.clear();
10479 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10480 {".*", 1}};
10481 CHECK_PARSE("IncludeCategories:\n"
10482 " - Regex: abc/.*\n"
10483 " Priority: 2\n"
10484 " - Regex: .*\n"
10485 " Priority: 1",
10486 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010487 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010488}
10489
10490TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10491 FormatStyle Style = {};
10492 Style.Language = FormatStyle::LK_Cpp;
10493 CHECK_PARSE("Language: Cpp\n"
10494 "IndentWidth: 12",
10495 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010496 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10497 "IndentWidth: 34",
10498 &Style),
10499 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010500 EXPECT_EQ(12u, Style.IndentWidth);
10501 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10502 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10503
10504 Style.Language = FormatStyle::LK_JavaScript;
10505 CHECK_PARSE("Language: JavaScript\n"
10506 "IndentWidth: 12",
10507 IndentWidth, 12u);
10508 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010509 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10510 "IndentWidth: 34",
10511 &Style),
10512 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010513 EXPECT_EQ(23u, Style.IndentWidth);
10514 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10515 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10516
10517 CHECK_PARSE("BasedOnStyle: LLVM\n"
10518 "IndentWidth: 67",
10519 IndentWidth, 67u);
10520
10521 CHECK_PARSE("---\n"
10522 "Language: JavaScript\n"
10523 "IndentWidth: 12\n"
10524 "---\n"
10525 "Language: Cpp\n"
10526 "IndentWidth: 34\n"
10527 "...\n",
10528 IndentWidth, 12u);
10529
10530 Style.Language = FormatStyle::LK_Cpp;
10531 CHECK_PARSE("---\n"
10532 "Language: JavaScript\n"
10533 "IndentWidth: 12\n"
10534 "---\n"
10535 "Language: Cpp\n"
10536 "IndentWidth: 34\n"
10537 "...\n",
10538 IndentWidth, 34u);
10539 CHECK_PARSE("---\n"
10540 "IndentWidth: 78\n"
10541 "---\n"
10542 "Language: JavaScript\n"
10543 "IndentWidth: 56\n"
10544 "...\n",
10545 IndentWidth, 78u);
10546
10547 Style.ColumnLimit = 123;
10548 Style.IndentWidth = 234;
10549 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10550 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010551 EXPECT_FALSE(parseConfiguration("---\n"
10552 "IndentWidth: 456\n"
10553 "BreakBeforeBraces: Allman\n"
10554 "---\n"
10555 "Language: JavaScript\n"
10556 "IndentWidth: 111\n"
10557 "TabWidth: 111\n"
10558 "---\n"
10559 "Language: Cpp\n"
10560 "BreakBeforeBraces: Stroustrup\n"
10561 "TabWidth: 789\n"
10562 "...\n",
10563 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010564 EXPECT_EQ(123u, Style.ColumnLimit);
10565 EXPECT_EQ(456u, Style.IndentWidth);
10566 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10567 EXPECT_EQ(789u, Style.TabWidth);
10568
Rafael Espindola1f243172014-06-12 11:35:17 +000010569 EXPECT_EQ(parseConfiguration("---\n"
10570 "Language: JavaScript\n"
10571 "IndentWidth: 56\n"
10572 "---\n"
10573 "IndentWidth: 78\n"
10574 "...\n",
10575 &Style),
10576 ParseError::Error);
10577 EXPECT_EQ(parseConfiguration("---\n"
10578 "Language: JavaScript\n"
10579 "IndentWidth: 56\n"
10580 "---\n"
10581 "Language: JavaScript\n"
10582 "IndentWidth: 78\n"
10583 "...\n",
10584 &Style),
10585 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010586
10587 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10588}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010589
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010590#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010591
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010592TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10593 FormatStyle Style = {};
10594 Style.Language = FormatStyle::LK_JavaScript;
10595 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010596 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010597 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010598
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010599 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010600 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010601 "BasedOnStyle: Google\n"
10602 "---\n"
10603 "Language: JavaScript\n"
10604 "IndentWidth: 76\n"
10605 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010606 &Style)
10607 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010608 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010609 EXPECT_EQ(76u, Style.IndentWidth);
10610 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10611}
10612
Alexander Kornienkod6538332013-05-07 15:32:14 +000010613TEST_F(FormatTest, ConfigurationRoundTripTest) {
10614 FormatStyle Style = getLLVMStyle();
10615 std::string YAML = configurationAsText(Style);
10616 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010617 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010618 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10619 EXPECT_EQ(Style, ParsedStyle);
10620}
10621
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010622TEST_F(FormatTest, WorksFor8bitEncodings) {
10623 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10624 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10625 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10626 "\"\xef\xee\xf0\xf3...\"",
10627 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10628 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10629 "\xef\xee\xf0\xf3...\"",
10630 getLLVMStyleWithColumns(12)));
10631}
10632
Alexander Kornienko393e3082013-11-13 14:04:17 +000010633TEST_F(FormatTest, HandlesUTF8BOM) {
10634 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10635 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10636 format("\xef\xbb\xbf#include <iostream>"));
10637 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10638 format("\xef\xbb\xbf\n#include <iostream>"));
10639}
10640
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010641// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10642#if !defined(_MSC_VER)
10643
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010644TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10645 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10646 getLLVMStyleWithColumns(35));
10647 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010648 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010649 verifyFormat("// Однажды в студёную зимнюю пору...",
10650 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010651 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010652 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10653 getLLVMStyleWithColumns(39));
10654 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010655 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010656}
10657
10658TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010659 // Non-printable characters' width is currently considered to be the length in
10660 // bytes in UTF8. The characters can be displayed in very different manner
10661 // (zero-width, single width with a substitution glyph, expanded to their code
10662 // (e.g. "<8d>"), so there's no single correct way to handle them.
10663 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010664 "\"\xc2\x8d\";",
10665 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010666 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010667 "\"\xc2\x8d\";",
10668 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010669 EXPECT_EQ("\"Однажды, в \"\n"
10670 "\"студёную \"\n"
10671 "\"зимнюю \"\n"
10672 "\"пору,\"",
10673 format("\"Однажды, в студёную зимнюю пору,\"",
10674 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010675 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010676 "\"一 二 三 \"\n"
10677 "\"四 五六 \"\n"
10678 "\"七 八 九 \"\n"
10679 "\"十\"",
10680 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010681 EXPECT_EQ("\"一\t二 \"\n"
10682 "\"\t三 \"\n"
10683 "\"四 五\t六 \"\n"
10684 "\"\t七 \"\n"
10685 "\"八九十\tqq\"",
10686 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10687 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010688
10689 // UTF8 character in an escape sequence.
10690 EXPECT_EQ("\"aaaaaa\"\n"
10691 "\"\\\xC2\x8D\"",
10692 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010693}
10694
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010695TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10696 EXPECT_EQ("const char *sssss =\n"
10697 " \"一二三四五六七八\\\n"
10698 " 九 十\";",
10699 format("const char *sssss = \"一二三四五六七八\\\n"
10700 " 九 十\";",
10701 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010702}
10703
10704TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010705 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10706 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010707 EXPECT_EQ("// Я из лесу\n"
10708 "// вышел; был\n"
10709 "// сильный\n"
10710 "// мороз.",
10711 format("// Я из лесу вышел; был сильный мороз.",
10712 getLLVMStyleWithColumns(13)));
10713 EXPECT_EQ("// 一二三\n"
10714 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010715 "// 八 九\n"
10716 "// 十",
10717 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010718}
10719
10720TEST_F(FormatTest, SplitsUTF8BlockComments) {
10721 EXPECT_EQ("/* Гляжу,\n"
10722 " * поднимается\n"
10723 " * медленно в\n"
10724 " * гору\n"
10725 " * Лошадка,\n"
10726 " * везущая\n"
10727 " * хворосту\n"
10728 " * воз. */",
10729 format("/* Гляжу, поднимается медленно в гору\n"
10730 " * Лошадка, везущая хворосту воз. */",
10731 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010732 EXPECT_EQ(
10733 "/* 一二三\n"
10734 " * 四五六七\n"
10735 " * 八 九\n"
10736 " * 十 */",
10737 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010738 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10739 " * 𝕓𝕪𝕥𝕖\n"
10740 " * 𝖀𝕿𝕱-𝟠 */",
10741 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010742}
10743
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010744#endif // _MSC_VER
10745
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010746TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10747 FormatStyle Style = getLLVMStyle();
10748
10749 Style.ConstructorInitializerIndentWidth = 4;
10750 verifyFormat(
10751 "SomeClass::Constructor()\n"
10752 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10753 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10754 Style);
10755
10756 Style.ConstructorInitializerIndentWidth = 2;
10757 verifyFormat(
10758 "SomeClass::Constructor()\n"
10759 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10760 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10761 Style);
10762
10763 Style.ConstructorInitializerIndentWidth = 0;
10764 verifyFormat(
10765 "SomeClass::Constructor()\n"
10766 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10767 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10768 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010769 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10770 verifyFormat(
10771 "SomeLongTemplateVariableName<\n"
10772 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10773 Style);
10774 verifyFormat(
10775 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10776 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10777 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010778}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010779
Daniel Jasper00853002014-09-16 16:22:30 +000010780TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10781 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010782 Style.BreakConstructorInitializersBeforeComma = true;
10783 Style.ConstructorInitializerIndentWidth = 4;
10784 verifyFormat("SomeClass::Constructor()\n"
10785 " : a(a)\n"
10786 " , b(b)\n"
10787 " , c(c) {}",
10788 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010789 verifyFormat("SomeClass::Constructor()\n"
10790 " : a(a) {}",
10791 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010792
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010793 Style.ColumnLimit = 0;
10794 verifyFormat("SomeClass::Constructor()\n"
10795 " : a(a) {}",
10796 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010797 verifyFormat("SomeClass::Constructor() noexcept\n"
10798 " : a(a) {}",
10799 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010800 verifyFormat("SomeClass::Constructor()\n"
10801 " : a(a)\n"
10802 " , b(b)\n"
10803 " , c(c) {}",
10804 Style);
10805 verifyFormat("SomeClass::Constructor()\n"
10806 " : a(a) {\n"
10807 " foo();\n"
10808 " bar();\n"
10809 "}",
10810 Style);
10811
Daniel Jasperd74cf402014-04-08 12:46:38 +000010812 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010813 verifyFormat("SomeClass::Constructor()\n"
10814 " : a(a)\n"
10815 " , b(b)\n"
10816 " , c(c) {\n}",
10817 Style);
10818 verifyFormat("SomeClass::Constructor()\n"
10819 " : a(a) {\n}",
10820 Style);
10821
10822 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010823 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010824 Style.ConstructorInitializerIndentWidth = 2;
10825 verifyFormat("SomeClass::Constructor()\n"
10826 " : a(a)\n"
10827 " , b(b)\n"
10828 " , c(c) {}",
10829 Style);
10830
10831 Style.ConstructorInitializerIndentWidth = 0;
10832 verifyFormat("SomeClass::Constructor()\n"
10833 ": a(a)\n"
10834 ", b(b)\n"
10835 ", c(c) {}",
10836 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010837
10838 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10839 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010840 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10841 verifyFormat(
10842 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10843 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010844 verifyFormat(
10845 "SomeClass::Constructor()\n"
10846 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10847 Style);
10848 Style.ConstructorInitializerIndentWidth = 4;
10849 Style.ColumnLimit = 60;
10850 verifyFormat("SomeClass::Constructor()\n"
10851 " : aaaaaaaa(aaaaaaaa)\n"
10852 " , aaaaaaaa(aaaaaaaa)\n"
10853 " , aaaaaaaa(aaaaaaaa) {}",
10854 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010855}
10856
Daniel Jasper38efc132014-10-21 07:51:54 +000010857TEST_F(FormatTest, Destructors) {
10858 verifyFormat("void F(int &i) { i.~int(); }");
10859 verifyFormat("void F(int &i) { i->~int(); }");
10860}
10861
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010862TEST_F(FormatTest, FormatsWithWebKitStyle) {
10863 FormatStyle Style = getWebKitStyle();
10864
10865 // Don't indent in outer namespaces.
10866 verifyFormat("namespace outer {\n"
10867 "int i;\n"
10868 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010869 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010870 "} // namespace inner\n"
10871 "} // namespace outer\n"
10872 "namespace other_outer {\n"
10873 "int i;\n"
10874 "}",
10875 Style);
10876
10877 // Don't indent case labels.
10878 verifyFormat("switch (variable) {\n"
10879 "case 1:\n"
10880 "case 2:\n"
10881 " doSomething();\n"
10882 " break;\n"
10883 "default:\n"
10884 " ++variable;\n"
10885 "}",
10886 Style);
10887
10888 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010889 EXPECT_EQ("void f()\n"
10890 "{\n"
10891 " if (aaaaaaaaaaaaaaaa\n"
10892 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10893 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10894 " return;\n"
10895 "}",
10896 format("void f() {\n"
10897 "if (aaaaaaaaaaaaaaaa\n"
10898 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10899 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10900 "return;\n"
10901 "}",
10902 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010903
Daniel Jasper35995672014-04-29 14:05:20 +000010904 // Allow functions on a single line.
10905 verifyFormat("void f() { return; }", Style);
10906
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010907 // Constructor initializers are formatted one per line with the "," on the
10908 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010909 verifyFormat("Constructor()\n"
10910 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10911 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010912 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010913 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10914 "{\n"
10915 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010916 Style);
10917 verifyFormat("SomeClass::Constructor()\n"
10918 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010919 "{\n"
10920 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010921 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010922 EXPECT_EQ("SomeClass::Constructor()\n"
10923 " : a(a)\n"
10924 "{\n"
10925 "}",
10926 format("SomeClass::Constructor():a(a){}", Style));
10927 verifyFormat("SomeClass::Constructor()\n"
10928 " : a(a)\n"
10929 " , b(b)\n"
10930 " , c(c)\n"
10931 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010932 "}",
10933 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010934 verifyFormat("SomeClass::Constructor()\n"
10935 " : a(a)\n"
10936 "{\n"
10937 " foo();\n"
10938 " bar();\n"
10939 "}",
10940 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010941
Daniel Jasper65ee3472013-07-31 23:16:02 +000010942 // Access specifiers should be aligned left.
10943 verifyFormat("class C {\n"
10944 "public:\n"
10945 " int i;\n"
10946 "};",
10947 Style);
10948
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010949 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010950 verifyFormat("int a; // Do not\n"
10951 "double b; // align comments.",
10952 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010953
Daniel Jasper3219e432014-12-02 13:24:51 +000010954 // Do not align operands.
10955 EXPECT_EQ("ASSERT(aaaa\n"
10956 " || bbbb);",
10957 format("ASSERT ( aaaa\n||bbbb);", Style));
10958
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010959 // Accept input's line breaks.
10960 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10961 " || bbbbbbbbbbbbbbb) {\n"
10962 " i++;\n"
10963 "}",
10964 format("if (aaaaaaaaaaaaaaa\n"
10965 "|| bbbbbbbbbbbbbbb) { i++; }",
10966 Style));
10967 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10968 " i++;\n"
10969 "}",
10970 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010971
10972 // Don't automatically break all macro definitions (llvm.org/PR17842).
10973 verifyFormat("#define aNumber 10", Style);
10974 // However, generally keep the line breaks that the user authored.
10975 EXPECT_EQ("#define aNumber \\\n"
10976 " 10",
10977 format("#define aNumber \\\n"
10978 " 10",
10979 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010980
10981 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010982 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10983 " copyItems:YES];",
10984 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10985 "copyItems:YES];",
10986 Style));
10987 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10988 " copyItems:YES];",
10989 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10990 " copyItems:YES];",
10991 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010992 // FIXME: This does not seem right, there should be more indentation before
10993 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010994 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010995 " @\"a\",\n"
10996 " @\"a\"\n"
10997 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010998 " copyItems:YES];",
10999 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11000 " @\"a\",\n"
11001 " @\"a\"\n"
11002 " ]\n"
11003 " copyItems:YES];",
11004 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011005 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011006 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11007 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011008 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11009 " copyItems:YES];",
11010 Style));
11011
11012 verifyFormat("[self.a b:c c:d];", Style);
11013 EXPECT_EQ("[self.a b:c\n"
11014 " c:d];",
11015 format("[self.a b:c\n"
11016 "c:d];",
11017 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011018}
11019
Manuel Klimekffdeb592013-09-03 15:10:01 +000011020TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011021 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11022 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11023 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11024 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11025 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011026 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011027 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011028 verifyFormat("void f() {\n"
11029 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11030 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011031 verifyFormat("void f() {\n"
11032 " other(x.begin(), //\n"
11033 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011034 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011035 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011036 verifyFormat("SomeFunction([]() { // A cool function...\n"
11037 " return 43;\n"
11038 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011039 EXPECT_EQ("SomeFunction([]() {\n"
11040 "#define A a\n"
11041 " return 43;\n"
11042 "});",
11043 format("SomeFunction([](){\n"
11044 "#define A a\n"
11045 "return 43;\n"
11046 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011047 verifyFormat("void f() {\n"
11048 " SomeFunction([](decltype(x), A *a) {});\n"
11049 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011050 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11051 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011052 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11053 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11054 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011055 verifyFormat("Constructor()\n"
11056 " : Field([] { // comment\n"
11057 " int i;\n"
11058 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011059 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11060 " return some_parameter.size();\n"
11061 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011062 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11063 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011064 verifyFormat("int i = aaaaaa ? 1 //\n"
11065 " : [] {\n"
11066 " return 2; //\n"
11067 " }();");
11068 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11069 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11070 " return x == 2; // force break\n"
11071 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011072 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
11073 " int iiiiiiiiiiii) {\n"
11074 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
11075 "});",
11076 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011077 verifyFormat("SomeFunction({[&] {\n"
11078 " // comment\n"
11079 " },\n"
11080 " [&] {\n"
11081 " // comment\n"
11082 " }});");
11083 verifyFormat("SomeFunction({[&] {\n"
11084 " // comment\n"
11085 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011086 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11087 " [&]() { return true; },\n"
11088 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011089
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011090 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011091 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011092 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011093 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11094 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011095 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011096 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011097 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11098 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011099 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011100 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11101 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011102 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011103 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011104 verifyFormat(
11105 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11106 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11107 " return aaaaaaaaaaaaaaaaa;\n"
11108 " });",
11109 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011110 verifyFormat("[]() //\n"
11111 " -> int {\n"
11112 " return 1; //\n"
11113 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011114
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011115 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011116 verifyFormat("SomeFunction(\n"
11117 " []() {\n"
11118 " int i = 42;\n"
11119 " return i;\n"
11120 " },\n"
11121 " []() {\n"
11122 " int j = 43;\n"
11123 " return j;\n"
11124 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011125
Daniel Jasperda18fd82014-06-10 06:39:03 +000011126 // More complex introducers.
11127 verifyFormat("return [i, args...] {};");
11128
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011129 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011130 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011131 verifyFormat("double &operator[](int i) { return 0; }\n"
11132 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011133 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011134 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011135 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011136
11137 // Other corner cases.
11138 verifyFormat("void f() {\n"
11139 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
11140 " );\n"
11141 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011142
11143 // Lambdas created through weird macros.
11144 verifyFormat("void f() {\n"
11145 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011146 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011147 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011148
11149 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11150 " doo_dah();\n"
11151 " doo_dah();\n"
11152 " })) {\n"
11153 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011154 verifyFormat("auto lambda = []() {\n"
11155 " int a = 2\n"
11156 "#if A\n"
11157 " + 2\n"
11158 "#endif\n"
11159 " ;\n"
11160 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011161}
11162
Manuel Klimek516e0542013-09-04 13:25:30 +000011163TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011164 FormatStyle ShortBlocks = getLLVMStyle();
11165 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11166 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11167 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11168 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11169 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11170 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11171 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011172
Daniel Jasper76284682014-10-22 09:12:44 +000011173 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11174 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11175 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011176
Daniel Jasper76284682014-10-22 09:12:44 +000011177 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011178 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011179 "}];");
11180 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011181 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011182 "}]};");
11183 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011184 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011185 "}];");
11186 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011187 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011188 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011189 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011190 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011191 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011192 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011193 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011194
11195 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011196 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011197 "}];",
11198 getLLVMStyleWithColumns(60));
11199 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011200 " NSString *path = [self sessionFilePath];\n"
11201 " if (path) {\n"
11202 " // ...\n"
11203 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011204 "});");
11205 verifyFormat("[[SessionService sharedService]\n"
11206 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011207 " if (window) {\n"
11208 " [self windowDidLoad:window];\n"
11209 " } else {\n"
11210 " [self errorLoadingWindow];\n"
11211 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011212 " }];");
11213 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011214 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011215 "};\n",
11216 getLLVMStyleWithColumns(40));
11217 verifyFormat("[[SessionService sharedService]\n"
11218 " loadWindowWithCompletionBlock: //\n"
11219 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011220 " if (window) {\n"
11221 " [self windowDidLoad:window];\n"
11222 " } else {\n"
11223 " [self errorLoadingWindow];\n"
11224 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011225 " }];",
11226 getLLVMStyleWithColumns(60));
11227 verifyFormat("[myObject doSomethingWith:arg1\n"
11228 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011229 " // ...\n"
11230 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011231 " }\n"
11232 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011233 " // ...\n"
11234 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011235 " }\n"
11236 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011237 " // ...\n"
11238 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011239 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011240 verifyFormat("[myObject doSomethingWith:arg1\n"
11241 " firstBlock:-1\n"
11242 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011243 " // ...\n"
11244 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011245 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011246
11247 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011248 " @autoreleasepool {\n"
11249 " if (a) {\n"
11250 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011251 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011252 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011253 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011254 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011255 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11256 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011257
11258 FormatStyle FourIndent = getLLVMStyle();
11259 FourIndent.ObjCBlockIndentWidth = 4;
11260 verifyFormat("[operation setCompletionBlock:^{\n"
11261 " [self onOperationDone];\n"
11262 "}];",
11263 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011264}
11265
Daniel Jasper289afc02015-04-23 09:23:17 +000011266TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11267 FormatStyle ZeroColumn = getLLVMStyle();
11268 ZeroColumn.ColumnLimit = 0;
11269
11270 verifyFormat("[[SessionService sharedService] "
11271 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11272 " if (window) {\n"
11273 " [self windowDidLoad:window];\n"
11274 " } else {\n"
11275 " [self errorLoadingWindow];\n"
11276 " }\n"
11277 "}];",
11278 ZeroColumn);
11279 EXPECT_EQ("[[SessionService sharedService]\n"
11280 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11281 " if (window) {\n"
11282 " [self windowDidLoad:window];\n"
11283 " } else {\n"
11284 " [self errorLoadingWindow];\n"
11285 " }\n"
11286 " }];",
11287 format("[[SessionService sharedService]\n"
11288 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11289 " if (window) {\n"
11290 " [self windowDidLoad:window];\n"
11291 " } else {\n"
11292 " [self errorLoadingWindow];\n"
11293 " }\n"
11294 "}];",
11295 ZeroColumn));
11296 verifyFormat("[myObject doSomethingWith:arg1\n"
11297 " firstBlock:^(Foo *a) {\n"
11298 " // ...\n"
11299 " int i;\n"
11300 " }\n"
11301 " secondBlock:^(Bar *b) {\n"
11302 " // ...\n"
11303 " int i;\n"
11304 " }\n"
11305 " thirdBlock:^Foo(Bar *b) {\n"
11306 " // ...\n"
11307 " int i;\n"
11308 " }];",
11309 ZeroColumn);
11310 verifyFormat("f(^{\n"
11311 " @autoreleasepool {\n"
11312 " if (a) {\n"
11313 " g();\n"
11314 " }\n"
11315 " }\n"
11316 "});",
11317 ZeroColumn);
11318 verifyFormat("void (^largeBlock)(void) = ^{\n"
11319 " // ...\n"
11320 "};",
11321 ZeroColumn);
11322
11323 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11324 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011325 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011326 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11327 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11328 " int i;\n"
11329 "};",
11330 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11331}
11332
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011333TEST_F(FormatTest, SupportsCRLF) {
11334 EXPECT_EQ("int a;\r\n"
11335 "int b;\r\n"
11336 "int c;\r\n",
11337 format("int a;\r\n"
11338 " int b;\r\n"
11339 " int c;\r\n",
11340 getLLVMStyle()));
11341 EXPECT_EQ("int a;\r\n"
11342 "int b;\r\n"
11343 "int c;\r\n",
11344 format("int a;\r\n"
11345 " int b;\n"
11346 " int c;\r\n",
11347 getLLVMStyle()));
11348 EXPECT_EQ("int a;\n"
11349 "int b;\n"
11350 "int c;\n",
11351 format("int a;\r\n"
11352 " int b;\n"
11353 " int c;\n",
11354 getLLVMStyle()));
11355 EXPECT_EQ("\"aaaaaaa \"\r\n"
11356 "\"bbbbbbb\";\r\n",
11357 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11358 EXPECT_EQ("#define A \\\r\n"
11359 " b; \\\r\n"
11360 " c; \\\r\n"
11361 " d;\r\n",
11362 format("#define A \\\r\n"
11363 " b; \\\r\n"
11364 " c; d; \r\n",
11365 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011366
11367 EXPECT_EQ("/*\r\n"
11368 "multi line block comments\r\n"
11369 "should not introduce\r\n"
11370 "an extra carriage return\r\n"
11371 "*/\r\n",
11372 format("/*\r\n"
11373 "multi line block comments\r\n"
11374 "should not introduce\r\n"
11375 "an extra carriage return\r\n"
11376 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011377}
11378
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011379TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11380 verifyFormat("MY_CLASS(C) {\n"
11381 " int i;\n"
11382 " int j;\n"
11383 "};");
11384}
11385
Daniel Jasper6633ab82013-10-18 10:38:14 +000011386TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11387 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11388 TwoIndent.ContinuationIndentWidth = 2;
11389
11390 EXPECT_EQ("int i =\n"
11391 " longFunction(\n"
11392 " arg);",
11393 format("int i = longFunction(arg);", TwoIndent));
11394
11395 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11396 SixIndent.ContinuationIndentWidth = 6;
11397
11398 EXPECT_EQ("int i =\n"
11399 " longFunction(\n"
11400 " arg);",
11401 format("int i = longFunction(arg);", SixIndent));
11402}
11403
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011404TEST_F(FormatTest, SpacesInAngles) {
11405 FormatStyle Spaces = getLLVMStyle();
11406 Spaces.SpacesInAngles = true;
11407
11408 verifyFormat("static_cast< int >(arg);", Spaces);
11409 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11410 verifyFormat("f< int, float >();", Spaces);
11411 verifyFormat("template <> g() {}", Spaces);
11412 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011413 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11414 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11415 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011416
11417 Spaces.Standard = FormatStyle::LS_Cpp03;
11418 Spaces.SpacesInAngles = true;
11419 verifyFormat("A< A< int > >();", Spaces);
11420
11421 Spaces.SpacesInAngles = false;
11422 verifyFormat("A<A<int> >();", Spaces);
11423
11424 Spaces.Standard = FormatStyle::LS_Cpp11;
11425 Spaces.SpacesInAngles = true;
11426 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011427
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011428 Spaces.SpacesInAngles = false;
11429 verifyFormat("A<A<int>>();", Spaces);
11430}
11431
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011432TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11433 FormatStyle Style = getLLVMStyle();
11434 Style.SpaceAfterTemplateKeyword = false;
11435 verifyFormat("template<int> void foo();", Style);
11436}
11437
Jacques Pienaarfc275112015-02-18 23:48:37 +000011438TEST_F(FormatTest, TripleAngleBrackets) {
11439 verifyFormat("f<<<1, 1>>>();");
11440 verifyFormat("f<<<1, 1, 1, s>>>();");
11441 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011442 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011443 verifyFormat("f<param><<<1, 1>>>();");
11444 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011445 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011446 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11447 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011448 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11449 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011450}
11451
11452TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011453 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011454 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011455 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11456 "aaallvm::outs() <<");
11457 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11458 "aaaallvm::outs()\n <<");
11459}
11460
Manuel Klimek819788d2014-03-18 11:22:45 +000011461TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11462 std::string code = "#if A\n"
11463 "#if B\n"
11464 "a.\n"
11465 "#endif\n"
11466 " a = 1;\n"
11467 "#else\n"
11468 "#endif\n"
11469 "#if C\n"
11470 "#else\n"
11471 "#endif\n";
11472 EXPECT_EQ(code, format(code));
11473}
11474
Manuel Klimek68b03042014-04-14 09:14:11 +000011475TEST_F(FormatTest, HandleConflictMarkers) {
11476 // Git/SVN conflict markers.
11477 EXPECT_EQ("int a;\n"
11478 "void f() {\n"
11479 " callme(some(parameter1,\n"
11480 "<<<<<<< text by the vcs\n"
11481 " parameter2),\n"
11482 "||||||| text by the vcs\n"
11483 " parameter2),\n"
11484 " parameter3,\n"
11485 "======= text by the vcs\n"
11486 " parameter2, parameter3),\n"
11487 ">>>>>>> text by the vcs\n"
11488 " otherparameter);\n",
11489 format("int a;\n"
11490 "void f() {\n"
11491 " callme(some(parameter1,\n"
11492 "<<<<<<< text by the vcs\n"
11493 " parameter2),\n"
11494 "||||||| text by the vcs\n"
11495 " parameter2),\n"
11496 " parameter3,\n"
11497 "======= text by the vcs\n"
11498 " parameter2,\n"
11499 " parameter3),\n"
11500 ">>>>>>> text by the vcs\n"
11501 " otherparameter);\n"));
11502
11503 // Perforce markers.
11504 EXPECT_EQ("void f() {\n"
11505 " function(\n"
11506 ">>>> text by the vcs\n"
11507 " parameter,\n"
11508 "==== text by the vcs\n"
11509 " parameter,\n"
11510 "==== text by the vcs\n"
11511 " parameter,\n"
11512 "<<<< text by the vcs\n"
11513 " parameter);\n",
11514 format("void f() {\n"
11515 " function(\n"
11516 ">>>> text by the vcs\n"
11517 " parameter,\n"
11518 "==== text by the vcs\n"
11519 " parameter,\n"
11520 "==== text by the vcs\n"
11521 " parameter,\n"
11522 "<<<< text by the vcs\n"
11523 " parameter);\n"));
11524
11525 EXPECT_EQ("<<<<<<<\n"
11526 "|||||||\n"
11527 "=======\n"
11528 ">>>>>>>",
11529 format("<<<<<<<\n"
11530 "|||||||\n"
11531 "=======\n"
11532 ">>>>>>>"));
11533
11534 EXPECT_EQ("<<<<<<<\n"
11535 "|||||||\n"
11536 "int i;\n"
11537 "=======\n"
11538 ">>>>>>>",
11539 format("<<<<<<<\n"
11540 "|||||||\n"
11541 "int i;\n"
11542 "=======\n"
11543 ">>>>>>>"));
11544
11545 // FIXME: Handle parsing of macros around conflict markers correctly:
11546 EXPECT_EQ("#define Macro \\\n"
11547 "<<<<<<<\n"
11548 "Something \\\n"
11549 "|||||||\n"
11550 "Else \\\n"
11551 "=======\n"
11552 "Other \\\n"
11553 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011554 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011555 format("#define Macro \\\n"
11556 "<<<<<<<\n"
11557 " Something \\\n"
11558 "|||||||\n"
11559 " Else \\\n"
11560 "=======\n"
11561 " Other \\\n"
11562 ">>>>>>>\n"
11563 " End\n"
11564 "int i;\n"));
11565}
11566
Daniel Jasper471894432014-08-06 13:40:26 +000011567TEST_F(FormatTest, DisableRegions) {
11568 EXPECT_EQ("int i;\n"
11569 "// clang-format off\n"
11570 " int j;\n"
11571 "// clang-format on\n"
11572 "int k;",
11573 format(" int i;\n"
11574 " // clang-format off\n"
11575 " int j;\n"
11576 " // clang-format on\n"
11577 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011578 EXPECT_EQ("int i;\n"
11579 "/* clang-format off */\n"
11580 " int j;\n"
11581 "/* clang-format on */\n"
11582 "int k;",
11583 format(" int i;\n"
11584 " /* clang-format off */\n"
11585 " int j;\n"
11586 " /* clang-format on */\n"
11587 " int k;"));
Daniel Jasper471894432014-08-06 13:40:26 +000011588}
11589
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011590TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11591 format("? ) =");
11592 verifyNoCrash("#define a\\\n /**/}");
11593}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011594
Daniel Jasper498f5582015-12-25 08:53:31 +000011595TEST_F(FormatTest, FormatsTableGenCode) {
11596 FormatStyle Style = getLLVMStyle();
11597 Style.Language = FormatStyle::LK_TableGen;
11598 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11599}
11600
Nico Weberb2673a12016-11-10 21:49:25 +000011601TEST_F(FormatTest, ArrayOfTemplates) {
11602 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11603 format("auto a = new unique_ptr<int > [ 10];"));
11604
11605 FormatStyle Spaces = getLLVMStyle();
11606 Spaces.SpacesInSquareBrackets = true;
11607 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11608 format("auto a = new unique_ptr<int > [10];", Spaces));
11609}
11610
11611TEST_F(FormatTest, ArrayAsTemplateType) {
11612 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11613 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11614
11615 FormatStyle Spaces = getLLVMStyle();
11616 Spaces.SpacesInSquareBrackets = true;
11617 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11618 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11619}
11620
Eric Liu547d8792016-03-24 13:22:42 +000011621// Since this test case uses UNIX-style file path. We disable it for MS
11622// compiler.
Eric Liuc13ca6a2016-03-24 14:59:39 +000011623#if !defined(_MSC_VER) && !defined(__MINGW32__)
Eric Liu547d8792016-03-24 13:22:42 +000011624
11625TEST(FormatStyle, GetStyleOfFile) {
11626 vfs::InMemoryFileSystem FS;
11627 // Test 1: format file in the same directory.
11628 ASSERT_TRUE(
11629 FS.addFile("/a/.clang-format", 0,
11630 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11631 ASSERT_TRUE(
11632 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11633 auto Style1 = getStyle("file", "/a/.clang-format", "Google", &FS);
11634 ASSERT_EQ(Style1, getLLVMStyle());
11635
11636 // Test 2: fallback to default.
11637 ASSERT_TRUE(
11638 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11639 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", &FS);
11640 ASSERT_EQ(Style2, getMozillaStyle());
11641
11642 // Test 3: format file in parent directory.
11643 ASSERT_TRUE(
11644 FS.addFile("/c/.clang-format", 0,
11645 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11646 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11647 llvm::MemoryBuffer::getMemBuffer("int i;")));
11648 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", &FS);
11649 ASSERT_EQ(Style3, getGoogleStyle());
11650}
11651
11652#endif // _MSC_VER
11653
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011654TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11655 // Column limit is 20.
11656 std::string Code = "Type *a =\n"
11657 " new Type();\n"
11658 "g(iiiii, 0, jjjjj,\n"
11659 " 0, kkkkk, 0, mm);\n"
11660 "int bad = format ;";
11661 std::string Expected = "auto a = new Type();\n"
11662 "g(iiiii, nullptr,\n"
11663 " jjjjj, nullptr,\n"
11664 " kkkkk, nullptr,\n"
11665 " mm);\n"
11666 "int bad = format ;";
11667 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011668 tooling::Replacements Replaces = toReplacements(
11669 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11670 "auto "),
11671 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11672 "nullptr"),
11673 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11674 "nullptr"),
11675 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11676 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011677
11678 format::FormatStyle Style = format::getLLVMStyle();
11679 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011680 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11681 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11682 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11683 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11684 EXPECT_TRUE(static_cast<bool>(Result));
11685 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011686}
11687
Eric Liubaf58c22016-05-18 13:43:48 +000011688TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11689 std::string Code = "#include \"a.h\"\n"
11690 "#include \"c.h\"\n"
11691 "\n"
11692 "int main() {\n"
11693 " return 0;\n"
11694 "}";
11695 std::string Expected = "#include \"a.h\"\n"
11696 "#include \"b.h\"\n"
11697 "#include \"c.h\"\n"
11698 "\n"
11699 "int main() {\n"
11700 " return 0;\n"
11701 "}";
11702 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011703 tooling::Replacements Replaces = toReplacements(
11704 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11705 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011706
11707 format::FormatStyle Style = format::getLLVMStyle();
11708 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011709 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11710 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11711 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11712 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11713 EXPECT_TRUE(static_cast<bool>(Result));
11714 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011715}
11716
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011717TEST_F(FormatTest, AllignTrailingComments) {
11718 EXPECT_EQ("#define MACRO(V) \\\n"
11719 " V(Rt2) /* one more char */ \\\n"
11720 " V(Rs) /* than here */ \\\n"
11721 "/* comment 3 */\n",
11722 format("#define MACRO(V)\\\n"
11723 "V(Rt2) /* one more char */ \\\n"
11724 "V(Rs) /* than here */ \\\n"
11725 "/* comment 3 */ \\\n",
11726 getLLVMStyleWithColumns(40)));
11727}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011728} // end namespace
11729} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011730} // end namespace clang