blob: 7497cabba4895e6db8e5b25fc8f31a700c0a85b4 [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//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000869// Tests for classes, namespaces, etc.
870//===----------------------------------------------------------------------===//
871
872TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000873 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000874}
875
876TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
877 verifyFormat("class A {\n"
878 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +0000879 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000880 "protected:\n"
881 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000882 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000883 "};");
884 verifyGoogleFormat("class A {\n"
885 " public:\n"
886 " protected:\n"
887 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000888 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000889 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +0000890 verifyFormat("class A {\n"
891 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000892 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +0000893 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000894 " void f2() {}\n"
895 "protected slots:\n"
896 " void f3() {}\n"
897 "protected Q_SLOTS:\n"
898 " void f4() {}\n"
899 "private slots:\n"
900 " void f5() {}\n"
901 "private Q_SLOTS:\n"
902 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +0000903 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000904 " void g1();\n"
905 "Q_SIGNALS:\n"
906 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +0000907 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +0000908
909 // Don't interpret 'signals' the wrong way.
910 verifyFormat("signals.set();");
911 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +0000912 verifyFormat("{\n"
913 " signals.set(); // This needs indentation.\n"
914 "}");
Daniel Jasper31343832016-07-27 10:13:24 +0000915 verifyFormat("void f() {\n"
916 "label:\n"
917 " signals.baz();\n"
918 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000919}
920
Alexander Kornienkofd433362013-03-27 17:08:02 +0000921TEST_F(FormatTest, SeparatesLogicalBlocks) {
922 EXPECT_EQ("class A {\n"
923 "public:\n"
924 " void f();\n"
925 "\n"
926 "private:\n"
927 " void g() {}\n"
928 " // test\n"
929 "protected:\n"
930 " int h;\n"
931 "};",
932 format("class A {\n"
933 "public:\n"
934 "void f();\n"
935 "private:\n"
936 "void g() {}\n"
937 "// test\n"
938 "protected:\n"
939 "int h;\n"
940 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +0000941 EXPECT_EQ("class A {\n"
942 "protected:\n"
943 "public:\n"
944 " void f();\n"
945 "};",
946 format("class A {\n"
947 "protected:\n"
948 "\n"
949 "public:\n"
950 "\n"
951 " void f();\n"
952 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +0000953
954 // Even ensure proper spacing inside macros.
955 EXPECT_EQ("#define B \\\n"
956 " class A { \\\n"
957 " protected: \\\n"
958 " public: \\\n"
959 " void f(); \\\n"
960 " };",
961 format("#define B \\\n"
962 " class A { \\\n"
963 " protected: \\\n"
964 " \\\n"
965 " public: \\\n"
966 " \\\n"
967 " void f(); \\\n"
968 " };",
969 getGoogleStyle()));
970 // But don't remove empty lines after macros ending in access specifiers.
971 EXPECT_EQ("#define A private:\n"
972 "\n"
973 "int i;",
974 format("#define A private:\n"
975 "\n"
976 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +0000977}
978
Daniel Jasper83193602013-04-05 17:22:09 +0000979TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000980 verifyFormat("class A : public B {};");
981 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +0000982
983 verifyFormat(
984 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000985 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +0000986 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
987 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000988 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +0000989 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000990 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +0000991 verifyFormat("class AAAAAAAAAAAA : public B,\n"
992 " public C,\n"
993 " public D,\n"
994 " public E,\n"
995 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000996 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +0000997
998 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000999 " ReallyReallyLongClassName {\n"
1000 " int i;\n"
1001 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001002 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001003 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1004 " aaaaaaaaaaaaaaaa> {};");
1005 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1006 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1007 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001008 verifyFormat("template <class R, class C>\n"
1009 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1010 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001011 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001012}
1013
Manuel Klimek28cacc72013-01-07 18:10:23 +00001014TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001015 verifyFormat("class A {\n} a, b;");
1016 verifyFormat("struct A {\n} a, b;");
1017 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001018}
1019
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001020TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001021 verifyFormat("enum {\n"
1022 " Zero,\n"
1023 " One = 1,\n"
1024 " Two = One + 1,\n"
1025 " Three = (One + Two),\n"
1026 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1027 " Five = (One, Two, Three, Four, 5)\n"
1028 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001029 verifyGoogleFormat("enum {\n"
1030 " Zero,\n"
1031 " One = 1,\n"
1032 " Two = One + 1,\n"
1033 " Three = (One + Two),\n"
1034 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1035 " Five = (One, Two, Three, Four, 5)\n"
1036 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001037 verifyFormat("enum Enum {};");
1038 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001039 verifyFormat("enum X E {} d;");
1040 verifyFormat("enum __attribute__((...)) E {} d;");
1041 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001042 verifyFormat("enum {\n"
1043 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001044 "};",
1045 getLLVMStyleWithColumns(30));
1046
1047 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001048 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001049
1050 EXPECT_EQ("enum KeepEmptyLines {\n"
1051 " ONE,\n"
1052 "\n"
1053 " TWO,\n"
1054 "\n"
1055 " THREE\n"
1056 "}",
1057 format("enum KeepEmptyLines {\n"
1058 " ONE,\n"
1059 "\n"
1060 " TWO,\n"
1061 "\n"
1062 "\n"
1063 " THREE\n"
1064 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001065 verifyFormat("enum E { // comment\n"
1066 " ONE,\n"
1067 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001068 "};\n"
1069 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001070 // Not enums.
1071 verifyFormat("enum X f() {\n"
1072 " a();\n"
1073 " return 42;\n"
1074 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001075 verifyFormat("enum X Type::f() {\n"
1076 " a();\n"
1077 " return 42;\n"
1078 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001079 verifyFormat("enum ::X f() {\n"
1080 " a();\n"
1081 " return 42;\n"
1082 "}");
1083 verifyFormat("enum ns::X f() {\n"
1084 " a();\n"
1085 " return 42;\n"
1086 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001087}
1088
Daniel Jasperb7150872013-08-30 10:10:19 +00001089TEST_F(FormatTest, FormatsEnumsWithErrors) {
1090 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001091 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001092 " Two = 1;\n"
1093 "};");
1094 verifyFormat("namespace n {\n"
1095 "enum Type {\n"
1096 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001097 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001098 " int i;\n"
1099 "}\n"
1100 "void g() {}");
1101}
1102
Daniel Jasper2b41a822013-08-20 12:42:50 +00001103TEST_F(FormatTest, FormatsEnumStruct) {
1104 verifyFormat("enum struct {\n"
1105 " Zero,\n"
1106 " One = 1,\n"
1107 " Two = One + 1,\n"
1108 " Three = (One + Two),\n"
1109 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1110 " Five = (One, Two, Three, Four, 5)\n"
1111 "};");
1112 verifyFormat("enum struct Enum {};");
1113 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001114 verifyFormat("enum struct X E {} d;");
1115 verifyFormat("enum struct __attribute__((...)) E {} d;");
1116 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001117 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1118}
1119
1120TEST_F(FormatTest, FormatsEnumClass) {
1121 verifyFormat("enum class {\n"
1122 " Zero,\n"
1123 " One = 1,\n"
1124 " Two = One + 1,\n"
1125 " Three = (One + Two),\n"
1126 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1127 " Five = (One, Two, Three, Four, 5)\n"
1128 "};");
1129 verifyFormat("enum class Enum {};");
1130 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001131 verifyFormat("enum class X E {} d;");
1132 verifyFormat("enum class __attribute__((...)) E {} d;");
1133 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001134 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1135}
1136
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001137TEST_F(FormatTest, FormatsEnumTypes) {
1138 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001139 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001140 " B\n"
1141 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001142 verifyFormat("enum X : int { A, B };");
1143 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001144}
1145
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001146TEST_F(FormatTest, FormatsNSEnums) {
1147 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1148 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1149 " // Information about someDecentlyLongValue.\n"
1150 " someDecentlyLongValue,\n"
1151 " // Information about anotherDecentlyLongValue.\n"
1152 " anotherDecentlyLongValue,\n"
1153 " // Information about aThirdDecentlyLongValue.\n"
1154 " aThirdDecentlyLongValue\n"
1155 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001156 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1157 " a = 1,\n"
1158 " b = 2,\n"
1159 " c = 3,\n"
1160 "};");
1161 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1162 " a = 1,\n"
1163 " b = 2,\n"
1164 " c = 3,\n"
1165 "};");
1166 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1167 " a = 1,\n"
1168 " b = 2,\n"
1169 " c = 3,\n"
1170 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001171}
1172
Nico Weber7769a902013-01-14 05:49:49 +00001173TEST_F(FormatTest, FormatsBitfields) {
1174 verifyFormat("struct Bitfields {\n"
1175 " unsigned sClass : 8;\n"
1176 " unsigned ValueKind : 2;\n"
1177 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001178 verifyFormat("struct A {\n"
1179 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1180 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1181 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001182 verifyFormat("struct MyStruct {\n"
1183 " uchar data;\n"
1184 " uchar : 8;\n"
1185 " uchar : 8;\n"
1186 " uchar other;\n"
1187 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001188}
1189
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001190TEST_F(FormatTest, FormatsNamespaces) {
1191 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001192 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001193 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001194 "}");
1195 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001196 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001197 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001198 "}");
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001199 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001200 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001201 "void f() { f(); }\n"
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001202 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001203 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001204 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001205 "void f() { f(); }");
Manuel Klimek046b9302013-02-06 16:08:09 +00001206
1207 // This code is more common than we thought; if we
1208 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001209 // its own line, which is undesirable.
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001210 verifyFormat("namespace {};");
Manuel Klimek046b9302013-02-06 16:08:09 +00001211 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001212 "class A {};\n"
Manuel Klimek046b9302013-02-06 16:08:09 +00001213 "};");
Daniel Jasper251b3c92013-07-01 11:22:57 +00001214
1215 verifyFormat("namespace {\n"
1216 "int SomeVariable = 0; // comment\n"
1217 "} // namespace");
1218 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1219 "#define HEADER_GUARD\n"
1220 "namespace my_namespace {\n"
1221 "int i;\n"
1222 "} // my_namespace\n"
1223 "#endif // HEADER_GUARD",
1224 format("#ifndef HEADER_GUARD\n"
1225 " #define HEADER_GUARD\n"
1226 " namespace my_namespace {\n"
1227 "int i;\n"
1228 "} // my_namespace\n"
1229 "#endif // HEADER_GUARD"));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001230
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001231 EXPECT_EQ("namespace A::B {\n"
1232 "class C {};\n"
1233 "}",
1234 format("namespace A::B {\n"
1235 "class C {};\n"
1236 "}"));
1237
Daniel Jasper65ee3472013-07-31 23:16:02 +00001238 FormatStyle Style = getLLVMStyle();
1239 Style.NamespaceIndentation = FormatStyle::NI_All;
1240 EXPECT_EQ("namespace out {\n"
1241 " int i;\n"
1242 " namespace in {\n"
1243 " int i;\n"
1244 " } // namespace\n"
1245 "} // namespace",
1246 format("namespace out {\n"
1247 "int i;\n"
1248 "namespace in {\n"
1249 "int i;\n"
1250 "} // namespace\n"
1251 "} // namespace",
1252 Style));
1253
1254 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1255 EXPECT_EQ("namespace out {\n"
1256 "int i;\n"
1257 "namespace in {\n"
1258 " int i;\n"
1259 "} // namespace\n"
1260 "} // namespace",
1261 format("namespace out {\n"
1262 "int i;\n"
1263 "namespace in {\n"
1264 "int i;\n"
1265 "} // namespace\n"
1266 "} // namespace",
1267 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001268}
1269
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001270TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00001271
Daniel Jasper40aacf42013-03-14 13:45:21 +00001272TEST_F(FormatTest, FormatsInlineASM) {
1273 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001274 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001275 verifyFormat(
1276 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1277 " \"cpuid\\n\\t\"\n"
1278 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001279 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001280 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001281 EXPECT_EQ(
1282 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001283 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001284 " mov edx,[that] // vtable in edx\n"
1285 " mov eax,methodIndex\n"
1286 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001287 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001288 "}",
1289 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1290 " __asm {\n"
1291 " mov edx,[that] // vtable in edx\n"
1292 " mov eax,methodIndex\n"
1293 " call [edx][eax*4] // stdcall\n"
1294 " }\n"
1295 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001296 EXPECT_EQ("_asm {\n"
1297 " xor eax, eax;\n"
1298 " cpuid;\n"
1299 "}",
1300 format("_asm {\n"
1301 " xor eax, eax;\n"
1302 " cpuid;\n"
1303 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001304 verifyFormat("void function() {\n"
1305 " // comment\n"
1306 " asm(\"\");\n"
1307 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001308 EXPECT_EQ("__asm {\n"
1309 "}\n"
1310 "int i;",
1311 format("__asm {\n"
1312 "}\n"
1313 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001314}
1315
Nico Weberd5650bd2013-01-07 16:36:17 +00001316TEST_F(FormatTest, FormatTryCatch) {
1317 verifyFormat("try {\n"
1318 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001319 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001320 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001321 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001322 " exit(42);\n"
1323 "}");
1324
1325 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001326 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001327 " return 5;\n"
1328 "}");
1329 verifyFormat("class A {\n"
1330 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001331 " A() try : a(0) {\n"
1332 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001333 " throw;\n"
1334 " }\n"
1335 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001336
1337 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001338 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001339}
1340
Nico Weberfac23712015-02-04 15:26:27 +00001341TEST_F(FormatTest, FormatSEHTryCatch) {
1342 verifyFormat("__try {\n"
1343 " int a = b * c;\n"
1344 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1345 " // Do nothing.\n"
1346 "}");
1347
1348 verifyFormat("__try {\n"
1349 " int a = b * c;\n"
1350 "} __finally {\n"
1351 " // Do nothing.\n"
1352 "}");
1353
1354 verifyFormat("DEBUG({\n"
1355 " __try {\n"
1356 " } __finally {\n"
1357 " }\n"
1358 "});\n");
1359}
1360
Daniel Jasper04a71a42014-05-08 11:58:24 +00001361TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1362 verifyFormat("try {\n"
1363 " f();\n"
1364 "} catch {\n"
1365 " g();\n"
1366 "}");
1367 verifyFormat("try {\n"
1368 " f();\n"
1369 "} catch (A a) MACRO(x) {\n"
1370 " g();\n"
1371 "} catch (B b) MACRO(x) {\n"
1372 " g();\n"
1373 "}");
1374}
1375
1376TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1377 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001378 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1379 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001380 Style.BreakBeforeBraces = BraceStyle;
1381 verifyFormat("try {\n"
1382 " // something\n"
1383 "} catch (...) {\n"
1384 " // something\n"
1385 "}",
1386 Style);
1387 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001388 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1389 verifyFormat("try {\n"
1390 " // something\n"
1391 "}\n"
1392 "catch (...) {\n"
1393 " // something\n"
1394 "}",
1395 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001396 verifyFormat("__try {\n"
1397 " // something\n"
1398 "}\n"
1399 "__finally {\n"
1400 " // something\n"
1401 "}",
1402 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001403 verifyFormat("@try {\n"
1404 " // something\n"
1405 "}\n"
1406 "@finally {\n"
1407 " // something\n"
1408 "}",
1409 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001410 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1411 verifyFormat("try\n"
1412 "{\n"
1413 " // something\n"
1414 "}\n"
1415 "catch (...)\n"
1416 "{\n"
1417 " // something\n"
1418 "}",
1419 Style);
1420 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1421 verifyFormat("try\n"
1422 " {\n"
1423 " // something\n"
1424 " }\n"
1425 "catch (...)\n"
1426 " {\n"
1427 " // something\n"
1428 " }",
1429 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001430 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1431 Style.BraceWrapping.BeforeCatch = true;
1432 verifyFormat("try {\n"
1433 " // something\n"
1434 "}\n"
1435 "catch (...) {\n"
1436 " // something\n"
1437 "}",
1438 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001439}
1440
Daniel Jaspere25509f2012-12-17 11:29:41 +00001441TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001442 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001443
Daniel Jaspera44991332015-04-29 13:06:49 +00001444 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1445 " 100000000, "
1446 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001447
Daniel Jasper473c62c2013-05-17 09:35:01 +00001448 // Here, everything other than the "}" would fit on a line.
1449 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001450 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001451 EXPECT_EQ("S s = {a,\n"
1452 "\n"
1453 " b};",
1454 format("S s = {\n"
1455 " a,\n"
1456 "\n"
1457 " b\n"
1458 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001459
1460 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1461 // line. However, the formatting looks a bit off and this probably doesn't
1462 // happen often in practice.
1463 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001464 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001465 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001466}
1467
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001468TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001469 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1470 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1471 " .bbbbbbbbbb = 2,\n"
1472 " .cccccccccc = 3,\n"
1473 " .dddddddddd = 4,\n"
1474 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001475 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001476 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1477 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1478 " .ccccccccccccccccccccccccccc = 3,\n"
1479 " .ddddddddddddddddddddddddddd = 4,\n"
1480 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001481
1482 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
1483}
1484
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001485TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001486 verifyFormat("static A x = {{{}}};\n");
1487 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
1488 " {init1, init2, init3, init4}}};",
1489 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00001490
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001491 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001492 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1493 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1494 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
1495 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00001496 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001497 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1498 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1499 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00001500 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
1501 " {rect.fRight - rect.fLeft, rect.fBottom - "
1502 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001503
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001504 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001505 "SomeArrayOfSomeType a = {\n"
1506 " {{1, 2, 3},\n"
1507 " {1, 2, 3},\n"
1508 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
1509 " 333333333333333333333333333333},\n"
1510 " {1, 2, 3},\n"
1511 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00001512 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00001513 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001514 " {{1, 2, 3}},\n"
1515 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001516 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
1517 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001518 " {{1, 2, 3}},\n"
1519 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001520
Daniel Jaspera44991332015-04-29 13:06:49 +00001521 verifyFormat("struct {\n"
1522 " unsigned bit;\n"
1523 " const char *const name;\n"
1524 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
1525 " {kOsWin, \"Windows\"},\n"
1526 " {kOsLinux, \"Linux\"},\n"
1527 " {kOsCrOS, \"Chrome OS\"}};");
1528 verifyFormat("struct {\n"
1529 " unsigned bit;\n"
1530 " const char *const name;\n"
1531 "} kBitsToOs[] = {\n"
1532 " {kOsMac, \"Mac\"},\n"
1533 " {kOsWin, \"Windows\"},\n"
1534 " {kOsLinux, \"Linux\"},\n"
1535 " {kOsCrOS, \"Chrome OS\"},\n"
1536 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001537}
1538
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001539TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
1540 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1541 " \\\n"
1542 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
1543}
1544
Daniel Jasperda16db32013-01-07 10:48:50 +00001545TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001546 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
1547 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00001548
1549 // Do break defaulted and deleted functions.
1550 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1551 " default;",
1552 getLLVMStyleWithColumns(40));
1553 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1554 " delete;",
1555 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001556}
1557
1558TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
1559 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
1560 getLLVMStyleWithColumns(40));
1561 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1562 getLLVMStyleWithColumns(40));
1563 EXPECT_EQ("#define Q \\\n"
1564 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
1565 " \"aaaaaaaa.cpp\"",
1566 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1567 getLLVMStyleWithColumns(40)));
1568}
1569
1570TEST_F(FormatTest, UnderstandsLinePPDirective) {
1571 EXPECT_EQ("# 123 \"A string literal\"",
1572 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00001573}
1574
Manuel Klimek591b5802013-01-31 15:58:48 +00001575TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00001576 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00001577 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001578}
1579
1580TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
1581 EXPECT_EQ("#line 42 \"test\"\n",
1582 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001583 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
1584 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001585}
1586
1587TEST_F(FormatTest, EndOfFileEndsPPDirective) {
1588 EXPECT_EQ("#line 42 \"test\"",
1589 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001590 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001591}
1592
Daniel Jasper877615c2013-10-11 19:45:02 +00001593TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
1594 verifyFormat("#define A \\x20");
1595 verifyFormat("#define A \\ x20");
1596 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
1597 verifyFormat("#define A ''");
1598 verifyFormat("#define A ''qqq");
1599 verifyFormat("#define A `qqq");
1600 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00001601 EXPECT_EQ("const char *c = STRINGIFY(\n"
1602 "\\na : b);",
1603 format("const char * c = STRINGIFY(\n"
1604 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00001605
1606 verifyFormat("a\r\\");
1607 verifyFormat("a\v\\");
1608 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00001609}
1610
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001611TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001612 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
1613 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001614 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001615 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00001616 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00001617
1618 verifyFormat("#define A A\n#define A A");
1619 verifyFormat("#define A(X) A\n#define A A");
1620
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001621 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
1622 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001623}
1624
1625TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001626 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001627 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001628 "#define A( \\\n"
1629 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001630 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001631 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001632 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001633 " #include \"a.h\"\n"
1634 "#define A(A,\\\n"
1635 " B)\n"
1636 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001637 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001638 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001639}
1640
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001641TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001642
1643TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
1644 EXPECT_EQ("#define A \\\n"
1645 " c; \\\n"
1646 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001647 "f;",
1648 format("#define A c; e;\n"
1649 "f;",
1650 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001651}
1652
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001653TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001654
Manuel Klimek1abf7892013-01-04 23:34:14 +00001655TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00001656 EXPECT_EQ("int x,\n"
1657 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001658 " y;",
1659 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001660}
1661
Manuel Klimek09e07972013-01-05 21:34:55 +00001662TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00001663 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00001664 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00001665 verifyFormat("#define A \\\n"
1666 " { \\\n"
1667 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001668 " }",
1669 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00001670
1671 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001672 " void function##X()",
1673 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00001674
1675 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001676 " void a##b##c()",
1677 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00001678
Daniel Jasper39825ea2013-01-14 15:40:57 +00001679 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00001680}
1681
Manuel Klimekd053c5b2013-01-23 14:37:36 +00001682TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00001683 EXPECT_EQ("#define A (x)", format("#define A (x)"));
1684 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00001685}
1686
Manuel Klimek0c137952013-02-11 12:33:24 +00001687TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
1688 EXPECT_EQ("#define A b;", format("#define A \\\n"
1689 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001690 " b;",
1691 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001692 EXPECT_EQ("#define A \\\n"
1693 " \\\n"
1694 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001695 " b;",
1696 format("#define A \\\n"
1697 " \\\n"
1698 " a; \\\n"
1699 " b;",
1700 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001701 EXPECT_EQ("#define A \\\n"
1702 " a; \\\n"
1703 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001704 " b;",
1705 format("#define A \\\n"
1706 " a; \\\n"
1707 " \\\n"
1708 " b;",
1709 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001710}
1711
Daniel Jasper00475962013-02-19 17:14:38 +00001712TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001713 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00001714 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00001715 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00001716 " case 2\n",
1717 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00001718 verifyFormat("#define MACRO(a) \\\n"
1719 " if (a) \\\n"
1720 " f(); \\\n"
1721 " else \\\n"
1722 " g()",
1723 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00001724 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001725 verifyIncompleteFormat("#define STR(x) #x\n"
1726 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00001727 verifyFormat("#pragma omp threadprivate( \\\n"
1728 " y)), // expected-warning",
1729 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00001730 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00001731 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001732 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00001733 "#define b \\\n"
1734 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001735 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00001736 "a",
1737 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00001738 verifyFormat("#define A \\\n"
1739 " { \\\n"
1740 " {\n"
1741 "#define B \\\n"
1742 " } \\\n"
1743 " }",
1744 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00001745 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00001746 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00001747 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00001748 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00001749}
1750
Daniel Jasper40e19212013-05-29 13:16:10 +00001751TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
1752 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
1753 EXPECT_EQ("class A : public QObject {\n"
1754 " Q_OBJECT\n"
1755 "\n"
1756 " A() {}\n"
1757 "};",
1758 format("class A : public QObject {\n"
1759 " Q_OBJECT\n"
1760 "\n"
1761 " A() {\n}\n"
1762 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00001763 EXPECT_EQ("MACRO\n"
1764 "/*static*/ int i;",
1765 format("MACRO\n"
1766 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00001767 EXPECT_EQ("SOME_MACRO\n"
1768 "namespace {\n"
1769 "void f();\n"
1770 "}",
1771 format("SOME_MACRO\n"
1772 " namespace {\n"
1773 "void f( );\n"
1774 "}"));
Daniel Jasper40e19212013-05-29 13:16:10 +00001775 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00001776 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
1777 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00001778 // Only if everything is upper case.
1779 EXPECT_EQ("class A : public QObject {\n"
1780 " Q_Object A() {}\n"
1781 "};",
1782 format("class A : public QObject {\n"
1783 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00001784 " A() {\n}\n"
1785 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00001786
1787 // Only if the next line can actually start an unwrapped line.
1788 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
1789 format("SOME_WEIRD_LOG_MACRO\n"
1790 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00001791
1792 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00001793 "(n, buffers))\n",
1794 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00001795}
1796
Alexander Kornienkode644272013-04-08 22:16:06 +00001797TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
1798 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
1799 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
1800 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001801 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00001802 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
1803 "int *createScopDetectionPass() { return 0; }",
1804 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
1805 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
1806 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
1807 " class X {};\n"
1808 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
1809 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001810 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
1811 // braces, so that inner block is indented one level more.
1812 EXPECT_EQ("int q() {\n"
1813 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
1814 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
1815 " IPC_END_MESSAGE_MAP()\n"
1816 "}",
1817 format("int q() {\n"
1818 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
1819 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
1820 " IPC_END_MESSAGE_MAP()\n"
1821 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00001822
Daniel Jasper352dae12014-01-03 11:50:46 +00001823 // Same inside macros.
1824 EXPECT_EQ("#define LIST(L) \\\n"
1825 " L(A) \\\n"
1826 " L(B) \\\n"
1827 " L(C)",
1828 format("#define LIST(L) \\\n"
1829 " L(A) \\\n"
1830 " L(B) \\\n"
1831 " L(C)",
1832 getGoogleStyle()));
1833
Daniel Jasper545c6522013-09-17 09:26:07 +00001834 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001835 EXPECT_EQ("int q() {\n"
1836 " f(x);\n"
1837 " f(x) {}\n"
1838 " f(x)->g();\n"
1839 " f(x)->*g();\n"
1840 " f(x).g();\n"
1841 " f(x) = x;\n"
1842 " f(x) += x;\n"
1843 " f(x) -= x;\n"
1844 " f(x) *= x;\n"
1845 " f(x) /= x;\n"
1846 " f(x) %= x;\n"
1847 " f(x) &= x;\n"
1848 " f(x) |= x;\n"
1849 " f(x) ^= x;\n"
1850 " f(x) >>= x;\n"
1851 " f(x) <<= x;\n"
1852 " f(x)[y].z();\n"
1853 " LOG(INFO) << x;\n"
1854 " ifstream(x) >> x;\n"
1855 "}\n",
1856 format("int q() {\n"
1857 " f(x)\n;\n"
1858 " f(x)\n {}\n"
1859 " f(x)\n->g();\n"
1860 " f(x)\n->*g();\n"
1861 " f(x)\n.g();\n"
1862 " f(x)\n = x;\n"
1863 " f(x)\n += x;\n"
1864 " f(x)\n -= x;\n"
1865 " f(x)\n *= x;\n"
1866 " f(x)\n /= x;\n"
1867 " f(x)\n %= x;\n"
1868 " f(x)\n &= x;\n"
1869 " f(x)\n |= x;\n"
1870 " f(x)\n ^= x;\n"
1871 " f(x)\n >>= x;\n"
1872 " f(x)\n <<= x;\n"
1873 " f(x)\n[y].z();\n"
1874 " LOG(INFO)\n << x;\n"
1875 " ifstream(x)\n >> x;\n"
1876 "}\n"));
1877 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001878 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001879 " if (1) {\n"
1880 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001881 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001882 " while (1) {\n"
1883 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001884 " F(x)\n"
1885 " G(x);\n"
1886 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001887 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001888 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001889 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001890 " }\n"
1891 "}\n",
1892 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001893 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001894 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001895 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001896 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001897 "F(x)\n"
1898 "G(x);\n"
1899 "F(x)\n"
1900 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001901 "}\n"));
1902 EXPECT_EQ("class A {\n"
1903 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00001904 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001905 " A(X x)\n" // FIXME: function-level try blocks are broken.
1906 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001907 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001908 " }\n"
1909 "};",
1910 format("class A {\n"
1911 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00001912 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001913 " A(X x)\n"
1914 " try : t(0) {} catch (...) {}\n"
1915 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00001916 EXPECT_EQ("class SomeClass {\n"
1917 "public:\n"
1918 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1919 "};",
1920 format("class SomeClass {\n"
1921 "public:\n"
1922 " SomeClass()\n"
1923 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1924 "};"));
1925 EXPECT_EQ("class SomeClass {\n"
1926 "public:\n"
1927 " SomeClass()\n"
1928 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1929 "};",
1930 format("class SomeClass {\n"
1931 "public:\n"
1932 " SomeClass()\n"
1933 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1934 "};",
1935 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00001936
1937 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00001938}
1939
Manuel Klimek4fe43002013-05-22 12:51:29 +00001940TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
1941 verifyFormat("#define A \\\n"
1942 " f({ \\\n"
1943 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001944 " });",
1945 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00001946}
1947
Manuel Klimekef2cfb12013-01-05 22:14:16 +00001948TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
1949 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
1950}
1951
Manuel Klimek52d0fd82013-01-05 22:56:06 +00001952TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001953 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00001954}
1955
Manuel Klimek1058d982013-01-06 20:07:31 +00001956TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
1957 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
1958 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
1959 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
1960 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
1961}
Manuel Klimek1abf7892013-01-04 23:34:14 +00001962
Daniel Jaspere2408e32015-05-06 11:16:43 +00001963TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00001964 EXPECT_EQ(
1965 "#define A \\\n int i; \\\n int j;",
1966 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00001967 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00001968 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00001969 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00001970 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00001971}
1972
Manuel Klimek38ba11e2013-01-07 09:24:17 +00001973TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
1974 verifyFormat("#define A \\\n"
1975 " int v( \\\n"
1976 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001977 " int i;",
1978 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00001979}
1980
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001981TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00001982 EXPECT_EQ(
1983 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1984 " \\\n"
1985 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
1986 "\n"
1987 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
1988 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
1989 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
1990 "\\\n"
1991 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
1992 " \n"
1993 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
1994 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001995}
1996
Manuel Klimek52b15152013-01-09 15:25:02 +00001997TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
1998 EXPECT_EQ("int\n"
1999 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002000 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002001 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002002 verifyFormat("functionCallTo(\n"
2003 " someOtherFunction(\n"
2004 " withSomeParameters, whichInSequence,\n"
2005 " areLongerThanALine(andAnotherCall,\n"
2006 "#define A B\n"
2007 " withMoreParamters,\n"
2008 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002009 " andMoreParameters),\n"
2010 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002011 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002012 verifyFormat("Foo::Foo()\n"
2013 "#ifdef BAR\n"
2014 " : baz(0)\n"
2015 "#endif\n"
2016 "{\n"
2017 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002018 verifyFormat("void f() {\n"
2019 " if (true)\n"
2020 "#ifdef A\n"
2021 " f(42);\n"
2022 " x();\n"
2023 "#else\n"
2024 " g();\n"
2025 " x();\n"
2026 "#endif\n"
2027 "}");
2028 verifyFormat("void f(param1, param2,\n"
2029 " param3,\n"
2030 "#ifdef A\n"
2031 " param4(param5,\n"
2032 "#ifdef A1\n"
2033 " param6,\n"
2034 "#ifdef A2\n"
2035 " param7),\n"
2036 "#else\n"
2037 " param8),\n"
2038 " param9,\n"
2039 "#endif\n"
2040 " param10,\n"
2041 "#endif\n"
2042 " param11)\n"
2043 "#else\n"
2044 " param12)\n"
2045 "#endif\n"
2046 "{\n"
2047 " x();\n"
2048 "}",
2049 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002050 verifyFormat("#if 1\n"
2051 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002052 verifyFormat("#if 1\n"
2053 "#endif\n"
2054 "#if 1\n"
2055 "#else\n"
2056 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002057 verifyFormat("DEBUG({\n"
2058 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2059 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2060 "});\n"
2061 "#if a\n"
2062 "#else\n"
2063 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002064
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002065 verifyIncompleteFormat("void f(\n"
2066 "#if A\n"
2067 " );\n"
2068 "#else\n"
2069 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002070}
2071
Manuel Klimek14bd9172014-01-29 08:49:02 +00002072TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2073 verifyFormat("#endif\n"
2074 "#if B");
2075}
2076
Manuel Klimek88033d72013-10-21 08:11:15 +00002077TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2078 FormatStyle SingleLine = getLLVMStyle();
2079 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002080 verifyFormat("#if 0\n"
2081 "#elif 1\n"
2082 "#endif\n"
2083 "void foo() {\n"
2084 " if (test) foo2();\n"
2085 "}",
2086 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002087}
2088
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002089TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002090 verifyFormat("functionCall({ int i; });");
2091 verifyFormat("functionCall({\n"
2092 " int i;\n"
2093 " int j;\n"
2094 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002095 verifyFormat("functionCall(\n"
2096 " {\n"
2097 " int i;\n"
2098 " int j;\n"
2099 " },\n"
2100 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002101 verifyFormat("functionA(functionB({\n"
2102 " int i;\n"
2103 " int j;\n"
2104 " }),\n"
2105 " aaaa, bbbb, cccc);");
2106 verifyFormat("functionCall(\n"
2107 " {\n"
2108 " int i;\n"
2109 " int j;\n"
2110 " },\n"
2111 " aaaa, bbbb, // comment\n"
2112 " cccc);");
2113 verifyFormat("functionA(functionB({\n"
2114 " int i;\n"
2115 " int j;\n"
2116 " }),\n"
2117 " aaaa, bbbb, // comment\n"
2118 " cccc);");
2119 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2120 verifyFormat("functionCall(aaaa, bbbb, {\n"
2121 " int i;\n"
2122 " int j;\n"
2123 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002124 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002125 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002126 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002127 " int i; // break\n"
2128 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002129 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2130 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002131 verifyFormat("DEBUG({\n"
2132 " if (a)\n"
2133 " f();\n"
2134 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002135}
2136
2137TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002138 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002139 "int i;",
2140 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002141}
2142
2143TEST_F(FormatTest, LayoutNestedBlocks) {
2144 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2145 " struct s {\n"
2146 " int i;\n"
2147 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002148 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002149 " for (int i = 0; i < 10; ++i)\n"
2150 " return;\n"
2151 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002152 verifyFormat("call(parameter, {\n"
2153 " something();\n"
2154 " // Comment using all columns.\n"
2155 " somethingelse();\n"
2156 "});",
2157 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002158 verifyFormat("DEBUG( //\n"
2159 " { f(); }, a);");
2160 verifyFormat("DEBUG( //\n"
2161 " {\n"
2162 " f(); //\n"
2163 " },\n"
2164 " a);");
2165
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002166 EXPECT_EQ("call(parameter, {\n"
2167 " something();\n"
2168 " // Comment too\n"
2169 " // looooooooooong.\n"
2170 " somethingElse();\n"
2171 "});",
2172 format("call(parameter, {\n"
2173 " something();\n"
2174 " // Comment too looooooooooong.\n"
2175 " somethingElse();\n"
2176 "});",
2177 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002178 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00002179 EXPECT_EQ("DEBUG({ // comment\n"
2180 " int i;\n"
2181 "});",
2182 format("DEBUG({ // comment\n"
2183 "int i;\n"
2184 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002185 EXPECT_EQ("DEBUG({\n"
2186 " int i;\n"
2187 "\n"
2188 " // comment\n"
2189 " int j;\n"
2190 "});",
2191 format("DEBUG({\n"
2192 " int i;\n"
2193 "\n"
2194 " // comment\n"
2195 " int j;\n"
2196 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00002197
2198 verifyFormat("DEBUG({\n"
2199 " if (a)\n"
2200 " return;\n"
2201 "});");
2202 verifyGoogleFormat("DEBUG({\n"
2203 " if (a) return;\n"
2204 "});");
2205 FormatStyle Style = getGoogleStyle();
2206 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00002207 verifyFormat("Debug(aaaaa,\n"
2208 " {\n"
2209 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
2210 " },\n"
2211 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00002212 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002213
Daniel Jaspera87af7a2015-06-30 11:32:22 +00002214 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
2215
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002216 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00002217}
2218
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002219TEST_F(FormatTest, FormatNestedBlocksInMacros) {
2220 EXPECT_EQ("#define MACRO() \\\n"
2221 " Debug(aaa, /* force line break */ \\\n"
2222 " { \\\n"
2223 " int i; \\\n"
2224 " int j; \\\n"
2225 " })",
2226 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
2227 " { int i; int j; })",
2228 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00002229
2230 EXPECT_EQ("#define A \\\n"
2231 " [] { \\\n"
2232 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2233 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
2234 " }",
2235 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2236 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
2237 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002238}
2239
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002240TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2241 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002242 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002243 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002244}
2245
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00002246TEST_F(FormatTest, FormatBeginBlockEndMacros) {
2247 FormatStyle Style = getLLVMStyle();
2248 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
2249 Style.MacroBlockEnd = "^[A-Z_]+_END$";
2250 verifyFormat("FOO_BEGIN\n"
2251 " FOO_ENTRY\n"
2252 "FOO_END", Style);
2253 verifyFormat("FOO_BEGIN\n"
2254 " NESTED_FOO_BEGIN\n"
2255 " NESTED_FOO_ENTRY\n"
2256 " NESTED_FOO_END\n"
2257 "FOO_END", Style);
2258 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
2259 " int x;\n"
2260 " x = 1;\n"
2261 "FOO_END(Baz)", Style);
2262}
2263
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002264//===----------------------------------------------------------------------===//
2265// Line break tests.
2266//===----------------------------------------------------------------------===//
2267
Daniel Jasperf79b0b12013-08-30 08:29:25 +00002268TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002269 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00002270 "void f() {\n"
2271 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
2272 " parameter, parameter, parameter)),\n"
2273 " SecondLongCall(parameter));\n"
2274 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002275 verifyFormat(
2276 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2277 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2278 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2279 " aaaaaaaaaaaaaaaaaaaaaaaa);");
2280 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00002281 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2282 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
2283 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
2284 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002285 verifyFormat(
2286 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
2287 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
2288 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
2289 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00002290 verifyFormat("int a = bbbb && ccc &&\n"
2291 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00002292 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00002293 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002294}
2295
Daniel Jasperd69fc772013-05-08 14:12:04 +00002296TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
2297 verifyFormat(
2298 "bool aaaaaaa =\n"
2299 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
2300 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002301 verifyFormat(
2302 "bool aaaaaaa =\n"
2303 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
2304 " bbbbbbbb();");
2305
Daniel Jasperd69fc772013-05-08 14:12:04 +00002306 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2307 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
2308 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002309 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2310 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
2311 " ccccccccc == ddddddddddd;");
2312 verifyFormat(
2313 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
2314 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
2315 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00002316
2317 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2318 " aaaaaa) &&\n"
2319 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00002320 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2321 " aaaaaa) >>\n"
2322 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00002323 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00002324 " SourceMgr.getSpellingColumnNumber(\n"
2325 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
2326 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00002327
Daniel Jasper68d888c2013-06-03 08:42:05 +00002328 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2329 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
2330 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00002331 verifyFormat("b = a &&\n"
2332 " // Comment\n"
2333 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00002334
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002335 // If the LHS of a comparison is not a binary expression itself, the
2336 // additional linebreak confuses many people.
2337 verifyFormat(
2338 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2339 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
2340 "}");
2341 verifyFormat(
2342 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2343 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2344 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00002345 verifyFormat(
2346 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
2347 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2348 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002349 // Even explicit parentheses stress the precedence enough to make the
2350 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00002351 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2352 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2353 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002354 // This cases is borderline, but with the indentation it is still readable.
2355 verifyFormat(
2356 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2357 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2358 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
2359 "}",
2360 getLLVMStyleWithColumns(75));
2361
2362 // If the LHS is a binary expression, we should still use the additional break
2363 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00002364 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2365 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2366 " 5) {\n"
2367 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002368
Daniel Jasper571f1af2013-05-14 20:39:56 +00002369 FormatStyle OnePerLine = getLLVMStyle();
2370 OnePerLine.BinPackParameters = false;
2371 verifyFormat(
2372 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2373 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2374 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
2375 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00002376
2377 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
2378 " .aaa(aaaaaaaaaaaaa) *\n"
2379 " aaaaaaa +\n"
2380 " aaaaaaa;",
2381 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00002382}
2383
Daniel Jasper6bee6822013-04-08 20:33:42 +00002384TEST_F(FormatTest, ExpressionIndentation) {
2385 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2386 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2387 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2389 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
2390 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
2391 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2392 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
2393 " ccccccccccccccccccccccccccccccccccccccccc;");
2394 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2395 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2396 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2397 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2398 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2399 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2400 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2401 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2402 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2404 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2405 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002406 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002407 "} else if (aaaaa && bbbbb > // break\n"
2408 " ccccc) {\n"
2409 "}");
2410 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00002411 "} else if (aaaaa &&\n"
2412 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002413 " ccccc &&\n"
2414 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002415 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00002416
2417 // Presence of a trailing comment used to change indentation of b.
2418 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
2419 " b;\n"
2420 "return aaaaaaaaaaaaaaaaaaa +\n"
2421 " b; //",
2422 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00002423}
2424
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002425TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
2426 // Not sure what the best system is here. Like this, the LHS can be found
2427 // immediately above an operator (everything with the same or a higher
2428 // indent). The RHS is aligned right of the operator and so compasses
2429 // everything until something with the same indent as the operator is found.
2430 // FIXME: Is this a good system?
2431 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00002432 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002433 verifyFormat(
2434 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002435 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2436 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2437 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2438 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2439 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002440 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002441 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2442 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002443 Style);
2444 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002445 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2446 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002447 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2448 Style);
2449 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002450 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2451 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002452 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2453 Style);
2454 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2455 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002456 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2457 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002458 Style);
2459 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00002460 "} else if (aaaaa\n"
2461 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002462 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002463 "}",
2464 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00002465 verifyFormat("return (a)\n"
2466 " // comment\n"
2467 " + b;",
2468 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00002469 verifyFormat(
2470 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2471 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2472 " + cc;",
2473 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002474
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00002475 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2476 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
2477 Style);
2478
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002479 // Forced by comments.
2480 verifyFormat(
2481 "unsigned ContentSize =\n"
2482 " sizeof(int16_t) // DWARF ARange version number\n"
2483 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
2484 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
2485 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00002486
2487 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
2488 " == boost::fusion::at_c<1>(iiii).second;",
2489 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00002490
2491 Style.ColumnLimit = 60;
2492 verifyFormat("zzzzzzzzzz\n"
2493 " = bbbbbbbbbbbbbbbbb\n"
2494 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
2495 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002496}
2497
Daniel Jasperb1270392017-02-01 23:27:37 +00002498TEST_F(FormatTest, EnforcedOperatorWraps) {
2499 // Here we'd like to wrap after the || operators, but a comment is forcing an
2500 // earlier wrap.
2501 verifyFormat("bool x = aaaaa //\n"
2502 " || bbbbb\n"
2503 " //\n"
2504 " || cccc;");
2505}
2506
Daniel Jasper3219e432014-12-02 13:24:51 +00002507TEST_F(FormatTest, NoOperandAlignment) {
2508 FormatStyle Style = getLLVMStyle();
2509 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00002510 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
2511 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2512 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
2513 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002514 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00002515 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2516 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2517 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2518 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2519 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2520 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2521 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2522 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2523 " > ccccccccccccccccccccccccccccccccccccccccc;",
2524 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002525
2526 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2527 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2528 " + cc;",
2529 Style);
2530 verifyFormat("int a = aa\n"
2531 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002532 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00002533 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00002534
Daniel Jasper6501f7e2015-10-27 12:38:37 +00002535 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00002536 verifyFormat("return (a > b\n"
2537 " // comment1\n"
2538 " // comment2\n"
2539 " || c);",
2540 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002541}
2542
Daniel Jasperac043c92014-09-15 11:11:00 +00002543TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
2544 FormatStyle Style = getLLVMStyle();
2545 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2546 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
2547 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00002548 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
2549 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00002550}
2551
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002552TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002553 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002554 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
2555 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002556 verifyFormat("Constructor()\n"
2557 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002558 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002559 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002560 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002561 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002562
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002563 verifyFormat("template <typename T>\n"
2564 "Constructor() : Initializer(FitsOnTheLine) {}",
2565 getLLVMStyleWithColumns(45));
2566
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002567 verifyFormat(
2568 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002569 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002570
2571 verifyFormat(
2572 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002573 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002574 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002575 verifyFormat(
2576 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002577 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002578 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002579 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2580 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2581 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002582
2583 verifyFormat("Constructor()\n"
2584 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2585 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2586 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002587 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002588
Daniel Jasper65585ed2013-01-28 13:31:35 +00002589 verifyFormat("Constructor()\n"
2590 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002591 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00002592
Daniel Jasper62e68172013-02-25 15:59:54 +00002593 verifyFormat("Constructor(int Parameter = 0)\n"
2594 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
2595 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00002596 verifyFormat("Constructor()\n"
2597 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
2598 "}",
2599 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00002600 verifyFormat("Constructor()\n"
2601 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2602 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00002603
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002604 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002605 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002606 verifyFormat("Constructor()\n"
2607 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
2608 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
2609 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002610
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002611 FormatStyle OnePerLine = getLLVMStyle();
2612 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00002613 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002614 verifyFormat("SomeClass::Constructor()\n"
2615 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2616 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002617 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002618 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002619 verifyFormat("SomeClass::Constructor()\n"
2620 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
2621 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002622 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002623 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002624 verifyFormat("MyClass::MyClass(int var)\n"
2625 " : some_var_(var), // 4 space indent\n"
2626 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002627 "}",
2628 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00002629 verifyFormat("Constructor()\n"
2630 " : aaaaa(aaaaaa),\n"
2631 " aaaaa(aaaaaa),\n"
2632 " aaaaa(aaaaaa),\n"
2633 " aaaaa(aaaaaa),\n"
2634 " aaaaa(aaaaaa) {}",
2635 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00002636 verifyFormat("Constructor()\n"
2637 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
2638 " aaaaaaaaaaaaaaaaaaaaaa) {}",
2639 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00002640 OnePerLine.BinPackParameters = false;
2641 verifyFormat(
2642 "Constructor()\n"
2643 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2644 " aaaaaaaaaaa().aaa(),\n"
2645 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2646 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00002647 OnePerLine.ColumnLimit = 60;
2648 verifyFormat("Constructor()\n"
2649 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
2650 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
2651 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00002652
2653 EXPECT_EQ("Constructor()\n"
2654 " : // Comment forcing unwanted break.\n"
2655 " aaaa(aaaa) {}",
2656 format("Constructor() :\n"
2657 " // Comment forcing unwanted break.\n"
2658 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002659}
2660
2661TEST_F(FormatTest, MemoizationTests) {
2662 // This breaks if the memoization lookup does not take \c Indent and
2663 // \c LastSpace into account.
2664 verifyFormat(
2665 "extern CFRunLoopTimerRef\n"
2666 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
2667 " CFTimeInterval interval, CFOptionFlags flags,\n"
2668 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002669 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002670
2671 // Deep nesting somewhat works around our memoization.
2672 verifyFormat(
2673 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2674 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2675 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2676 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2677 " aaaaa())))))))))))))))))))))))))))))))))))))));",
2678 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00002679 verifyFormat(
2680 "aaaaa(\n"
2681 " aaaaa,\n"
2682 " aaaaa(\n"
2683 " aaaaa,\n"
2684 " aaaaa(\n"
2685 " aaaaa,\n"
2686 " aaaaa(\n"
2687 " aaaaa,\n"
2688 " aaaaa(\n"
2689 " aaaaa,\n"
2690 " aaaaa(\n"
2691 " aaaaa,\n"
2692 " aaaaa(\n"
2693 " aaaaa,\n"
2694 " aaaaa(\n"
2695 " aaaaa,\n"
2696 " aaaaa(\n"
2697 " aaaaa,\n"
2698 " aaaaa(\n"
2699 " aaaaa,\n"
2700 " aaaaa(\n"
2701 " aaaaa,\n"
2702 " aaaaa(\n"
2703 " aaaaa,\n"
2704 " aaaaa))))))))))));",
2705 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00002706 verifyFormat(
2707 "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"
2708 " a),\n"
2709 " a),\n"
2710 " a),\n"
2711 " a),\n"
2712 " a),\n"
2713 " a),\n"
2714 " a),\n"
2715 " a),\n"
2716 " a),\n"
2717 " a),\n"
2718 " a),\n"
2719 " a),\n"
2720 " a),\n"
2721 " a),\n"
2722 " a),\n"
2723 " a),\n"
2724 " a)",
2725 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00002726
2727 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002728 FormatStyle OnePerLine = getLLVMStyle();
2729 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002730 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00002731 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00002732 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00002733 for (unsigned i = 0, e = 80; i != e; ++i) {
2734 input += " a,\n";
2735 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002736 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002737 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002738}
2739
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002740TEST_F(FormatTest, BreaksAsHighAsPossible) {
2741 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00002742 "void f() {\n"
2743 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
2744 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
2745 " f();\n"
2746 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00002747 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00002748 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002749}
2750
Daniel Jasper6728fc12013-04-11 14:29:13 +00002751TEST_F(FormatTest, BreaksFunctionDeclarations) {
2752 // Principially, we break function declarations in a certain order:
2753 // 1) break amongst arguments.
2754 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
2755 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00002756 verifyFormat("template <class TemplateIt>\n"
2757 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
2758 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00002759
2760 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00002761 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002762 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002763 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002764 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002765
2766 // 3) break after (.
2767 verifyFormat(
2768 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00002769 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
2770 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002771
2772 // 4) break before after nested name specifiers.
2773 verifyFormat(
2774 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002775 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
2776 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002777 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002778
2779 // However, there are exceptions, if a sufficient amount of lines can be
2780 // saved.
2781 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
2782 // more adjusting.
2783 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
2784 " Cccccccccccccc cccccccccc,\n"
2785 " Cccccccccccccc cccccccccc,\n"
2786 " Cccccccccccccc cccccccccc,\n"
2787 " Cccccccccccccc cccccccccc);");
2788 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002789 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002790 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2791 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2792 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002793 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002794 verifyFormat(
2795 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
2796 " Cccccccccccccc cccccccccc,\n"
2797 " Cccccccccccccc cccccccccc,\n"
2798 " Cccccccccccccc cccccccccc,\n"
2799 " Cccccccccccccc cccccccccc,\n"
2800 " Cccccccccccccc cccccccccc,\n"
2801 " Cccccccccccccc cccccccccc);");
2802 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
2803 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2804 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2805 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2806 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00002807
2808 // Break after multi-line parameters.
2809 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2810 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2811 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2812 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00002813 verifyFormat("void SomeLoooooooooooongFunction(\n"
2814 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
2815 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2816 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00002817
2818 // Treat overloaded operators like other functions.
2819 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2820 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00002821 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2822 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00002823 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2824 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
2825 verifyGoogleFormat(
2826 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
2827 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00002828 verifyGoogleFormat(
2829 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
2830 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00002831 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2832 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
2833 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
2834 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00002835 verifyGoogleFormat(
2836 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
2837 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2838 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00002839 verifyGoogleFormat(
2840 "template <typename T>\n"
2841 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2842 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
2843 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00002844
2845 FormatStyle Style = getLLVMStyle();
2846 Style.PointerAlignment = FormatStyle::PAS_Left;
2847 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2848 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
2849 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00002850 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
2851 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2852 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00002853}
2854
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00002855TEST_F(FormatTest, TrailingReturnType) {
2856 verifyFormat("auto foo() -> int;\n");
2857 verifyFormat("struct S {\n"
2858 " auto bar() const -> int;\n"
2859 "};");
2860 verifyFormat("template <size_t Order, typename T>\n"
2861 "auto load_img(const std::string &filename)\n"
2862 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00002863 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
2864 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00002865 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00002866 verifyFormat("template <typename T>\n"
2867 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
2868 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00002869
2870 // Not trailing return types.
2871 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00002872}
2873
Daniel Jasper5be31f72013-05-21 09:16:31 +00002874TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002875 // Avoid breaking before trailing 'const' or other trailing annotations, if
2876 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00002877 FormatStyle Style = getGoogleStyle();
2878 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00002879 verifyFormat("void someLongFunction(\n"
2880 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00002881 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00002882 verifyFormat("LoooooongReturnType\n"
2883 "someLoooooooongFunction() const {}",
2884 getLLVMStyleWithColumns(47));
2885 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
2886 " const {}",
2887 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002888 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2889 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
2890 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2891 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
2892 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2893 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00002894 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
2895 " aaaaaaaaaaa aaaaa) const override;");
2896 verifyGoogleFormat(
2897 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
2898 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00002899
Daniel Jasper5550de62014-02-17 07:57:46 +00002900 // Even if the first parameter has to be wrapped.
2901 verifyFormat("void someLongFunction(\n"
2902 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002903 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00002904 verifyFormat("void someLongFunction(\n"
2905 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002906 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00002907 verifyFormat("void someLongFunction(\n"
2908 " int someLongParameter) override {}",
2909 Style);
2910 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00002911 " int someLongParameter) OVERRIDE {}",
2912 Style);
2913 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00002914 " int someLongParameter) final {}",
2915 Style);
2916 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00002917 " int someLongParameter) FINAL {}",
2918 Style);
2919 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00002920 " int parameter) const override {}",
2921 Style);
2922
Daniel Jaspere3f907f2014-06-02 09:52:08 +00002923 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2924 verifyFormat("void someLongFunction(\n"
2925 " int someLongParameter) const\n"
2926 "{\n"
2927 "}",
2928 Style);
2929
Daniel Jasper5550de62014-02-17 07:57:46 +00002930 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002931 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
2932 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2933 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00002934
2935 // Breaking before function-like trailing annotations is fine to keep them
2936 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00002937 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2938 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
2939 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
2940 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
2941 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
2942 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00002943 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
2944 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00002945 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00002946
2947 verifyFormat(
2948 "void aaaaaaaaaaaaaaaaaa()\n"
2949 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
2950 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
2951 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2952 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00002953 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002954 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00002955 " GUARDED_BY(aaaaaaaaaaaa);");
2956 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00002957 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00002958 " GUARDED_BY(aaaaaaaaaaaa);");
2959 verifyGoogleFormat(
2960 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
2961 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00002962 verifyGoogleFormat(
2963 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
2964 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00002965}
2966
Daniel Jasperf090f032015-05-18 09:47:22 +00002967TEST_F(FormatTest, FunctionAnnotations) {
2968 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00002969 "int OldFunction(const string &parameter) {}");
2970 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00002971 "string OldFunction(const string &parameter) {}");
2972 verifyFormat("template <typename T>\n"
2973 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
2974 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00002975
2976 // Not function annotations.
2977 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2978 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00002979 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
2980 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00002981 verifyFormat("MACRO(abc).function() // wrap\n"
2982 " << abc;");
2983 verifyFormat("MACRO(abc)->function() // wrap\n"
2984 " << abc;");
2985 verifyFormat("MACRO(abc)::function() // wrap\n"
2986 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00002987}
2988
Daniel Jasperf7935112012-12-03 18:12:45 +00002989TEST_F(FormatTest, BreaksDesireably) {
2990 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
2991 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002992 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00002993 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2994 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
2995 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00002996
2997 verifyFormat(
2998 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002999 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003000
3001 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3002 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3003 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00003004
3005 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003006 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3007 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3008 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00003009 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3010 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003011
3012 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3013 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3014
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003015 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003016 "void f() {\n"
3017 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
3018 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3019 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00003020 verifyFormat(
3021 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3022 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3023 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003024 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3025 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3026 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003027 "aaaaaa(aaa,\n"
3028 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003029 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3030 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003031 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3032 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3033 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003034
Daniel Jasper739b85f2015-06-29 10:42:59 +00003035 // Indent consistently independent of call expression and unary operator.
3036 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3037 " dddddddddddddddddddddddddddddd));");
3038 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3039 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003040 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003041 " dddddddddddddddddddddddddddddd));");
3042
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003043 // This test case breaks on an incorrect memoization, i.e. an optimization not
3044 // taking into account the StopAt value.
3045 verifyFormat(
3046 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003047 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3048 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3049 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00003050
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003051 verifyFormat("{\n {\n {\n"
3052 " Annotation.SpaceRequiredBefore =\n"
3053 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
3054 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
3055 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00003056
3057 // Break on an outer level if there was a break on an inner level.
3058 EXPECT_EQ("f(g(h(a, // comment\n"
3059 " b, c),\n"
3060 " d, e),\n"
3061 " x, y);",
3062 format("f(g(h(a, // comment\n"
3063 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00003064
3065 // Prefer breaking similar line breaks.
3066 verifyFormat(
3067 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
3068 " NSTrackingMouseEnteredAndExited |\n"
3069 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00003070}
3071
Daniel Jasper18210d72014-10-09 09:52:05 +00003072TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
3073 FormatStyle NoBinPacking = getGoogleStyle();
3074 NoBinPacking.BinPackParameters = false;
3075 NoBinPacking.BinPackArguments = true;
3076 verifyFormat("void f() {\n"
3077 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
3078 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3079 "}",
3080 NoBinPacking);
3081 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
3082 " int aaaaaaaaaaaaaaaaaaaa,\n"
3083 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3084 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003085
Daniel Jasper00693b082016-01-09 15:56:47 +00003086 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
3087 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3088 " vector<int> bbbbbbbbbbbbbbb);",
3089 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003090 // FIXME: This behavior difference is probably not wanted. However, currently
3091 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
3092 // template arguments from BreakBeforeParameter being set because of the
3093 // one-per-line formatting.
3094 verifyFormat(
3095 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3096 " aaaaaaaaaa> aaaaaaaaaa);",
3097 NoBinPacking);
3098 verifyFormat(
3099 "void fffffffffff(\n"
3100 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
3101 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00003102}
3103
Daniel Jasper9278eb92013-01-16 14:59:02 +00003104TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00003105 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003106 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00003107 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003108 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
3109 " aaaaaaaaaaaaaaaaaaaa,\n"
3110 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
3111 NoBinPacking);
3112 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
3113 " aaaaaaaaaaaaa,\n"
3114 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
3115 NoBinPacking);
3116 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003117 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3118 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3119 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
3120 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003121 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
3122 NoBinPacking);
3123 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3124 " .aaaaaaaaaaaaaaaaaa();",
3125 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003126 verifyFormat("void f() {\n"
3127 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3128 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
3129 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003130 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003131
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003132 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00003133 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3134 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003135 " aaaaaaaaaaaa);",
3136 NoBinPacking);
3137 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003138 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
3139 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003140 " test);",
3141 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003142
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003143 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3144 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00003145 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
3146 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003147 NoBinPacking);
3148 verifyFormat("a(\"a\"\n"
3149 " \"a\",\n"
3150 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00003151
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003152 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00003153 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00003154 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00003155 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003156 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00003157 verifyFormat(
3158 "void f() {\n"
3159 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3160 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003161 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003162 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00003163 verifyFormat(
3164 "template <class SomeType, class SomeOtherType>\n"
3165 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
3166 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003167}
3168
Daniel Jasperb10cbc42013-07-10 14:02:49 +00003169TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
3170 FormatStyle Style = getLLVMStyleWithColumns(15);
3171 Style.ExperimentalAutoDetectBinPacking = true;
3172 EXPECT_EQ("aaa(aaaa,\n"
3173 " aaaa,\n"
3174 " aaaa);\n"
3175 "aaa(aaaa,\n"
3176 " aaaa,\n"
3177 " aaaa);",
3178 format("aaa(aaaa,\n" // one-per-line
3179 " aaaa,\n"
3180 " aaaa );\n"
3181 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3182 Style));
3183 EXPECT_EQ("aaa(aaaa, aaaa,\n"
3184 " aaaa);\n"
3185 "aaa(aaaa, aaaa,\n"
3186 " aaaa);",
3187 format("aaa(aaaa, aaaa,\n" // bin-packed
3188 " aaaa );\n"
3189 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3190 Style));
3191}
3192
Daniel Jasper04468962013-01-18 10:56:38 +00003193TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00003194 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
3195 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
3196 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
3197 " .StartsWith(\".init\", ORDER_INIT)\n"
3198 " .StartsWith(\".fini\", ORDER_FINI)\n"
3199 " .StartsWith(\".hash\", ORDER_HASH)\n"
3200 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00003201
Daniel Jaspereb50c672013-02-15 20:33:06 +00003202 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003203 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003204 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00003205 "aaaaaaa->aaaaaaa\n"
3206 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3207 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003208 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003209 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00003210 "aaaaaaa->aaaaaaa\n"
3211 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3212 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
3213 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00003214 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00003215 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003216 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003217 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
3218 " aaaaaa->aaaaaaaaaaaa()\n"
3219 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00003220 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003221 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00003222 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003223 "void f() {\n"
3224 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003225 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003226 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003227 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003228 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003229 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003230 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003231 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003232 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003233 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003234 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003235 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00003236
3237 verifyFormat(
3238 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
3239 verifyFormat("aaaaaaaaaaaaaaa()\n"
3240 " .aaaaaaaaaaaaaaa()\n"
3241 " .aaaaaaaaaaaaaaa()\n"
3242 " .aaaaaaaaaaaaaaa()\n"
3243 " .aaaaaaaaaaaaaaa();");
3244 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3245 " .aaaaaaaaaaaaaaa()\n"
3246 " .aaaaaaaaaaaaaaa()\n"
3247 " .aaaaaaaaaaaaaaa();");
3248 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3249 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3250 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00003251 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
3252 " ->aaaaaaaaaaaaaae(0)\n"
3253 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003254
Daniel Jasper775954b2015-04-24 10:08:09 +00003255 // Don't linewrap after very short segments.
3256 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3257 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3258 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3259 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3260 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3261 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3262 verifyFormat("aaa()\n"
3263 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3264 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3265 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3266
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003267 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3268 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3269 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
3270 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3271 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003272 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003273
Daniel Jaspera41aa532014-09-19 08:01:25 +00003274 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003275 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
3276 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00003277
3278 // Prefer not to create "hanging" indents.
3279 verifyFormat(
3280 "return !soooooooooooooome_map\n"
3281 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3282 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00003283 verifyFormat(
3284 "return aaaaaaaaaaaaaaaa\n"
3285 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
3286 " .aaaa(aaaaaaaaaaaaaa);");
3287 // No hanging indent here.
3288 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
3289 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3290 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
3291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00003292 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3293 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3294 getLLVMStyleWithColumns(60));
3295 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
3296 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3297 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3298 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00003299 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3300 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3301 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00003302}
3303
Daniel Jasperde5c2072012-12-24 00:13:23 +00003304TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
3305 verifyFormat(
3306 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003307 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003308 verifyFormat(
3309 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
3310 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
3311
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003312 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003313 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003314 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
3315 " ccccccccccccccccccccccccc) {\n}");
3316
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003317 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003318 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003319 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
3320 " ccccccccccccccccccccccccc) {\n}");
3321
Daniel Jasperde5c2072012-12-24 00:13:23 +00003322 verifyFormat(
3323 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003324 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003325 verifyFormat(
3326 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
3327 " ccccccccccccccccccccccccc) {\n}");
3328
Daniel Jasper400adc62013-02-08 15:28:42 +00003329 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
3330 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
3331 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
3332 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003333 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
3334 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
3335 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
3336 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
3337
Daniel Jasper400adc62013-02-08 15:28:42 +00003338 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
3339 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
3340 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003341 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
3342 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
3343 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00003344}
3345
Daniel Jasper43b65482013-01-23 12:27:43 +00003346TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00003347 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00003348 "unsigned Cost =\n"
3349 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
3350 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00003351 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00003352 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
3353 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00003354
3355 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003356 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
3357 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00003358 verifyFormat("unsigned OriginalStartColumn =\n"
3359 " SourceMgr.getSpellingColumnNumber(\n"
3360 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
3361 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00003362}
3363
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003364TEST_F(FormatTest, AlignsAfterAssignments) {
3365 verifyFormat(
3366 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003367 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003368 verifyFormat(
3369 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003370 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003371 verifyFormat(
3372 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003373 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003374 verifyFormat(
3375 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003376 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00003377 verifyFormat(
3378 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3379 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3380 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003381}
3382
3383TEST_F(FormatTest, AlignsAfterReturn) {
3384 verifyFormat(
3385 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3386 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
3387 verifyFormat(
3388 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3389 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00003390 verifyFormat(
3391 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003392 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00003393 verifyFormat(
3394 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003395 " aaaaaaaaaaaaaaaaaaaaaa());");
3396 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3397 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3398 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3399 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
3400 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00003401 verifyFormat("return\n"
3402 " // true if code is one of a or b.\n"
3403 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003404}
3405
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003406TEST_F(FormatTest, AlignsAfterOpenBracket) {
3407 verifyFormat(
3408 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3409 " aaaaaaaaa aaaaaaa) {}");
3410 verifyFormat(
3411 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3412 " aaaaaaaaaaa aaaaaaaaa);");
3413 verifyFormat(
3414 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3415 " aaaaaaaaaaaaaaaaaaaaa));");
3416 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003417 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00003418 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3419 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
3420 Style);
3421 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3422 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
3423 Style);
3424 verifyFormat("SomeLongVariableName->someFunction(\n"
3425 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
3426 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003427 verifyFormat(
3428 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3429 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3430 Style);
3431 verifyFormat(
3432 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3433 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3434 Style);
3435 verifyFormat(
3436 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3437 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
3438 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003439
Daniel Jasper2a9f7202016-02-08 09:52:54 +00003440 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
3441 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
3442 " b));",
3443 Style);
3444
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003445 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
3446 Style.BinPackArguments = false;
3447 Style.BinPackParameters = false;
3448 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3449 " aaaaaaaaaaa aaaaaaaa,\n"
3450 " aaaaaaaaa aaaaaaa,\n"
3451 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3452 Style);
3453 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3454 " aaaaaaaaaaa aaaaaaaaa,\n"
3455 " aaaaaaaaaaa aaaaaaaaa,\n"
3456 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3457 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00003458 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
3459 " aaaaaaaaaaaaaaa,\n"
3460 " aaaaaaaaaaaaaaaaaaaaa,\n"
3461 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003462 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00003463 verifyFormat(
3464 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
3465 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3466 Style);
3467 verifyFormat(
3468 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
3469 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3470 Style);
3471 verifyFormat(
3472 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3473 " aaaaaaaaaaaaaaaaaaaaa(\n"
3474 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
3475 " aaaaaaaaaaaaaaaa);",
3476 Style);
3477 verifyFormat(
3478 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3479 " aaaaaaaaaaaaaaaaaaaaa(\n"
3480 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
3481 " aaaaaaaaaaaaaaaa);",
3482 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003483}
3484
Daniel Jasper3219e432014-12-02 13:24:51 +00003485TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
3486 FormatStyle Style = getLLVMStyleWithColumns(40);
3487 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3488 " bbbbbbbbbbbbbbbbbbbbbb);",
3489 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003490 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00003491 Style.AlignOperands = false;
3492 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3493 " bbbbbbbbbbbbbbbbbbbbbb);",
3494 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003495 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00003496 Style.AlignOperands = true;
3497 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3498 " bbbbbbbbbbbbbbbbbbbbbb);",
3499 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003500 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00003501 Style.AlignOperands = false;
3502 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3503 " bbbbbbbbbbbbbbbbbbbbbb);",
3504 Style);
3505}
3506
Daniel Jasper399d24b2013-01-09 07:06:56 +00003507TEST_F(FormatTest, BreaksConditionalExpressions) {
3508 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003509 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3510 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3511 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3512 verifyFormat(
3513 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003514 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3515 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00003516 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003517 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3518 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3519 verifyFormat(
3520 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003521 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3522 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00003523 verifyFormat(
3524 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
3525 " : aaaaaaaaaaaaa);");
3526 verifyFormat(
3527 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00003528 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00003529 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3530 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003531 verifyFormat(
3532 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3533 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3534 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00003535 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3536 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3537 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3538 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3539 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3540 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3541 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3542 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3543 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3544 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3545 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3546 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003547 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3548 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3549 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3550 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3551 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00003552 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3553 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3554 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00003555 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
3556 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3557 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3558 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00003559 verifyFormat(
3560 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3561 " ? aaaaaaaaaaaaaaa\n"
3562 " : aaaaaaaaaaaaaaa;");
3563 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003564 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00003565 " ? b\n"
3566 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00003567 verifyFormat("return aaaa == bbbb\n"
3568 " // comment\n"
3569 " ? aaaa\n"
3570 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003571 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003572 " format(TheLine.First,\n"
3573 " IndentForLevel[TheLine.Level] >= 0\n"
3574 " ? IndentForLevel[TheLine.Level]\n"
3575 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003576 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00003577 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00003578 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
3579 " ? aaaaaaaaaaaaaaa\n"
3580 " : bbbbbbbbbbbbbbb //\n"
3581 " ? ccccccccccccccc\n"
3582 " : ddddddddddddddd;");
3583 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
3584 " ? aaaaaaaaaaaaaaa\n"
3585 " : (bbbbbbbbbbbbbbb //\n"
3586 " ? ccccccccccccccc\n"
3587 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003588 verifyFormat(
3589 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3590 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3591 " aaaaaaaaaaaaaaaaaaaaa +\n"
3592 " aaaaaaaaaaaaaaaaaaaaa\n"
3593 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00003594 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003595 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3596 " : aaaaaaaaaaaaaaaaaaaaaa\n"
3597 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00003598
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003599 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00003600 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003601 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00003602 "void f() {\n"
3603 " g(aaa,\n"
3604 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
3605 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3606 " ? aaaaaaaaaaaaaaa\n"
3607 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003608 "}",
3609 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003610 verifyFormat(
3611 "void f() {\n"
3612 " g(aaa,\n"
3613 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
3614 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3615 " ?: aaaaaaaaaaaaaaa);\n"
3616 "}",
3617 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00003618
3619 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
3620 " // comment.\n"
3621 " ccccccccccccccccccccccccccccccccccccccc\n"
3622 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3623 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00003624
3625 // Assignments in conditional expressions. Apparently not uncommon :-(.
3626 verifyFormat("return a != b\n"
3627 " // comment\n"
3628 " ? a = b\n"
3629 " : a = b;");
3630 verifyFormat("return a != b\n"
3631 " // comment\n"
3632 " ? a = a != b\n"
3633 " // comment\n"
3634 " ? a = b\n"
3635 " : a\n"
3636 " : a;\n");
3637 verifyFormat("return a != b\n"
3638 " // comment\n"
3639 " ? a\n"
3640 " : a = a != b\n"
3641 " // comment\n"
3642 " ? a = b\n"
3643 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00003644}
3645
Daniel Jasper165b29e2013-11-08 00:57:11 +00003646TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
3647 FormatStyle Style = getLLVMStyle();
3648 Style.BreakBeforeTernaryOperators = false;
3649 Style.ColumnLimit = 70;
3650 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003651 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3652 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3653 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3654 Style);
3655 verifyFormat(
3656 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003657 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3658 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00003659 Style);
3660 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003661 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3662 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3663 Style);
3664 verifyFormat(
3665 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003666 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3667 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00003668 Style);
3669 verifyFormat(
3670 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
3671 " aaaaaaaaaaaaa);",
3672 Style);
3673 verifyFormat(
3674 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3675 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3676 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3677 " aaaaaaaaaaaaa);",
3678 Style);
3679 verifyFormat(
3680 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3681 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3682 " aaaaaaaaaaaaa);",
3683 Style);
3684 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3685 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3686 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3687 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3688 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3689 Style);
3690 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3691 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3692 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3693 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3694 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3695 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3696 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3697 Style);
3698 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3699 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
3700 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3701 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3702 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3703 Style);
3704 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3705 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3706 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3707 Style);
3708 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00003709 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00003710 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3711 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3712 Style);
3713 verifyFormat(
3714 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3715 " aaaaaaaaaaaaaaa :\n"
3716 " aaaaaaaaaaaaaaa;",
3717 Style);
3718 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
3719 " aaaaaaaaa ?\n"
3720 " b :\n"
3721 " c);",
3722 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00003723 verifyFormat("unsigned Indent =\n"
3724 " format(TheLine.First,\n"
3725 " IndentForLevel[TheLine.Level] >= 0 ?\n"
3726 " IndentForLevel[TheLine.Level] :\n"
3727 " TheLine * 2,\n"
3728 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
3729 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00003730 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
3731 " aaaaaaaaaaaaaaa :\n"
3732 " bbbbbbbbbbbbbbb ? //\n"
3733 " ccccccccccccccc :\n"
3734 " ddddddddddddddd;",
3735 Style);
3736 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
3737 " aaaaaaaaaaaaaaa :\n"
3738 " (bbbbbbbbbbbbbbb ? //\n"
3739 " ccccccccccccccc :\n"
3740 " ddddddddddddddd);",
3741 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00003742 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3743 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
3744 " ccccccccccccccccccccccccccc;",
3745 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00003746 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3747 " aaaaa :\n"
3748 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
3749 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00003750}
3751
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003752TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
3753 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
3754 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
3755 verifyFormat("bool a = true, b = false;");
3756
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003757 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00003758 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003759 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00003760 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003761 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00003762 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00003763 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003764 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00003765 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
3766 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
3767 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
3768 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
3769 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
3770 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003771
Daniel Jasperbea1ab42015-03-01 18:55:26 +00003772 FormatStyle Style = getGoogleStyle();
3773 Style.PointerAlignment = FormatStyle::PAS_Left;
3774 Style.DerivePointerAlignment = false;
3775 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3776 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
3777 " *b = bbbbbbbbbbbbbbbbbbb;",
3778 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003779 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
3780 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
3781 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00003782 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00003783 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003784}
3785
Nico Weber4a5030c2013-01-12 01:28:06 +00003786TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
3787 verifyFormat("arr[foo ? bar : baz];");
3788 verifyFormat("f()[foo ? bar : baz];");
3789 verifyFormat("(a + b)[foo ? bar : baz];");
3790 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
3791}
3792
Daniel Jasperf7935112012-12-03 18:12:45 +00003793TEST_F(FormatTest, AlignsStringLiterals) {
3794 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
3795 " \"short literal\");");
3796 verifyFormat(
3797 "looooooooooooooooooooooooongFunction(\n"
3798 " \"short literal\"\n"
3799 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003800 verifyFormat("someFunction(\"Always break between multi-line\"\n"
3801 " \" string literals\",\n"
3802 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003803 EXPECT_EQ("fun + \"1243\" /* comment */\n"
3804 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00003805 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003806 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00003807 getLLVMStyleWithColumns(28)));
3808 EXPECT_EQ(
3809 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
3810 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
3811 " \"aaaaaaaaaaaaaaaa\";",
3812 format("aaaaaa ="
3813 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
3814 "aaaaaaaaaaaaaaaaaaaaa\" "
3815 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003816 verifyFormat("a = a + \"a\"\n"
3817 " \"a\"\n"
3818 " \"a\";");
3819 verifyFormat("f(\"a\", \"b\"\n"
3820 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00003821
3822 verifyFormat(
3823 "#define LL_FORMAT \"ll\"\n"
3824 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
3825 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00003826
3827 verifyFormat("#define A(X) \\\n"
3828 " \"aaaaa\" #X \"bbbbbb\" \\\n"
3829 " \"ccccc\"",
3830 getLLVMStyleWithColumns(23));
3831 verifyFormat("#define A \"def\"\n"
3832 "f(\"abc\" A \"ghi\"\n"
3833 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00003834
3835 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00003836 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00003837 verifyFormat("#define A(X) \\\n"
3838 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
3839 " L\"ccccc\"",
3840 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00003841
3842 verifyFormat("f(@\"a\"\n"
3843 " @\"b\");");
3844 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00003845 " @\"b\"\n"
3846 " @\"c\";");
3847 verifyFormat("NSString s = @\"a\"\n"
3848 " \"b\"\n"
3849 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00003850}
3851
Zachary Turner448592e2015-12-18 22:20:15 +00003852TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003853 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00003854 // No declarations or definitions should be moved to own line.
3855 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
3856 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003857 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003858 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003859 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003860 "int f() { return 1; }\n"
3861 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003862 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00003863
3864 // All declarations and definitions should have the return type moved to its
3865 // own
3866 // line.
3867 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
3868 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003869 " int\n"
3870 " f() {\n"
3871 " return 1;\n"
3872 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003873 " int\n"
3874 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003875 "};\n"
3876 "int\n"
3877 "f() {\n"
3878 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003879 "}\n"
3880 "int\n"
3881 "g();\n",
3882 Style);
3883
3884 // Top-level definitions, and no kinds of declarations should have the
3885 // return type moved to its own line.
3886 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
3887 verifyFormat("class B {\n"
3888 " int f() { return 1; }\n"
3889 " int g();\n"
3890 "};\n"
3891 "int\n"
3892 "f() {\n"
3893 " return 1;\n"
3894 "}\n"
3895 "int g();\n",
3896 Style);
3897
3898 // Top-level definitions and declarations should have the return type moved
3899 // to its own line.
3900 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
3901 verifyFormat("class C {\n"
3902 " int f() { return 1; }\n"
3903 " int g();\n"
3904 "};\n"
3905 "int\n"
3906 "f() {\n"
3907 " return 1;\n"
3908 "}\n"
3909 "int\n"
3910 "g();\n",
3911 Style);
3912
3913 // All definitions should have the return type moved to its own line, but no
3914 // kinds of declarations.
3915 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
3916 verifyFormat("class D {\n"
3917 " int\n"
3918 " f() {\n"
3919 " return 1;\n"
3920 " }\n"
3921 " int g();\n"
3922 "};\n"
3923 "int\n"
3924 "f() {\n"
3925 " return 1;\n"
3926 "}\n"
3927 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003928 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00003929 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003930 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00003931 " return \"\";\n"
3932 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003933 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003934 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00003935 verifyFormat("template <class T>\n"
3936 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003937 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00003938 " return NULL;\n"
3939 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003940 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003941 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00003942 verifyFormat("class C {\n"
3943 " int\n"
3944 " operator+() {\n"
3945 " return 1;\n"
3946 " }\n"
3947 " int\n"
3948 " operator()() {\n"
3949 " return 1;\n"
3950 " }\n"
3951 "};\n",
3952 Style);
3953 verifyFormat("void\n"
3954 "A::operator()() {}\n"
3955 "void\n"
3956 "A::operator>>() {}\n"
3957 "void\n"
3958 "A::operator+() {}\n",
3959 Style);
3960 verifyFormat("void *operator new(std::size_t s);", // No break here.
3961 Style);
3962 verifyFormat("void *\n"
3963 "operator new(std::size_t s) {}",
3964 Style);
3965 verifyFormat("void *\n"
3966 "operator delete[](void *ptr) {}",
3967 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003968 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00003969 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003970 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00003971 "{\n"
3972 " return \"\";\n"
3973 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003974 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003975 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00003976 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003977 "T *\n" // Problem here: no line break
3978 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00003979 "{\n"
3980 " return NULL;\n"
3981 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003982 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003983 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00003984}
3985
Alexander Kornienko58611712013-07-04 12:02:44 +00003986TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
3987 FormatStyle NoBreak = getLLVMStyle();
3988 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
3989 FormatStyle Break = getLLVMStyle();
3990 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00003991 verifyFormat("aaaa = \"bbbb\"\n"
3992 " \"cccc\";",
3993 NoBreak);
3994 verifyFormat("aaaa =\n"
3995 " \"bbbb\"\n"
3996 " \"cccc\";",
3997 Break);
3998 verifyFormat("aaaa(\"bbbb\"\n"
3999 " \"cccc\");",
4000 NoBreak);
4001 verifyFormat("aaaa(\n"
4002 " \"bbbb\"\n"
4003 " \"cccc\");",
4004 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004005 verifyFormat("aaaa(qqq, \"bbbb\"\n"
4006 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004007 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004008 verifyFormat("aaaa(qqq,\n"
4009 " \"bbbb\"\n"
4010 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004011 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004012 verifyFormat("aaaa(qqq,\n"
4013 " L\"bbbb\"\n"
4014 " L\"cccc\");",
4015 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004016 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
4017 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00004018 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00004019 verifyFormat("string s = someFunction(\n"
4020 " \"abc\"\n"
4021 " \"abc\");",
4022 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00004023
Daniel Jasper3251fff2014-06-10 06:27:23 +00004024 // As we break before unary operators, breaking right after them is bad.
4025 verifyFormat("string foo = abc ? \"x\"\n"
4026 " \"blah blah blah blah blah blah\"\n"
4027 " : \"y\";",
4028 Break);
4029
Daniel Jasperc834c702013-07-17 15:38:19 +00004030 // Don't break if there is no column gain.
4031 verifyFormat("f(\"aaaa\"\n"
4032 " \"bbbb\");",
4033 Break);
4034
4035 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004036 EXPECT_EQ("x = \"a\\\n"
4037 "b\\\n"
4038 "c\";",
4039 format("x = \"a\\\n"
4040 "b\\\n"
4041 "c\";",
4042 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004043 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004044 " \"a\\\n"
4045 "b\\\n"
4046 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004047 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004048 "b\\\n"
4049 "c\";",
4050 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00004051
4052 // Exempt ObjC strings for now.
4053 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004054 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004055 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004056 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004057 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00004058
4059 Break.ColumnLimit = 0;
4060 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00004061}
4062
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004063TEST_F(FormatTest, AlignsPipes) {
4064 verifyFormat(
4065 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4066 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4067 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4068 verifyFormat(
4069 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
4070 " << aaaaaaaaaaaaaaaaaaaa;");
4071 verifyFormat(
4072 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4073 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4074 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00004075 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4076 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4077 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004078 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
4079 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
4080 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
4081 verifyFormat(
4082 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4083 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4084 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004085 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4086 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4087 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4088 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00004089 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
4090 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00004091 verifyFormat(
4092 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4093 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00004094
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004095 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
4096 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00004097 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4098 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4099 " aaaaaaaaaaaaaaaaaaaaa)\n"
4100 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00004101 verifyFormat("LOG_IF(aaa == //\n"
4102 " bbb)\n"
4103 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004104
Daniel Jasper467ddb12013-08-12 12:58:05 +00004105 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00004106 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4107 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004108 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
4109 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4110 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00004111 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
4112 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00004113 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4114 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4115 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4116 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4117 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4119 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004120
Daniel Jasperc238c872013-04-02 14:33:13 +00004121 verifyFormat(
4122 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4123 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00004124
4125 // Incomplete string literal.
4126 EXPECT_EQ("llvm::errs() << \"\n"
4127 " << a;",
4128 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00004129
4130 verifyFormat("void f() {\n"
4131 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
4132 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
4133 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00004134
4135 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00004136 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
4137 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
4138 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00004139
4140 // Handle '\n'.
4141 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
4142 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
4143 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
4144 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
4145 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
4146 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
4147 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004148}
4149
Daniel Jasper7209bb92016-12-13 11:16:42 +00004150TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
4151 verifyFormat("return out << \"somepacket = {\\n\"\n"
4152 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
4153 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
4154 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
4155 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
4156 " << \"}\";");
4157
4158 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4159 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4160 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
4161 verifyFormat(
4162 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
4163 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
4164 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
4165 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
4166 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
4167 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
4168 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
4169 verifyFormat(
4170 "void f() {\n"
4171 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
4172 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4173 "}");
4174
4175 // Breaking before the first "<<" is generally not desirable.
4176 verifyFormat(
4177 "llvm::errs()\n"
4178 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4179 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4180 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4181 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4182 getLLVMStyleWithColumns(70));
4183 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4184 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4185 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4186 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4187 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4188 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4189 getLLVMStyleWithColumns(70));
4190
4191 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4192 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4193 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
4194 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4195 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4196 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00004197 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
4198 " (aaaa + aaaa);",
4199 getLLVMStyleWithColumns(40));
4200 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
4201 " (aaaaaaa + aaaaa));",
4202 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00004203 verifyFormat(
4204 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
4205 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
4206 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00004207}
4208
Daniel Jasperf7935112012-12-03 18:12:45 +00004209TEST_F(FormatTest, UnderstandsEquals) {
4210 verifyFormat(
4211 "aaaaaaaaaaaaaaaaa =\n"
4212 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4213 verifyFormat(
4214 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004215 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004216 verifyFormat(
4217 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004218 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00004219 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004220 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4221 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004222
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004223 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4224 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004225}
4226
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004227TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004228 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4229 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004230
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004231 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4232 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004233
4234 verifyFormat(
4235 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
4236 " Parameter2);");
4237
4238 verifyFormat(
4239 "ShortObject->shortFunction(\n"
4240 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
4241 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
4242
4243 verifyFormat("loooooooooooooongFunction(\n"
4244 " LoooooooooooooongObject->looooooooooooooooongFunction());");
4245
4246 verifyFormat(
4247 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
4248 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
4249
Daniel Jasper687af3b2013-02-14 14:26:07 +00004250 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4251 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00004252 verifyFormat("void f() {\n"
4253 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4254 " .Times(2)\n"
4255 " .WillRepeatedly(Return(SomeValue));\n"
4256 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00004257 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
4258 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00004259 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004260 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4261 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00004262 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004263 verifyFormat("void f() {\n"
4264 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4265 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
4266 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00004267 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4268 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4269 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4270 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4271 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00004272 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4273 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4274 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4275 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
4276 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00004277
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004278 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004279 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004280 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004281 verifyFormat(
4282 "aaaaaaaaaaa->aaaaaaaaa(\n"
4283 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4284 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00004285
4286 verifyFormat(
4287 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4288 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00004289 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
4290 " aaaaaaaaa()->aaaaaa()->aaaaa());");
4291 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
4292 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004293
Daniel Jasper9b334242013-03-15 14:57:30 +00004294 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004295 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4296 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00004297
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004298 FormatStyle NoBinPacking = getLLVMStyle();
4299 NoBinPacking.BinPackParameters = false;
4300 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4301 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4302 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
4303 " aaaaaaaaaaaaaaaaaaa,\n"
4304 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4305 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00004306
4307 // If there is a subsequent call, change to hanging indentation.
4308 verifyFormat(
4309 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4310 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
4311 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4312 verifyFormat(
4313 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4314 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00004315 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4316 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4317 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4318 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4319 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4320 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004321}
4322
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004323TEST_F(FormatTest, WrapsTemplateDeclarations) {
4324 verifyFormat("template <typename T>\n"
4325 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00004326 verifyFormat("template <typename T>\n"
4327 "// T should be one of {A, B}.\n"
4328 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004329 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00004330 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00004331 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004332 verifyFormat("template <typename T>\n"
4333 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
4334 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004335 verifyFormat(
4336 "template <typename T>\n"
4337 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
4338 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00004339 verifyFormat(
4340 "template <typename T>\n"
4341 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
4342 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
4343 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00004344 verifyFormat("template <typename T>\n"
4345 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004346 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00004347 verifyFormat(
4348 "template <typename T1, typename T2 = char, typename T3 = char,\n"
4349 " typename T4 = char>\n"
4350 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00004351 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
4352 " template <typename> class cccccccccccccccccccccc,\n"
4353 " typename ddddddddddddd>\n"
4354 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004355 verifyFormat(
4356 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
4357 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00004358
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004359 verifyFormat("void f() {\n"
4360 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
4361 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
4362 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004363
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00004364 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004365 verifyFormat("template <typename T> void f();");
4366 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00004367 verifyFormat(
4368 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4369 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4370 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
4371 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4372 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4373 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
4374 " bbbbbbbbbbbbbbbbbbbbbbbb);",
4375 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00004376 EXPECT_EQ("static_cast<A< //\n"
4377 " B> *>(\n"
4378 "\n"
4379 " );",
4380 format("static_cast<A<//\n"
4381 " B>*>(\n"
4382 "\n"
4383 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00004384 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4385 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00004386
4387 FormatStyle AlwaysBreak = getLLVMStyle();
4388 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
4389 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
4390 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
4391 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
4392 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4393 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
4394 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
4395 verifyFormat("template <template <typename> class Fooooooo,\n"
4396 " template <typename> class Baaaaaaar>\n"
4397 "struct C {};",
4398 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00004399 verifyFormat("template <typename T> // T can be A, B or C.\n"
4400 "struct C {};",
4401 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00004402 verifyFormat("template <enum E> class A {\n"
4403 "public:\n"
4404 " E *f();\n"
4405 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004406}
4407
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00004408TEST_F(FormatTest, WrapsTemplateParameters) {
4409 FormatStyle Style = getLLVMStyle();
4410 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4411 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4412 verifyFormat(
4413 "template <typename... a> struct q {};\n"
4414 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4415 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4416 " y;",
4417 Style);
4418 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4419 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4420 verifyFormat(
4421 "template <typename... a> struct r {};\n"
4422 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4423 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4424 " y;",
4425 Style);
4426 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4427 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4428 verifyFormat(
4429 "template <typename... a> struct s {};\n"
4430 "extern s<\n"
4431 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4432 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4433 " y;",
4434 Style);
4435 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4436 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4437 verifyFormat(
4438 "template <typename... a> struct t {};\n"
4439 "extern t<\n"
4440 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4441 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4442 " y;",
4443 Style);
4444}
4445
Daniel Jasper45797022013-01-25 10:57:27 +00004446TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
4447 verifyFormat(
4448 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4449 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4450 verifyFormat(
4451 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4452 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4453 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
4454
Daniel Jasper0f0234e2013-05-08 10:00:18 +00004455 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00004456 verifyFormat(
4457 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4458 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00004459 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00004460
Daniel Jasper45797022013-01-25 10:57:27 +00004461 verifyFormat(
4462 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00004463 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00004464
4465 // Breaking at nested name specifiers is generally not desirable.
4466 verifyFormat(
4467 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4468 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004469
4470 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004471 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
4472 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4473 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004474 " aaaaaaaaaaaaaaaaaaaaa);",
4475 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00004476
4477 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4478 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4479 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00004480}
4481
Daniel Jasperf7935112012-12-03 18:12:45 +00004482TEST_F(FormatTest, UnderstandsTemplateParameters) {
4483 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00004484 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004485 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
4486 verifyFormat("bool x = a < 1 || 2 > a;");
4487 verifyFormat("bool x = 5 < f<int>();");
4488 verifyFormat("bool x = f<int>() > 5;");
4489 verifyFormat("bool x = 5 < a<int>::x;");
4490 verifyFormat("bool x = a < 4 ? a > 2 : false;");
4491 verifyFormat("bool x = f() ? a < 2 : a > 2;");
4492
4493 verifyGoogleFormat("A<A<int>> a;");
4494 verifyGoogleFormat("A<A<A<int>>> a;");
4495 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004496 verifyGoogleFormat("A<A<int> > a;");
4497 verifyGoogleFormat("A<A<A<int> > > a;");
4498 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00004499 verifyGoogleFormat("A<::A<int>> a;");
4500 verifyGoogleFormat("A<::A> a;");
4501 verifyGoogleFormat("A< ::A> a;");
4502 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004503 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
4504 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00004505 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
4506 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00004507 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
4508 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00004509
Nico Weber7533b4d2014-09-24 17:17:32 +00004510 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
4511
Daniel Jasperf7935112012-12-03 18:12:45 +00004512 verifyFormat("test >> a >> b;");
4513 verifyFormat("test << a >> b;");
4514
4515 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004516 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00004517 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00004518 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
4519 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00004520 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00004521 verifyFormat("f(a.operator()<A>());");
4522 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4523 " .template operator()<A>());",
4524 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00004525
4526 // Not template parameters.
4527 verifyFormat("return a < b && c > d;");
4528 verifyFormat("void f() {\n"
4529 " while (a < b && c > d) {\n"
4530 " }\n"
4531 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00004532 verifyFormat("template <typename... Types>\n"
4533 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00004534
4535 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4536 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
4537 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00004538 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00004539 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00004540 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00004541}
4542
Malcolm Parsons6af3f142016-11-03 16:57:30 +00004543TEST_F(FormatTest, BitshiftOperatorWidth) {
4544 EXPECT_EQ("int a = 1 << 2; /* foo\n"
4545 " bar */",
4546 format("int a=1<<2; /* foo\n"
4547 " bar */"));
4548
4549 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
4550 " bar */",
4551 format("int b =256>>1 ; /* foo\n"
4552 " bar */"));
4553}
4554
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00004555TEST_F(FormatTest, UnderstandsBinaryOperators) {
4556 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00004557 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00004558}
4559
4560TEST_F(FormatTest, UnderstandsPointersToMembers) {
4561 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00004562 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00004563 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004564 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00004565 verifyFormat("void f() {\n"
4566 " (a->*f)();\n"
4567 " a->*x;\n"
4568 " (a.*f)();\n"
4569 " ((*a).*f)();\n"
4570 " a.*x;\n"
4571 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00004572 verifyFormat("void f() {\n"
4573 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
4574 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
4575 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00004576 verifyFormat(
4577 "(aaaaaaaaaa->*bbbbbbb)(\n"
4578 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004579 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00004580 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004581 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00004582}
4583
Daniel Jasper8dd40472012-12-21 09:41:31 +00004584TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00004585 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00004586 verifyFormat("f(-1, -2, -3);");
4587 verifyFormat("a[-1] = 5;");
4588 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004589 verifyFormat("if (i == -1) {\n}");
4590 verifyFormat("if (i != -1) {\n}");
4591 verifyFormat("if (i > -1) {\n}");
4592 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00004593 verifyFormat("++(a->f());");
4594 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00004595 verifyFormat("(a->f())++;");
4596 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004597 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00004598
4599 verifyFormat("a-- > b;");
4600 verifyFormat("b ? -a : c;");
4601 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00004602 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00004603 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00004604 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00004605
4606 verifyFormat("return -1;");
4607 verifyFormat("switch (a) {\n"
4608 "case -1:\n"
4609 " break;\n"
4610 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00004611 verifyFormat("#define X -1");
4612 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00004613
Chandler Carruthf8b72662014-03-02 12:37:31 +00004614 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
4615 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00004616
4617 verifyFormat("int a = /* confusing comment */ -1;");
4618 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
4619 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004620}
4621
Daniel Jasper0c214fa2014-02-05 13:43:04 +00004622TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00004623 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00004624 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00004625 "}");
4626 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00004627 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00004628 verifyFormat("*aaa = aaaaaaa( // break\n"
4629 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00004630}
4631
Daniel Jasper8863ada2013-08-26 08:10:17 +00004632TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00004633 verifyFormat("bool operator<();");
4634 verifyFormat("bool operator>();");
4635 verifyFormat("bool operator=();");
4636 verifyFormat("bool operator==();");
4637 verifyFormat("bool operator!=();");
4638 verifyFormat("int operator+();");
4639 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00004640 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004641 verifyFormat("bool operator();");
4642 verifyFormat("bool operator()();");
4643 verifyFormat("bool operator[]();");
4644 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004645 verifyFormat("operator int();");
4646 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004647 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004648 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00004649 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004650 verifyFormat("void *operator new(std::size_t size);");
4651 verifyFormat("void *operator new[](std::size_t size);");
4652 verifyFormat("void operator delete(void *ptr);");
4653 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00004654 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
4655 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00004656 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00004657 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004658
Daniel Jasper0af92eb2013-02-15 19:24:08 +00004659 verifyFormat(
4660 "ostream &operator<<(ostream &OutputStream,\n"
4661 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00004662 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
4663 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
4664 " return left.group < right.group;\n"
4665 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00004666 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00004667 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00004668
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004669 verifyGoogleFormat("operator void*();");
4670 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00004671 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00004672
4673 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00004674 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
4675 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004676}
4677
Daniel Jasper1c220482015-02-25 10:30:06 +00004678TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00004679 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
4680 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
4681 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
4682 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
4683 verifyFormat("Deleted &operator=(const Deleted &) &;");
4684 verifyFormat("Deleted &operator=(const Deleted &) &&;");
4685 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
4686 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
4687 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
4688 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
4689 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00004690 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00004691 verifyFormat("template <typename T>\n"
4692 "void F(T) && = delete;",
4693 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00004694
Daniel Jasperaf642c62015-08-25 13:40:51 +00004695 FormatStyle AlignLeft = getLLVMStyle();
4696 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00004697 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00004698 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
4699 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
4700 AlignLeft);
4701 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
4702 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00004703 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
4704 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
4705 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
4706 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00004707 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00004708
4709 FormatStyle Spaces = getLLVMStyle();
4710 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00004711 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
4712 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
4713 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
4714 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00004715
4716 Spaces.SpacesInCStyleCastParentheses = false;
4717 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00004718 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
4719 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
4720 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
4721 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00004722}
4723
Daniel Jasperd6a947f2013-01-11 16:09:04 +00004724TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00004725 verifyFormat("void f() {\n"
4726 " A *a = new A;\n"
4727 " A *a = new (placement) A;\n"
4728 " delete a;\n"
4729 " delete (A *)a;\n"
4730 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00004731 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
4732 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00004733 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4734 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
4735 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00004736 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00004737}
4738
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00004739TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004740 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004741 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00004742 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004743 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004744 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004745 verifyIndependentOfContext("int a = b * 10;");
4746 verifyIndependentOfContext("int a = 10 * b;");
4747 verifyIndependentOfContext("int a = b * c;");
4748 verifyIndependentOfContext("int a += b * c;");
4749 verifyIndependentOfContext("int a -= b * c;");
4750 verifyIndependentOfContext("int a *= b * c;");
4751 verifyIndependentOfContext("int a /= b * c;");
4752 verifyIndependentOfContext("int a = *b;");
4753 verifyIndependentOfContext("int a = *b * c;");
4754 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00004755 verifyIndependentOfContext("int a = b * (10);");
4756 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004757 verifyIndependentOfContext("return 10 * b;");
4758 verifyIndependentOfContext("return *b * *c;");
4759 verifyIndependentOfContext("return a & ~b;");
4760 verifyIndependentOfContext("f(b ? *c : *d);");
4761 verifyIndependentOfContext("int a = b ? *c : *d;");
4762 verifyIndependentOfContext("*b = a;");
4763 verifyIndependentOfContext("a * ~b;");
4764 verifyIndependentOfContext("a * !b;");
4765 verifyIndependentOfContext("a * +b;");
4766 verifyIndependentOfContext("a * -b;");
4767 verifyIndependentOfContext("a * ++b;");
4768 verifyIndependentOfContext("a * --b;");
4769 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00004770 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004771 verifyIndependentOfContext("f() * b;");
4772 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00004773 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004774 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00004775 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004776 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00004777 verifyIndependentOfContext("return sizeof(int **);");
4778 verifyIndependentOfContext("return sizeof(int ******);");
4779 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00004780 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004781 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00004782 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00004783 verifyGoogleFormat("return sizeof(int**);");
4784 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
4785 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00004786 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00004787 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00004788 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00004789 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00004790 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00004791 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00004792 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00004793 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00004794 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00004795 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00004796 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00004797 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00004798 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00004799 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00004800 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00004801 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00004802 verifyFormat("void f(const MyOverride &override);");
4803 verifyFormat("void f(const MyFinal &final);");
4804 verifyIndependentOfContext("bool a = f() && override.f();");
4805 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00004806
Daniel Jasper5b49f472013-01-23 12:10:53 +00004807 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00004808
Daniel Jasper5b49f472013-01-23 12:10:53 +00004809 verifyIndependentOfContext("A<int *> a;");
4810 verifyIndependentOfContext("A<int **> a;");
4811 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00004812 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00004813 verifyIndependentOfContext(
4814 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004815 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00004816 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00004817 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00004818 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00004819 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00004820
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00004821 verifyFormat(
4822 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4823 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4824
Daniel Jasper1f5d6372016-06-13 14:45:12 +00004825 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00004826 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00004827 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004828 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00004829 verifyGoogleFormat("A<int*> a;");
4830 verifyGoogleFormat("A<int**> a;");
4831 verifyGoogleFormat("A<int*, int*> a;");
4832 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00004833 verifyGoogleFormat("f(b ? *c : *d);");
4834 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00004835 verifyGoogleFormat("Type* t = **x;");
4836 verifyGoogleFormat("Type* t = *++*x;");
4837 verifyGoogleFormat("*++*x;");
4838 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
4839 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00004840 verifyGoogleFormat(
4841 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00004842 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00004843 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
4844 verifyGoogleFormat("template <typename T>\n"
4845 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00004846
Daniel Jasper1904e9b2014-08-14 10:53:19 +00004847 FormatStyle Left = getLLVMStyle();
4848 Left.PointerAlignment = FormatStyle::PAS_Left;
4849 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00004850 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00004851 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00004852
Daniel Jasper5b49f472013-01-23 12:10:53 +00004853 verifyIndependentOfContext("a = *(x + y);");
4854 verifyIndependentOfContext("a = &(x + y);");
4855 verifyIndependentOfContext("*(x + y).call();");
4856 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004857 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00004858
Daniel Jasper5b49f472013-01-23 12:10:53 +00004859 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00004860 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00004861 "int *MyValues = {\n"
4862 " *A, // Operator detection might be confused by the '{'\n"
4863 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00004864 "};");
Nico Weber80a82762013-01-17 17:17:19 +00004865
Daniel Jasper5b49f472013-01-23 12:10:53 +00004866 verifyIndependentOfContext("if (int *a = &b)");
4867 verifyIndependentOfContext("if (int &a = *b)");
4868 verifyIndependentOfContext("if (a & b[i])");
4869 verifyIndependentOfContext("if (a::b::c::d & b[i])");
4870 verifyIndependentOfContext("if (*b[i])");
4871 verifyIndependentOfContext("if (int *a = (&b))");
4872 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00004873 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00004874 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00004875 verifyFormat("void f() {\n"
4876 " for (const int &v : Values) {\n"
4877 " }\n"
4878 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00004879 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
4880 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00004881 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00004882
Daniel Jaspera98da3d2013-11-07 19:56:07 +00004883 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00004884 verifyFormat("#define MACRO \\\n"
4885 " int *i = a * b; \\\n"
4886 " void f(a *b);",
4887 getLLVMStyleWithColumns(19));
4888
Daniel Jasper97b89482013-03-13 07:49:51 +00004889 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004890 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00004891 verifyIndependentOfContext("T **t = new T *;");
4892 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00004893 verifyGoogleFormat("A = new SomeType*[Length]();");
4894 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00004895 verifyGoogleFormat("T** t = new T*;");
4896 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00004897
Daniel Jasper990ff972013-05-07 14:17:18 +00004898 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00004899 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00004900 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00004901 verifyFormat("STATIC_ASSERT((a & b) == 0);");
4902 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00004903 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00004904 "typename t::if<x && y>::type f() {}");
4905 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00004906 verifyFormat("vector<int *> v;");
4907 verifyFormat("vector<int *const> v;");
4908 verifyFormat("vector<int *const **const *> v;");
4909 verifyFormat("vector<int *volatile> v;");
4910 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00004911 verifyFormat("foo<b && false>();");
4912 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00004913 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00004914 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004915 "template <class T, class = typename std::enable_if<\n"
4916 " std::is_integral<T>::value &&\n"
4917 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
4918 "void F();",
4919 getLLVMStyleWithColumns(70));
4920 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004921 "template <class T,\n"
4922 " class = typename std::enable_if<\n"
4923 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004924 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
4925 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00004926 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004927 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00004928 verifyFormat(
4929 "template <class T,\n"
4930 " class = typename ::std::enable_if<\n"
4931 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
4932 "void F();",
4933 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00004934
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00004935 verifyIndependentOfContext("MACRO(int *i);");
4936 verifyIndependentOfContext("MACRO(auto *a);");
4937 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00004938 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00004939 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00004940 // FIXME: Is there a way to make this work?
4941 // verifyIndependentOfContext("MACRO(A *a);");
4942
Daniel Jasper32ccb032014-06-23 07:36:18 +00004943 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00004944 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00004945
Daniel Jasper866468a2014-04-14 13:15:29 +00004946 EXPECT_EQ("#define OP(x) \\\n"
4947 " ostream &operator<<(ostream &s, const A &a) { \\\n"
4948 " return s << a.DebugString(); \\\n"
4949 " }",
4950 format("#define OP(x) \\\n"
4951 " ostream &operator<<(ostream &s, const A &a) { \\\n"
4952 " return s << a.DebugString(); \\\n"
4953 " }",
4954 getLLVMStyleWithColumns(50)));
4955
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00004956 // FIXME: We cannot handle this case yet; we might be able to figure out that
4957 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00004958 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00004959
4960 FormatStyle PointerMiddle = getLLVMStyle();
4961 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
4962 verifyFormat("delete *x;", PointerMiddle);
4963 verifyFormat("int * x;", PointerMiddle);
4964 verifyFormat("template <int * y> f() {}", PointerMiddle);
4965 verifyFormat("int * f(int * a) {}", PointerMiddle);
4966 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
4967 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
4968 verifyFormat("A<int *> a;", PointerMiddle);
4969 verifyFormat("A<int **> a;", PointerMiddle);
4970 verifyFormat("A<int *, int *> a;", PointerMiddle);
4971 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00004972 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
4973 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00004974 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00004975
4976 // Member function reference qualifiers aren't binary operators.
4977 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00004978 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00004979 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00004980 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00004981 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00004982 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004983}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004984
Daniel Jasperee6d6502013-07-17 20:25:02 +00004985TEST_F(FormatTest, UnderstandsAttributes) {
4986 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00004987 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
4988 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00004989 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004990 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00004991 verifyFormat("__attribute__((nodebug)) void\n"
4992 "foo() {}\n",
4993 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00004994}
4995
Daniel Jasper10cd5812013-05-06 06:35:44 +00004996TEST_F(FormatTest, UnderstandsEllipsis) {
4997 verifyFormat("int printf(const char *fmt, ...);");
4998 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00004999 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5000
5001 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005002 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005003 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005004}
5005
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005006TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005007 EXPECT_EQ("int *a;\n"
5008 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005009 "int *a;",
5010 format("int *a;\n"
5011 "int* a;\n"
5012 "int *a;",
5013 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005014 EXPECT_EQ("int* a;\n"
5015 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005016 "int* a;",
5017 format("int* a;\n"
5018 "int* a;\n"
5019 "int *a;",
5020 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005021 EXPECT_EQ("int *a;\n"
5022 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005023 "int *a;",
5024 format("int *a;\n"
5025 "int * a;\n"
5026 "int * a;",
5027 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005028 EXPECT_EQ("auto x = [] {\n"
5029 " int *a;\n"
5030 " int *a;\n"
5031 " int *a;\n"
5032 "};",
5033 format("auto x=[]{int *a;\n"
5034 "int * a;\n"
5035 "int * a;};",
5036 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005037}
5038
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005039TEST_F(FormatTest, UnderstandsRvalueReferences) {
5040 verifyFormat("int f(int &&a) {}");
5041 verifyFormat("int f(int a, char &&b) {}");
5042 verifyFormat("void f() { int &&a = b; }");
5043 verifyGoogleFormat("int f(int a, char&& b) {}");
5044 verifyGoogleFormat("void f() { int&& a = b; }");
5045
Daniel Jasper1eff9082013-05-27 16:36:33 +00005046 verifyIndependentOfContext("A<int &&> a;");
5047 verifyIndependentOfContext("A<int &&, int &&> a;");
5048 verifyGoogleFormat("A<int&&> a;");
5049 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00005050
5051 // Not rvalue references:
5052 verifyFormat("template <bool B, bool C> class A {\n"
5053 " static_assert(B && C, \"Something is wrong\");\n"
5054 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00005055 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
5056 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00005057 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005058}
5059
Manuel Klimekc1237a82013-01-23 14:08:21 +00005060TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
5061 verifyFormat("void f() {\n"
5062 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005063 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005064 "}",
5065 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00005066}
5067
Daniel Jasperef906a92013-01-13 08:01:36 +00005068TEST_F(FormatTest, FormatsCasts) {
5069 verifyFormat("Type *A = static_cast<Type *>(P);");
5070 verifyFormat("Type *A = (Type *)P;");
5071 verifyFormat("Type *A = (vector<Type *, int *>)P;");
5072 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00005073 verifyFormat("int a = (int)2.0f;");
5074 verifyFormat("x[(int32)y];");
5075 verifyFormat("x = (int32)y;");
5076 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
5077 verifyFormat("int a = (int)*b;");
5078 verifyFormat("int a = (int)2.0f;");
5079 verifyFormat("int a = (int)~0;");
5080 verifyFormat("int a = (int)++a;");
5081 verifyFormat("int a = (int)sizeof(int);");
5082 verifyFormat("int a = (int)+2;");
5083 verifyFormat("my_int a = (my_int)2.0f;");
5084 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00005085 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00005086 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005087 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00005088 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00005089 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00005090
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005091 verifyFormat("void f() { my_int a = (my_int)*b; }");
5092 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
5093 verifyFormat("my_int a = (my_int)~0;");
5094 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005095 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005096 verifyFormat("my_int a = (my_int)1;");
5097 verifyFormat("my_int a = (my_int *)1;");
5098 verifyFormat("my_int a = (const my_int)-1;");
5099 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00005100 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00005101 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00005102 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00005103 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005104
5105 // FIXME: single value wrapped with paren will be treated as cast.
5106 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00005107
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00005108 verifyFormat("{ (void)F; }");
5109
Daniel Jasper998cabc2013-07-18 14:46:07 +00005110 // Don't break after a cast's
5111 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5112 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
5113 " bbbbbbbbbbbbbbbbbbbbbb);");
5114
Daniel Jasperef906a92013-01-13 08:01:36 +00005115 // These are not casts.
5116 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005117 verifyFormat("f(foo)->b;");
5118 verifyFormat("f(foo).b;");
5119 verifyFormat("f(foo)(b);");
5120 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005121 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00005122 verifyFormat("(*funptr)(foo)[4];");
5123 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005124 verifyFormat("void f(int *);");
5125 verifyFormat("void f(int *) = 0;");
5126 verifyFormat("void f(SmallVector<int>) {}");
5127 verifyFormat("void f(SmallVector<int>);");
5128 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00005129 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005130 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005131 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00005132 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
5133 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00005134 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005135
Daniel Jasperba0bda92013-02-23 08:07:18 +00005136 // These are not casts, but at some point were confused with casts.
5137 verifyFormat("virtual void foo(int *) override;");
5138 verifyFormat("virtual void foo(char &) const;");
5139 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00005140 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005141 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00005142 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00005143 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00005144
5145 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
5146 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005147 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005148 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005149 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5150 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
5151 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005152}
5153
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005154TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005155 verifyFormat("A<bool()> a;");
5156 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00005157 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005158 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005159 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005160 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005161 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00005162 verifyFormat("template <class CallbackClass>\n"
5163 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005164
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005165 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
5166 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00005167 verifyGoogleFormat(
5168 "template <class CallbackClass>\n"
5169 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00005170
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005171 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00005172 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005173 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00005174 verifyFormat("some_var = function(*some_pointer_var)[0];");
5175 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00005176 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00005177 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005178}
5179
Daniel Jasperbeaa3222015-02-26 11:30:50 +00005180TEST_F(FormatTest, FormatsPointersToArrayTypes) {
5181 verifyFormat("A (*foo_)[6];");
5182 verifyFormat("vector<int> (*foo_)[6];");
5183}
5184
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005185TEST_F(FormatTest, BreaksLongVariableDeclarations) {
5186 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5187 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
5188 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
5189 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00005190 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5191 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005192
5193 // Different ways of ()-initializiation.
5194 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5195 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
5196 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5197 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
5198 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5199 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00005200 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5201 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00005202
5203 // Lambdas should not confuse the variable declaration heuristic.
5204 verifyFormat("LooooooooooooooooongType\n"
5205 " variable(nullptr, [](A *a) {});",
5206 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005207}
5208
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005209TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00005210 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005211 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005212 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005213 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00005214 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005215 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00005216 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
5217 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00005218 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5219 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00005220 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
5221 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00005222 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5223 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00005224 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5225 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005226 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5227 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
5228 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5229 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00005230 FormatStyle Indented = getLLVMStyle();
5231 Indented.IndentWrappedFunctionNames = true;
5232 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5233 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
5234 Indented);
5235 verifyFormat(
5236 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5237 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5238 Indented);
5239 verifyFormat(
5240 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5241 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5242 Indented);
5243 verifyFormat(
5244 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5245 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5246 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00005247
5248 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00005249 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
5250 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
5251 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00005252
Daniel Jasperd2639ef2013-01-28 15:16:31 +00005253 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005254 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00005255 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00005256 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
5257 " SourceLocation L, IdentifierIn *II,\n"
5258 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005259 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005260 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005261 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005262 " const SomeType<string, SomeOtherTemplateParameter>\n"
5263 " &ReallyReallyLongParameterName,\n"
5264 " const SomeType<string, SomeOtherTemplateParameter>\n"
5265 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00005266 verifyFormat("template <typename A>\n"
5267 "SomeLoooooooooooooooooooooongType<\n"
5268 " typename some_namespace::SomeOtherType<A>::Type>\n"
5269 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005270
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00005271 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00005272 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
5273 " aaaaaaaaaaaaaaaaaaaaaaa;");
5274 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005275 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
5276 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005277 verifyGoogleFormat(
5278 "some_namespace::LongReturnType\n"
5279 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005280 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005281
5282 verifyGoogleFormat("template <typename T>\n"
5283 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005284 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00005285 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5286 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00005287
5288 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005289 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5290 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00005291 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5292 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
5293 " aaaaaaaaaaaaaaaaaaaaaaaa);");
5294 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5295 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5296 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
5297 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00005298}
5299
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005300TEST_F(FormatTest, FormatsArrays) {
5301 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5302 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00005303 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
5304 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00005305 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5306 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005307 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5308 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5309 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5310 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
5311 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5312 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5313 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5314 verifyFormat(
5315 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
5316 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5317 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00005318 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
5319 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00005320
5321 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
5322 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00005323 verifyFormat(
5324 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
5325 " .aaaaaaa[0]\n"
5326 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00005327 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00005328
5329 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00005330
5331 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
5332 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005333}
5334
Daniel Jaspere9de2602012-12-06 09:56:08 +00005335TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
5336 verifyFormat("(a)->b();");
5337 verifyFormat("--a;");
5338}
5339
Daniel Jasper8b529712012-12-04 13:02:32 +00005340TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00005341 verifyFormat("#include <string>\n"
5342 "#include <a/b/c.h>\n"
5343 "#include \"a/b/string\"\n"
5344 "#include \"string.h\"\n"
5345 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00005346 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005347 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00005348 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00005349 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00005350 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005351 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
5352 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00005353 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
5354 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00005355
Daniel Jasper5ef433f2013-01-13 08:12:18 +00005356 verifyFormat("#import <string>");
5357 verifyFormat("#import <a/b/c.h>");
5358 verifyFormat("#import \"a/b/string\"");
5359 verifyFormat("#import \"string.h\"");
5360 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00005361 verifyFormat("#if __has_include(<strstream>)\n"
5362 "#include <strstream>\n"
5363 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005364
Daniel Jasper343643b2014-08-13 08:29:18 +00005365 verifyFormat("#define MY_IMPORT <a/b>");
5366
Nico Weber21088802017-02-10 19:36:52 +00005367 verifyFormat("#if __has_include(<a/b>)");
5368 verifyFormat("#if __has_include_next(<a/b>)");
5369 verifyFormat("#define F __has_include(<a/b>)");
5370 verifyFormat("#define F __has_include_next(<a/b>)");
5371
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005372 // Protocol buffer definition or missing "#".
5373 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
5374 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00005375
5376 FormatStyle Style = getLLVMStyle();
5377 Style.AlwaysBreakBeforeMultilineStrings = true;
5378 Style.ColumnLimit = 0;
5379 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00005380
5381 // But 'import' might also be a regular C++ namespace.
5382 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5383 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00005384}
5385
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005386//===----------------------------------------------------------------------===//
5387// Error recovery tests.
5388//===----------------------------------------------------------------------===//
5389
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005390TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005391 FormatStyle NoBinPacking = getLLVMStyle();
5392 NoBinPacking.BinPackParameters = false;
5393 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
5394 " double *min_x,\n"
5395 " double *max_x,\n"
5396 " double *min_y,\n"
5397 " double *max_y,\n"
5398 " double *min_z,\n"
5399 " double *max_z, ) {}",
5400 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005401}
5402
Daniel Jasper83a54d22013-01-10 09:26:47 +00005403TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00005404 verifyFormat("void f() { return; }\n42");
5405 verifyFormat("void f() {\n"
5406 " if (0)\n"
5407 " return;\n"
5408 "}\n"
5409 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00005410 verifyFormat("void f() { return }\n42");
5411 verifyFormat("void f() {\n"
5412 " if (0)\n"
5413 " return\n"
5414 "}\n"
5415 "42");
5416}
5417
5418TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
5419 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
5420 EXPECT_EQ("void f() {\n"
5421 " if (a)\n"
5422 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005423 "}",
5424 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00005425 EXPECT_EQ("namespace N {\n"
5426 "void f()\n"
5427 "}",
5428 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00005429 EXPECT_EQ("namespace N {\n"
5430 "void f() {}\n"
5431 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005432 "}",
5433 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00005434}
5435
Daniel Jasper2df93312013-01-09 10:16:05 +00005436TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
5437 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00005438 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005439 " b;",
5440 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00005441 verifyFormat("function(\n"
5442 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005443 " LoooooooooooongArgument);\n",
5444 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00005445}
5446
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005447TEST_F(FormatTest, IncorrectAccessSpecifier) {
5448 verifyFormat("public:");
5449 verifyFormat("class A {\n"
5450 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005451 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005452 "};");
5453 verifyFormat("public\n"
5454 "int qwerty;");
5455 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005456 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005457 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005458 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005459 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005460 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005461}
Daniel Jasperf7935112012-12-03 18:12:45 +00005462
Daniel Jasper291f9362013-03-20 15:58:10 +00005463TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
5464 verifyFormat("{");
5465 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00005466 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00005467}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005468
5469TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005470 verifyFormat("do {\n}");
5471 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005472 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005473 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005474 "wheeee(fun);");
5475 verifyFormat("do {\n"
5476 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00005477 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005478}
5479
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005480TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00005481 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005482 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00005483 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005484 verifyFormat("while {\n foo;\n foo();\n}");
5485 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00005486}
5487
Daniel Jasperc0880a92013-01-04 18:52:56 +00005488TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00005489 verifyIncompleteFormat("namespace {\n"
5490 "class Foo { Foo (\n"
5491 "};\n"
5492 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00005493}
5494
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005495TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005496 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005497 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
5498 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005499 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005500
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005501 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005502 " {\n"
5503 " breakme(\n"
5504 " qwe);\n"
5505 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005506 format("{\n"
5507 " {\n"
5508 " breakme(qwe);\n"
5509 "}\n",
5510 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005511}
5512
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00005513TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005514 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005515 " avariable,\n"
5516 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005517 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00005518}
5519
Manuel Klimek762dd182013-01-21 10:07:49 +00005520TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005521 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00005522}
5523
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005524TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00005525 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00005526 verifyFormat("vector<int> x{\n"
5527 " 1, 2, 3, 4,\n"
5528 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005529 verifyFormat("vector<T> x{{}, {}, {}, {}};");
5530 verifyFormat("f({1, 2});");
5531 verifyFormat("auto v = Foo{-1};");
5532 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
5533 verifyFormat("Class::Class : member{1, 2, 3} {}");
5534 verifyFormat("new vector<int>{1, 2, 3};");
5535 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00005536 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005537 verifyFormat("return {arg1, arg2};");
5538 verifyFormat("return {arg1, SomeType{parameter}};");
5539 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
5540 verifyFormat("new T{arg1, arg2};");
5541 verifyFormat("f(MyMap[{composite, key}]);");
5542 verifyFormat("class Class {\n"
5543 " T member = {arg1, arg2};\n"
5544 "};");
5545 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00005546 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
5547 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00005548
Daniel Jasper438059e2014-05-22 12:11:13 +00005549 verifyFormat("int foo(int i) { return fo1{}(i); }");
5550 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005551 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00005552 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00005553 verifyFormat("Node n{1, Node{1000}, //\n"
5554 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00005555 verifyFormat("Aaaa aaaaaaa{\n"
5556 " {\n"
5557 " aaaa,\n"
5558 " },\n"
5559 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00005560 verifyFormat("class C : public D {\n"
5561 " SomeClass SC{2};\n"
5562 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00005563 verifyFormat("class C : public A {\n"
5564 " class D : public B {\n"
5565 " void f() { int i{2}; }\n"
5566 " };\n"
5567 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00005568 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00005569
Daniel Jaspere4ada022016-12-13 10:05:03 +00005570 // Cases where distinguising braced lists and blocks is hard.
5571 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
5572 verifyFormat("void f() {\n"
5573 " return; // comment\n"
5574 "}\n"
5575 "SomeType t;");
5576 verifyFormat("void f() {\n"
5577 " if (a) {\n"
5578 " f();\n"
5579 " }\n"
5580 "}\n"
5581 "SomeType t;");
5582
Daniel Jasper08434342015-05-26 07:26:26 +00005583 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005584 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00005585 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005586 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
5587 " bbbbb,\n"
5588 " ccccc,\n"
5589 " ddddd,\n"
5590 " eeeee,\n"
5591 " ffffff,\n"
5592 " ggggg,\n"
5593 " hhhhhh,\n"
5594 " iiiiii,\n"
5595 " jjjjjj,\n"
5596 " kkkkkk};",
5597 NoBinPacking);
5598 verifyFormat("const Aaaaaa aaaaa = {\n"
5599 " aaaaa,\n"
5600 " bbbbb,\n"
5601 " ccccc,\n"
5602 " ddddd,\n"
5603 " eeeee,\n"
5604 " ffffff,\n"
5605 " ggggg,\n"
5606 " hhhhhh,\n"
5607 " iiiiii,\n"
5608 " jjjjjj,\n"
5609 " kkkkkk,\n"
5610 "};",
5611 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00005612 verifyFormat(
5613 "const Aaaaaa aaaaa = {\n"
5614 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
5615 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
5616 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
5617 "};",
5618 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005619
Chandler Carruthf8b72662014-03-02 12:37:31 +00005620 // FIXME: The alignment of these trailing comments might be bad. Then again,
5621 // this might be utterly useless in real code.
5622 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00005623 " : some_value{ //\n"
5624 " aaaaaaa, //\n"
5625 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00005626
Chandler Carruthf8b72662014-03-02 12:37:31 +00005627 // In braced lists, the first comment is always assumed to belong to the
5628 // first element. Thus, it can be moved to the next or previous line as
5629 // appropriate.
5630 EXPECT_EQ("function({// First element:\n"
5631 " 1,\n"
5632 " // Second element:\n"
5633 " 2});",
5634 format("function({\n"
5635 " // First element:\n"
5636 " 1,\n"
5637 " // Second element:\n"
5638 " 2});"));
5639 EXPECT_EQ("std::vector<int> MyNumbers{\n"
5640 " // First element:\n"
5641 " 1,\n"
5642 " // Second element:\n"
5643 " 2};",
5644 format("std::vector<int> MyNumbers{// First element:\n"
5645 " 1,\n"
5646 " // Second element:\n"
5647 " 2};",
5648 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00005649 // A trailing comma should still lead to an enforced line break.
5650 EXPECT_EQ("vector<int> SomeVector = {\n"
5651 " // aaa\n"
5652 " 1, 2,\n"
5653 "};",
5654 format("vector<int> SomeVector = { // aaa\n"
5655 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00005656
Chandler Carruthf8b72662014-03-02 12:37:31 +00005657 FormatStyle ExtraSpaces = getLLVMStyle();
5658 ExtraSpaces.Cpp11BracedListStyle = false;
5659 ExtraSpaces.ColumnLimit = 75;
5660 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
5661 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
5662 verifyFormat("f({ 1, 2 });", ExtraSpaces);
5663 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
5664 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
5665 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
5666 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
5667 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
5668 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
5669 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
5670 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
5671 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
5672 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
5673 verifyFormat("class Class {\n"
5674 " T member = { arg1, arg2 };\n"
5675 "};",
5676 ExtraSpaces);
5677 verifyFormat(
5678 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5679 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
5680 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
5681 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
5682 ExtraSpaces);
5683 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00005684 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00005685 ExtraSpaces);
5686 verifyFormat(
5687 "someFunction(OtherParam,\n"
5688 " BracedList{ // comment 1 (Forcing interesting break)\n"
5689 " param1, param2,\n"
5690 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00005691 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00005692 ExtraSpaces);
5693 verifyFormat(
5694 "std::this_thread::sleep_for(\n"
5695 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
5696 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00005697 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00005698 " aaaaaaa,\n"
5699 " aaaaaaaaaa,\n"
5700 " aaaaa,\n"
5701 " aaaaaaaaaaaaaaa,\n"
5702 " aaa,\n"
5703 " aaaaaaaaaa,\n"
5704 " a,\n"
5705 " aaaaaaaaaaaaaaaaaaaaa,\n"
5706 " aaaaaaaaaaaa,\n"
5707 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
5708 " aaaaaaa,\n"
5709 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005710 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00005711}
5712
Daniel Jasper33b909c2013-10-25 14:29:37 +00005713TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00005714 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5715 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5716 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5717 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5718 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5719 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00005720 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005721 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00005722 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005723 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5724 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005725 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00005726 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5727 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5728 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
5729 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5730 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5731 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5732 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005733 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005734 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5735 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00005736 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
5737 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5738 " // Separating comment.\n"
5739 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
5740 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
5741 " // Leading comment\n"
5742 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5743 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005744 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5745 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005746 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00005747 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5748 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005749 getLLVMStyleWithColumns(38));
5750 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005751 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
5752 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005753 verifyFormat(
5754 "static unsigned SomeValues[10][3] = {\n"
5755 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
5756 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
5757 verifyFormat("static auto fields = new vector<string>{\n"
5758 " \"aaaaaaaaaaaaa\",\n"
5759 " \"aaaaaaaaaaaaa\",\n"
5760 " \"aaaaaaaaaaaa\",\n"
5761 " \"aaaaaaaaaaaaaa\",\n"
5762 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
5763 " \"aaaaaaaaaaaa\",\n"
5764 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
5765 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00005766 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
5767 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
5768 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
5769 " 3, cccccccccccccccccccccc};",
5770 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00005771
5772 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00005773 verifyFormat("vector<int> x = {\n"
5774 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
5775 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00005776 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00005777 verifyFormat("vector<int> x = {\n"
5778 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00005779 "};",
5780 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00005781 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5782 " 1, 1, 1, 1,\n"
5783 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00005784 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005785
Daniel Jasper60c27072015-05-13 08:16:00 +00005786 // Trailing comment in the first line.
5787 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
5788 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
5789 " 111111111, 222222222, 3333333333, 444444444, //\n"
5790 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00005791 // Trailing comment in the last line.
5792 verifyFormat("int aaaaa[] = {\n"
5793 " 1, 2, 3, // comment\n"
5794 " 4, 5, 6 // comment\n"
5795 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00005796
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005797 // With nested lists, we should either format one item per line or all nested
5798 // lists one on line.
5799 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00005800 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
5801 " {aaaaaaaaaaaaaaaaaaa},\n"
5802 " {aaaaaaaaaaaaaaaaaaaaa},\n"
5803 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00005804 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00005805 verifyFormat(
5806 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005807 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
5808 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
5809 " {aaa, aaa},\n"
5810 " {aaa, aaa},\n"
5811 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
5812 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
5813 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00005814
5815 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00005816 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
5817 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00005818
5819 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00005820
Daniel Jaspereb65e912015-12-21 18:31:15 +00005821 // No braced initializer here.
5822 verifyFormat("void f() {\n"
5823 " struct Dummy {};\n"
5824 " f(v);\n"
5825 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00005826
5827 // Long lists should be formatted in columns even if they are nested.
5828 verifyFormat(
5829 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5830 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5831 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5832 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5833 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5834 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00005835
5836 // Allow "single-column" layout even if that violates the column limit. There
5837 // isn't going to be a better way.
5838 verifyFormat("std::vector<int> a = {\n"
5839 " aaaaaaaa,\n"
5840 " aaaaaaaa,\n"
5841 " aaaaaaaa,\n"
5842 " aaaaaaaa,\n"
5843 " aaaaaaaaaa,\n"
5844 " aaaaaaaa,\n"
5845 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
5846 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00005847 verifyFormat("vector<int> aaaa = {\n"
5848 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5849 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5850 " aaaaaa.aaaaaaa,\n"
5851 " aaaaaa.aaaaaaa,\n"
5852 " aaaaaa.aaaaaaa,\n"
5853 " aaaaaa.aaaaaaa,\n"
5854 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00005855
5856 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005857 verifyFormat("someFunction(Param, {List1, List2,\n"
5858 " List3});",
5859 getLLVMStyleWithColumns(35));
5860 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00005861 " {List1, List2,\n"
5862 " List3});",
5863 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00005864 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
5865 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005866}
5867
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005868TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005869 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00005870 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005871
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005872 verifyFormat("void f() { return 42; }");
5873 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005874 " return 42;\n"
5875 "}",
5876 DoNotMerge);
5877 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005878 " // Comment\n"
5879 "}");
5880 verifyFormat("{\n"
5881 "#error {\n"
5882 " int a;\n"
5883 "}");
5884 verifyFormat("{\n"
5885 " int a;\n"
5886 "#error {\n"
5887 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00005888 verifyFormat("void f() {} // comment");
5889 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00005890 verifyFormat("void f() {\n"
5891 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005892 DoNotMerge);
5893 verifyFormat("void f() {\n"
5894 " int a;\n"
5895 "} // comment",
5896 DoNotMerge);
5897 verifyFormat("void f() {\n"
5898 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00005899 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005900
5901 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
5902 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
5903
5904 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
5905 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00005906 verifyFormat("class C {\n"
5907 " C()\n"
5908 " : iiiiiiii(nullptr),\n"
5909 " kkkkkkk(nullptr),\n"
5910 " mmmmmmm(nullptr),\n"
5911 " nnnnnnn(nullptr) {}\n"
5912 "};",
5913 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00005914
5915 FormatStyle NoColumnLimit = getLLVMStyle();
5916 NoColumnLimit.ColumnLimit = 0;
5917 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
5918 EXPECT_EQ("class C {\n"
5919 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005920 "};",
5921 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00005922 EXPECT_EQ("A()\n"
5923 " : b(0) {\n"
5924 "}",
5925 format("A()\n:b(0)\n{\n}", NoColumnLimit));
5926
5927 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00005928 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
5929 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00005930 EXPECT_EQ("A()\n"
5931 " : b(0) {\n"
5932 "}",
5933 format("A():b(0){}", DoNotMergeNoColumnLimit));
5934 EXPECT_EQ("A()\n"
5935 " : b(0) {\n"
5936 "}",
5937 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00005938
5939 verifyFormat("#define A \\\n"
5940 " void f() { \\\n"
5941 " int i; \\\n"
5942 " }",
5943 getLLVMStyleWithColumns(20));
5944 verifyFormat("#define A \\\n"
5945 " void f() { int i; }",
5946 getLLVMStyleWithColumns(21));
5947 verifyFormat("#define A \\\n"
5948 " void f() { \\\n"
5949 " int i; \\\n"
5950 " } \\\n"
5951 " int j;",
5952 getLLVMStyleWithColumns(22));
5953 verifyFormat("#define A \\\n"
5954 " void f() { int i; } \\\n"
5955 " int j;",
5956 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005957}
5958
Daniel Jasperd74cf402014-04-08 12:46:38 +00005959TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
5960 FormatStyle MergeInlineOnly = getLLVMStyle();
5961 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
5962 verifyFormat("class C {\n"
5963 " int f() { return 42; }\n"
5964 "};",
5965 MergeInlineOnly);
5966 verifyFormat("int f() {\n"
5967 " return 42;\n"
5968 "}",
5969 MergeInlineOnly);
5970}
5971
Manuel Klimeke01bab52013-01-15 13:38:33 +00005972TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
5973 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00005974 verifyFormat("struct foo a = {bar};\nint n;");
5975 verifyFormat("class foo a = {bar};\nint n;");
5976 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00005977
5978 // Elaborate types inside function definitions.
5979 verifyFormat("struct foo f() {}\nint n;");
5980 verifyFormat("class foo f() {}\nint n;");
5981 verifyFormat("union foo f() {}\nint n;");
5982
5983 // Templates.
5984 verifyFormat("template <class X> void f() {}\nint n;");
5985 verifyFormat("template <struct X> void f() {}\nint n;");
5986 verifyFormat("template <union X> void f() {}\nint n;");
5987
5988 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005989 verifyFormat("struct {\n} n;");
5990 verifyFormat(
5991 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00005992 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005993 verifyFormat("class MACRO Z {\n} n;");
5994 verifyFormat("class MACRO(X) Z {\n} n;");
5995 verifyFormat("class __attribute__(X) Z {\n} n;");
5996 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00005997 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00005998 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00005999 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6000 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006001
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006002 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006003 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006004
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006005 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006006 verifyFormat(
6007 "template <typename F>\n"
6008 "Matcher(const Matcher<F> &Other,\n"
6009 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6010 " !is_same<F, T>::value>::type * = 0)\n"
6011 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6012
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006013 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006014 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006015 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006016
6017 // FIXME:
6018 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006019 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006020
Manuel Klimeke01bab52013-01-15 13:38:33 +00006021 // Elaborate types where incorrectly parsing the structural element would
6022 // break the indent.
6023 verifyFormat("if (true)\n"
6024 " class X x;\n"
6025 "else\n"
6026 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006027
6028 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006029 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006030}
6031
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006032TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00006033 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
6034 format("#error Leave all white!!!!! space* alone!\n"));
6035 EXPECT_EQ(
6036 "#warning Leave all white!!!!! space* alone!\n",
6037 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006038 EXPECT_EQ("#error 1", format(" # error 1"));
6039 EXPECT_EQ("#warning 1", format(" # warning 1"));
6040}
6041
Daniel Jasper4431aa92013-04-23 13:54:04 +00006042TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00006043 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00006044 verifyFormat("#if (AAAA && BBBB)");
6045 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00006046 // FIXME: Come up with a better indentation for #elif.
6047 verifyFormat(
6048 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
6049 " defined(BBBBBBBB)\n"
6050 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
6051 " defined(BBBBBBBB)\n"
6052 "#endif",
6053 getLLVMStyleWithColumns(65));
6054}
6055
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006056TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
6057 FormatStyle AllowsMergedIf = getGoogleStyle();
6058 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
6059 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
6060 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00006061 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
6062 EXPECT_EQ("if (true) return 42;",
6063 format("if (true)\nreturn 42;", AllowsMergedIf));
6064 FormatStyle ShortMergedIf = AllowsMergedIf;
6065 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006066 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006067 " if (true) return 42;",
6068 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006069 verifyFormat("#define A \\\n"
6070 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006071 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006072 "#define B",
6073 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006074 verifyFormat("#define A \\\n"
6075 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006076 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006077 "g();",
6078 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00006079 verifyFormat("{\n"
6080 "#ifdef A\n"
6081 " // Comment\n"
6082 " if (true) continue;\n"
6083 "#endif\n"
6084 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00006085 " if (true) continue;\n"
6086 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006087 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00006088 ShortMergedIf.ColumnLimit = 29;
6089 verifyFormat("#define A \\\n"
6090 " if (aaaaaaaaaa) return 1; \\\n"
6091 " return 2;",
6092 ShortMergedIf);
6093 ShortMergedIf.ColumnLimit = 28;
6094 verifyFormat("#define A \\\n"
6095 " if (aaaaaaaaaa) \\\n"
6096 " return 1; \\\n"
6097 " return 2;",
6098 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006099}
6100
Manuel Klimekd33516e2013-01-23 10:09:28 +00006101TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006102 verifyFormat("void f(int *a);");
6103 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00006104 verifyFormat("class A {\n void f(int *a);\n};");
6105 verifyFormat("class A {\n int *a;\n};");
6106 verifyFormat("namespace a {\n"
6107 "namespace b {\n"
6108 "class A {\n"
6109 " void f() {}\n"
6110 " int *a;\n"
6111 "};\n"
6112 "}\n"
6113 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006114}
6115
Manuel Klimekd33516e2013-01-23 10:09:28 +00006116TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
6117 verifyFormat("while");
6118 verifyFormat("operator");
6119}
6120
Daniel Jasperfda47cd2016-10-31 13:23:00 +00006121TEST_F(FormatTest, SkipsDeeplyNestedLines) {
6122 // This code would be painfully slow to format if we didn't skip it.
6123 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
6124 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6125 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6126 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6127 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6128 "A(1, 1)\n"
6129 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
6130 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6131 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6132 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6133 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6134 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6135 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6136 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6137 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6138 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
6139 // Deeply nested part is untouched, rest is formatted.
6140 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
6141 format(std::string("int i;\n") + Code + "int j;\n",
6142 getLLVMStyle(), IC_ExpectIncomplete));
6143}
6144
Nico Weber7e6a7a12013-01-08 17:56:31 +00006145//===----------------------------------------------------------------------===//
6146// Objective-C tests.
6147//===----------------------------------------------------------------------===//
6148
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006149TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
6150 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
6151 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
6152 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00006153 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006154 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
6155 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
6156 format("-(NSInteger)Method3:(id)anObject;"));
6157 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
6158 format("-(NSInteger)Method4:(id)anObject;"));
6159 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
6160 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
6161 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
6162 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00006163 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6164 "forAllCells:(BOOL)flag;",
6165 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6166 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00006167
6168 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00006169 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
6170 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00006171 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
6172 " inRange:(NSRange)range\n"
6173 " outRange:(NSRange)out_range\n"
6174 " outRange1:(NSRange)out_range1\n"
6175 " outRange2:(NSRange)out_range2\n"
6176 " outRange3:(NSRange)out_range3\n"
6177 " outRange4:(NSRange)out_range4\n"
6178 " outRange5:(NSRange)out_range5\n"
6179 " outRange6:(NSRange)out_range6\n"
6180 " outRange7:(NSRange)out_range7\n"
6181 " outRange8:(NSRange)out_range8\n"
6182 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006183
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00006184 // When the function name has to be wrapped.
6185 FormatStyle Style = getLLVMStyle();
6186 Style.IndentWrappedFunctionNames = false;
6187 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6188 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6189 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6190 "}",
6191 Style);
6192 Style.IndentWrappedFunctionNames = true;
6193 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6194 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6195 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6196 "}",
6197 Style);
6198
Nico Weberd6f962f2013-01-10 20:18:33 +00006199 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00006200 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006201 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
6202 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00006203 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00006204
Daniel Jasper37194282013-05-28 08:33:00 +00006205 verifyFormat("- (int (*)())foo:(int (*)())f;");
6206 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006207
6208 // If there's no return type (very rare in practice!), LLVM and Google style
6209 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00006210 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006211 verifyFormat("- foo:(int)f;");
6212 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006213}
6214
Nico Weber0588b502013-02-07 00:19:29 +00006215
Alexander Kornienko64a42b82014-04-15 14:52:43 +00006216TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00006217 EXPECT_EQ("\"some text \"\n"
6218 "\"other\";",
6219 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00006220 EXPECT_EQ("\"some text \"\n"
6221 "\"other\";",
6222 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006223 EXPECT_EQ(
6224 "#define A \\\n"
6225 " \"some \" \\\n"
6226 " \"text \" \\\n"
6227 " \"other\";",
6228 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
6229 EXPECT_EQ(
6230 "#define A \\\n"
6231 " \"so \" \\\n"
6232 " \"text \" \\\n"
6233 " \"other\";",
6234 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
6235
6236 EXPECT_EQ("\"some text\"",
6237 format("\"some text\"", getLLVMStyleWithColumns(1)));
6238 EXPECT_EQ("\"some text\"",
6239 format("\"some text\"", getLLVMStyleWithColumns(11)));
6240 EXPECT_EQ("\"some \"\n"
6241 "\"text\"",
6242 format("\"some text\"", getLLVMStyleWithColumns(10)));
6243 EXPECT_EQ("\"some \"\n"
6244 "\"text\"",
6245 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00006246 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00006247 "\" tex\"\n"
6248 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006249 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00006250 EXPECT_EQ("\"some\"\n"
6251 "\" tex\"\n"
6252 "\" and\"",
6253 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
6254 EXPECT_EQ("\"some\"\n"
6255 "\"/tex\"\n"
6256 "\"/and\"",
6257 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006258
6259 EXPECT_EQ("variable =\n"
6260 " \"long string \"\n"
6261 " \"literal\";",
6262 format("variable = \"long string literal\";",
6263 getLLVMStyleWithColumns(20)));
6264
6265 EXPECT_EQ("variable = f(\n"
6266 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006267 " \"literal\",\n"
6268 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00006269 " loooooooooooooooooooong);",
6270 format("variable = f(\"long string literal\", short, "
6271 "loooooooooooooooooooong);",
6272 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006273
Daniel Jaspera44991332015-04-29 13:06:49 +00006274 EXPECT_EQ(
6275 "f(g(\"long string \"\n"
6276 " \"literal\"),\n"
6277 " b);",
6278 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006279 EXPECT_EQ("f(g(\"long string \"\n"
6280 " \"literal\",\n"
6281 " a),\n"
6282 " b);",
6283 format("f(g(\"long string literal\", a), b);",
6284 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006285 EXPECT_EQ(
6286 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00006287 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006288 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
6289 EXPECT_EQ("f(\"one two three four five six \"\n"
6290 " \"seven\".split(\n"
6291 " really_looooong_variable));",
6292 format("f(\"one two three four five six seven\"."
6293 "split(really_looooong_variable));",
6294 getLLVMStyleWithColumns(33)));
6295
6296 EXPECT_EQ("f(\"some \"\n"
6297 " \"text\",\n"
6298 " other);",
6299 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00006300
6301 // Only break as a last resort.
6302 verifyFormat(
6303 "aaaaaaaaaaaaaaaaaaaa(\n"
6304 " aaaaaaaaaaaaaaaaaaaa,\n"
6305 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00006306
Daniel Jaspera44991332015-04-29 13:06:49 +00006307 EXPECT_EQ("\"splitmea\"\n"
6308 "\"trandomp\"\n"
6309 "\"oint\"",
6310 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00006311
Daniel Jaspera44991332015-04-29 13:06:49 +00006312 EXPECT_EQ("\"split/\"\n"
6313 "\"pathat/\"\n"
6314 "\"slashes\"",
6315 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006316
Daniel Jaspera44991332015-04-29 13:06:49 +00006317 EXPECT_EQ("\"split/\"\n"
6318 "\"pathat/\"\n"
6319 "\"slashes\"",
6320 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00006321 EXPECT_EQ("\"split at \"\n"
6322 "\"spaces/at/\"\n"
6323 "\"slashes.at.any$\"\n"
6324 "\"non-alphanumeric%\"\n"
6325 "\"1111111111characte\"\n"
6326 "\"rs\"",
6327 format("\"split at "
6328 "spaces/at/"
6329 "slashes.at."
6330 "any$non-"
6331 "alphanumeric%"
6332 "1111111111characte"
6333 "rs\"",
6334 getLLVMStyleWithColumns(20)));
6335
Daniel Jasper5aad4e52013-07-12 11:37:05 +00006336 // Verify that splitting the strings understands
6337 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00006338 EXPECT_EQ(
6339 "aaaaaaaaaaaa(\n"
6340 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
6341 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
6342 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
6343 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
6344 "aaaaaaaaaaaaaaaaaaaaaa\");",
6345 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00006346 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6347 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
6348 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
6349 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
6350 "aaaaaaaaaaaaaaaaaaaaaa\";",
6351 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00006352 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6353 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
6354 format("llvm::outs() << "
6355 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
6356 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00006357 EXPECT_EQ("ffff(\n"
6358 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6359 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
6360 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
6361 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
6362 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00006363
Daniel Jaspere1a7b762016-02-01 11:21:02 +00006364 FormatStyle Style = getLLVMStyleWithColumns(12);
6365 Style.BreakStringLiterals = false;
6366 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
6367
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006368 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
6369 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00006370 EXPECT_EQ("#define A \\\n"
6371 " \"some \" \\\n"
6372 " \"text \" \\\n"
6373 " \"other\";",
6374 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006375}
6376
Manuel Klimek9e321992015-07-28 15:50:24 +00006377TEST_F(FormatTest, FullyRemoveEmptyLines) {
6378 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
6379 NoEmptyLines.MaxEmptyLinesToKeep = 0;
6380 EXPECT_EQ("int i = a(b());",
6381 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
6382}
6383
Alexander Kornienko64a42b82014-04-15 14:52:43 +00006384TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
6385 EXPECT_EQ(
6386 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
6387 "(\n"
6388 " \"x\t\");",
6389 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
6390 "aaaaaaa("
6391 "\"x\t\");"));
6392}
6393
Daniel Jasper174b0122014-01-09 14:18:12 +00006394TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00006395 EXPECT_EQ(
6396 "u8\"utf8 string \"\n"
6397 "u8\"literal\";",
6398 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
6399 EXPECT_EQ(
6400 "u\"utf16 string \"\n"
6401 "u\"literal\";",
6402 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
6403 EXPECT_EQ(
6404 "U\"utf32 string \"\n"
6405 "U\"literal\";",
6406 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
6407 EXPECT_EQ("L\"wide string \"\n"
6408 "L\"literal\";",
6409 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00006410 EXPECT_EQ("@\"NSString \"\n"
6411 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00006412 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00006413
6414 // This input makes clang-format try to split the incomplete unicode escape
6415 // sequence, which used to lead to a crasher.
6416 verifyNoCrash(
6417 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
6418 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006419}
6420
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00006421TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
6422 FormatStyle Style = getGoogleStyleWithColumns(15);
6423 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
6424 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
6425 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
6426 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
6427 EXPECT_EQ("u8R\"x(raw literal)x\";",
6428 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006429}
6430
6431TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
6432 FormatStyle Style = getLLVMStyleWithColumns(20);
6433 EXPECT_EQ(
6434 "_T(\"aaaaaaaaaaaaaa\")\n"
6435 "_T(\"aaaaaaaaaaaaaa\")\n"
6436 "_T(\"aaaaaaaaaaaa\")",
6437 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
6438 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
6439 " _T(\"aaaaaa\"),\n"
6440 " z);",
6441 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
6442
6443 // FIXME: Handle embedded spaces in one iteration.
6444 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
6445 // "_T(\"aaaaaaaaaaaaa\")\n"
6446 // "_T(\"aaaaaaaaaaaaa\")\n"
6447 // "_T(\"a\")",
6448 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
6449 // getLLVMStyleWithColumns(20)));
6450 EXPECT_EQ(
6451 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
6452 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00006453 EXPECT_EQ("f(\n"
6454 "#if !TEST\n"
6455 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
6456 "#endif\n"
6457 " );",
6458 format("f(\n"
6459 "#if !TEST\n"
6460 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
6461 "#endif\n"
6462 ");"));
6463 EXPECT_EQ("f(\n"
6464 "\n"
6465 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
6466 format("f(\n"
6467 "\n"
6468 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006469}
6470
Alexander Kornienko657c67b2013-07-16 21:06:13 +00006471TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006472 EXPECT_EQ(
6473 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6474 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6475 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
6476 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6477 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6478 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
6479}
6480
6481TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
6482 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00006483 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006484 EXPECT_EQ("fffffffffff(g(R\"x(\n"
6485 "multiline raw string literal xxxxxxxxxxxxxx\n"
6486 ")x\",\n"
6487 " a),\n"
6488 " b);",
6489 format("fffffffffff(g(R\"x(\n"
6490 "multiline raw string literal xxxxxxxxxxxxxx\n"
6491 ")x\", a), b);",
6492 getGoogleStyleWithColumns(20)));
6493 EXPECT_EQ("fffffffffff(\n"
6494 " g(R\"x(qqq\n"
6495 "multiline raw string literal xxxxxxxxxxxxxx\n"
6496 ")x\",\n"
6497 " a),\n"
6498 " b);",
6499 format("fffffffffff(g(R\"x(qqq\n"
6500 "multiline raw string literal xxxxxxxxxxxxxx\n"
6501 ")x\", a), b);",
6502 getGoogleStyleWithColumns(20)));
6503
6504 EXPECT_EQ("fffffffffff(R\"x(\n"
6505 "multiline raw string literal xxxxxxxxxxxxxx\n"
6506 ")x\");",
6507 format("fffffffffff(R\"x(\n"
6508 "multiline raw string literal xxxxxxxxxxxxxx\n"
6509 ")x\");",
6510 getGoogleStyleWithColumns(20)));
6511 EXPECT_EQ("fffffffffff(R\"x(\n"
6512 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00006513 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006514 format("fffffffffff(R\"x(\n"
6515 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00006516 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006517 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00006518 EXPECT_EQ("fffffffffff(\n"
6519 " R\"x(\n"
6520 "multiline raw string literal xxxxxxxxxxxxxx\n"
6521 ")x\" +\n"
6522 " bbbbbb);",
6523 format("fffffffffff(\n"
6524 " R\"x(\n"
6525 "multiline raw string literal xxxxxxxxxxxxxx\n"
6526 ")x\" + bbbbbb);",
6527 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00006528}
6529
Alexander Kornienkobe633902013-06-14 11:46:10 +00006530TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00006531 verifyFormat("string a = \"unterminated;");
6532 EXPECT_EQ("function(\"unterminated,\n"
6533 " OtherParameter);",
6534 format("function( \"unterminated,\n"
6535 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00006536}
6537
6538TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006539 FormatStyle Style = getLLVMStyle();
6540 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00006541 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006542 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00006543}
6544
Daniel Jaspera44991332015-04-29 13:06:49 +00006545TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00006546
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006547TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
6548 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
6549 " \"ddeeefff\");",
6550 format("someFunction(\"aaabbbcccdddeeefff\");",
6551 getLLVMStyleWithColumns(25)));
6552 EXPECT_EQ("someFunction1234567890(\n"
6553 " \"aaabbbcccdddeeefff\");",
6554 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6555 getLLVMStyleWithColumns(26)));
6556 EXPECT_EQ("someFunction1234567890(\n"
6557 " \"aaabbbcccdddeeeff\"\n"
6558 " \"f\");",
6559 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6560 getLLVMStyleWithColumns(25)));
6561 EXPECT_EQ("someFunction1234567890(\n"
6562 " \"aaabbbcccdddeeeff\"\n"
6563 " \"f\");",
6564 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6565 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00006566 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
6567 " \"ddde \"\n"
6568 " \"efff\");",
6569 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006570 getLLVMStyleWithColumns(25)));
6571 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
6572 " \"ddeeefff\");",
6573 format("someFunction(\"aaabbbccc ddeeefff\");",
6574 getLLVMStyleWithColumns(25)));
6575 EXPECT_EQ("someFunction1234567890(\n"
6576 " \"aaabb \"\n"
6577 " \"cccdddeeefff\");",
6578 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
6579 getLLVMStyleWithColumns(25)));
6580 EXPECT_EQ("#define A \\\n"
6581 " string s = \\\n"
6582 " \"123456789\" \\\n"
6583 " \"0\"; \\\n"
6584 " int i;",
6585 format("#define A string s = \"1234567890\"; int i;",
6586 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00006587 // FIXME: Put additional penalties on breaking at non-whitespace locations.
6588 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
6589 " \"dddeeeff\"\n"
6590 " \"f\");",
6591 format("someFunction(\"aaabbbcc dddeeefff\");",
6592 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006593}
6594
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006595TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00006596 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
6597 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006598 EXPECT_EQ("\"test\"\n"
6599 "\"\\n\"",
6600 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
6601 EXPECT_EQ("\"tes\\\\\"\n"
6602 "\"n\"",
6603 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
6604 EXPECT_EQ("\"\\\\\\\\\"\n"
6605 "\"\\n\"",
6606 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00006607 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006608 EXPECT_EQ("\"\\uff01\"\n"
6609 "\"test\"",
6610 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
6611 EXPECT_EQ("\"\\Uff01ff02\"",
6612 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
6613 EXPECT_EQ("\"\\x000000000001\"\n"
6614 "\"next\"",
6615 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
6616 EXPECT_EQ("\"\\x000000000001next\"",
6617 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
6618 EXPECT_EQ("\"\\x000000000001\"",
6619 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
6620 EXPECT_EQ("\"test\"\n"
6621 "\"\\000000\"\n"
6622 "\"000001\"",
6623 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
6624 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00006625 "\"00000000\"\n"
6626 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006627 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006628}
6629
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00006630TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
6631 verifyFormat("void f() {\n"
6632 " return g() {}\n"
6633 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006634 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00006635 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00006636 "}");
6637}
6638
Manuel Klimek421147e2014-01-24 09:25:23 +00006639TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
6640 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00006641 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00006642}
6643
Manuel Klimek13b97d82013-05-13 08:42:42 +00006644TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
6645 verifyFormat("class X {\n"
6646 " void f() {\n"
6647 " }\n"
6648 "};",
6649 getLLVMStyleWithColumns(12));
6650}
6651
6652TEST_F(FormatTest, ConfigurableIndentWidth) {
6653 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
6654 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00006655 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00006656 verifyFormat("void f() {\n"
6657 " someFunction();\n"
6658 " if (true) {\n"
6659 " f();\n"
6660 " }\n"
6661 "}",
6662 EightIndent);
6663 verifyFormat("class X {\n"
6664 " void f() {\n"
6665 " }\n"
6666 "};",
6667 EightIndent);
6668 verifyFormat("int x[] = {\n"
6669 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006670 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00006671 EightIndent);
6672}
6673
Alexander Kornienko34a87e82013-06-22 01:35:36 +00006674TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00006675 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00006676 "f();",
6677 getLLVMStyleWithColumns(8));
6678}
6679
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006680TEST_F(FormatTest, ConfigurableUseOfTab) {
6681 FormatStyle Tab = getLLVMStyleWithColumns(42);
6682 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006683 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006684 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00006685
6686 EXPECT_EQ("if (aaaaaaaa && // q\n"
6687 " bb)\t\t// w\n"
6688 "\t;",
6689 format("if (aaaaaaaa &&// q\n"
6690 "bb)// w\n"
6691 ";",
6692 Tab));
6693 EXPECT_EQ("if (aaa && bbb) // w\n"
6694 "\t;",
6695 format("if(aaa&&bbb)// w\n"
6696 ";",
6697 Tab));
6698
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006699 verifyFormat("class X {\n"
6700 "\tvoid f() {\n"
6701 "\t\tsomeFunction(parameter1,\n"
6702 "\t\t\t parameter2);\n"
6703 "\t}\n"
6704 "};",
6705 Tab);
6706 verifyFormat("#define A \\\n"
6707 "\tvoid f() { \\\n"
6708 "\t\tsomeFunction( \\\n"
6709 "\t\t parameter1, \\\n"
6710 "\t\t parameter2); \\\n"
6711 "\t}",
6712 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00006713
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00006714 Tab.TabWidth = 4;
6715 Tab.IndentWidth = 8;
6716 verifyFormat("class TabWidth4Indent8 {\n"
6717 "\t\tvoid f() {\n"
6718 "\t\t\t\tsomeFunction(parameter1,\n"
6719 "\t\t\t\t\t\t\t parameter2);\n"
6720 "\t\t}\n"
6721 "};",
6722 Tab);
6723
6724 Tab.TabWidth = 4;
6725 Tab.IndentWidth = 4;
6726 verifyFormat("class TabWidth4Indent4 {\n"
6727 "\tvoid f() {\n"
6728 "\t\tsomeFunction(parameter1,\n"
6729 "\t\t\t\t\t parameter2);\n"
6730 "\t}\n"
6731 "};",
6732 Tab);
6733
6734 Tab.TabWidth = 8;
6735 Tab.IndentWidth = 4;
6736 verifyFormat("class TabWidth8Indent4 {\n"
6737 " void f() {\n"
6738 "\tsomeFunction(parameter1,\n"
6739 "\t\t parameter2);\n"
6740 " }\n"
6741 "};",
6742 Tab);
6743
Alexander Kornienko39856b72013-09-10 09:38:25 +00006744 Tab.TabWidth = 8;
6745 Tab.IndentWidth = 8;
6746 EXPECT_EQ("/*\n"
6747 "\t a\t\tcomment\n"
6748 "\t in multiple lines\n"
6749 " */",
6750 format(" /*\t \t \n"
6751 " \t \t a\t\tcomment\t \t\n"
6752 " \t \t in multiple lines\t\n"
6753 " \t */",
6754 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00006755
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006756 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00006757 verifyFormat("{\n"
6758 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6759 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6760 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6761 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6762 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6763 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00006764 "};",
6765 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00006766 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00006767 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00006768 "\ta2,\n"
6769 "\ta3\n"
6770 "};",
6771 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006772 EXPECT_EQ("if (aaaaaaaa && // q\n"
6773 " bb) // w\n"
6774 "\t;",
6775 format("if (aaaaaaaa &&// q\n"
6776 "bb)// w\n"
6777 ";",
6778 Tab));
6779 verifyFormat("class X {\n"
6780 "\tvoid f() {\n"
6781 "\t\tsomeFunction(parameter1,\n"
6782 "\t\t parameter2);\n"
6783 "\t}\n"
6784 "};",
6785 Tab);
6786 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00006787 "\tQ(\n"
6788 "\t {\n"
6789 "\t\t int a;\n"
6790 "\t\t someFunction(aaaaaaaa,\n"
6791 "\t\t bbbbbbb);\n"
6792 "\t },\n"
6793 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006794 "}",
6795 Tab);
6796 EXPECT_EQ("{\n"
6797 "\t/* aaaa\n"
6798 "\t bbbb */\n"
6799 "}",
6800 format("{\n"
6801 "/* aaaa\n"
6802 " bbbb */\n"
6803 "}",
6804 Tab));
6805 EXPECT_EQ("{\n"
6806 "\t/*\n"
6807 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6808 "\t bbbbbbbbbbbbb\n"
6809 "\t*/\n"
6810 "}",
6811 format("{\n"
6812 "/*\n"
6813 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6814 "*/\n"
6815 "}",
6816 Tab));
6817 EXPECT_EQ("{\n"
6818 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6819 "\t// bbbbbbbbbbbbb\n"
6820 "}",
6821 format("{\n"
6822 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6823 "}",
6824 Tab));
6825 EXPECT_EQ("{\n"
6826 "\t/*\n"
6827 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6828 "\t bbbbbbbbbbbbb\n"
6829 "\t*/\n"
6830 "}",
6831 format("{\n"
6832 "\t/*\n"
6833 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6834 "\t*/\n"
6835 "}",
6836 Tab));
6837 EXPECT_EQ("{\n"
6838 "\t/*\n"
6839 "\n"
6840 "\t*/\n"
6841 "}",
6842 format("{\n"
6843 "\t/*\n"
6844 "\n"
6845 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00006846 "}",
6847 Tab));
6848 EXPECT_EQ("{\n"
6849 "\t/*\n"
6850 " asdf\n"
6851 "\t*/\n"
6852 "}",
6853 format("{\n"
6854 "\t/*\n"
6855 " asdf\n"
6856 "\t*/\n"
6857 "}",
6858 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006859
6860 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00006861 EXPECT_EQ("/*\n"
6862 " a\t\tcomment\n"
6863 " in multiple lines\n"
6864 " */",
6865 format(" /*\t \t \n"
6866 " \t \t a\t\tcomment\t \t\n"
6867 " \t \t in multiple lines\t\n"
6868 " \t */",
6869 Tab));
6870 EXPECT_EQ("/* some\n"
6871 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00006872 format(" \t \t /* some\n"
6873 " \t \t comment */",
6874 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00006875 EXPECT_EQ("int a; /* some\n"
6876 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00006877 format(" \t \t int a; /* some\n"
6878 " \t \t comment */",
6879 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00006880
Alexander Kornienko39856b72013-09-10 09:38:25 +00006881 EXPECT_EQ("int a; /* some\n"
6882 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00006883 format(" \t \t int\ta; /* some\n"
6884 " \t \t comment */",
6885 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00006886 EXPECT_EQ("f(\"\t\t\"); /* some\n"
6887 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00006888 format(" \t \t f(\"\t\t\"); /* some\n"
6889 " \t \t comment */",
6890 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00006891 EXPECT_EQ("{\n"
6892 " /*\n"
6893 " * Comment\n"
6894 " */\n"
6895 " int i;\n"
6896 "}",
6897 format("{\n"
6898 "\t/*\n"
6899 "\t * Comment\n"
6900 "\t */\n"
6901 "\t int i;\n"
6902 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00006903
6904 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
6905 Tab.TabWidth = 8;
6906 Tab.IndentWidth = 8;
6907 EXPECT_EQ("if (aaaaaaaa && // q\n"
6908 " bb) // w\n"
6909 "\t;",
6910 format("if (aaaaaaaa &&// q\n"
6911 "bb)// w\n"
6912 ";",
6913 Tab));
6914 EXPECT_EQ("if (aaa && bbb) // w\n"
6915 "\t;",
6916 format("if(aaa&&bbb)// w\n"
6917 ";",
6918 Tab));
6919 verifyFormat("class X {\n"
6920 "\tvoid f() {\n"
6921 "\t\tsomeFunction(parameter1,\n"
6922 "\t\t\t parameter2);\n"
6923 "\t}\n"
6924 "};",
6925 Tab);
6926 verifyFormat("#define A \\\n"
6927 "\tvoid f() { \\\n"
6928 "\t\tsomeFunction( \\\n"
6929 "\t\t parameter1, \\\n"
6930 "\t\t parameter2); \\\n"
6931 "\t}",
6932 Tab);
6933 Tab.TabWidth = 4;
6934 Tab.IndentWidth = 8;
6935 verifyFormat("class TabWidth4Indent8 {\n"
6936 "\t\tvoid f() {\n"
6937 "\t\t\t\tsomeFunction(parameter1,\n"
6938 "\t\t\t\t\t\t\t parameter2);\n"
6939 "\t\t}\n"
6940 "};",
6941 Tab);
6942 Tab.TabWidth = 4;
6943 Tab.IndentWidth = 4;
6944 verifyFormat("class TabWidth4Indent4 {\n"
6945 "\tvoid f() {\n"
6946 "\t\tsomeFunction(parameter1,\n"
6947 "\t\t\t\t\t parameter2);\n"
6948 "\t}\n"
6949 "};",
6950 Tab);
6951 Tab.TabWidth = 8;
6952 Tab.IndentWidth = 4;
6953 verifyFormat("class TabWidth8Indent4 {\n"
6954 " void f() {\n"
6955 "\tsomeFunction(parameter1,\n"
6956 "\t\t parameter2);\n"
6957 " }\n"
6958 "};",
6959 Tab);
6960 Tab.TabWidth = 8;
6961 Tab.IndentWidth = 8;
6962 EXPECT_EQ("/*\n"
6963 "\t a\t\tcomment\n"
6964 "\t in multiple lines\n"
6965 " */",
6966 format(" /*\t \t \n"
6967 " \t \t a\t\tcomment\t \t\n"
6968 " \t \t in multiple lines\t\n"
6969 " \t */",
6970 Tab));
6971 verifyFormat("{\n"
6972 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6973 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6974 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6975 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6976 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6977 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6978 "};",
6979 Tab);
6980 verifyFormat("enum AA {\n"
6981 "\ta1, // Force multiple lines\n"
6982 "\ta2,\n"
6983 "\ta3\n"
6984 "};",
6985 Tab);
6986 EXPECT_EQ("if (aaaaaaaa && // q\n"
6987 " bb) // w\n"
6988 "\t;",
6989 format("if (aaaaaaaa &&// q\n"
6990 "bb)// w\n"
6991 ";",
6992 Tab));
6993 verifyFormat("class X {\n"
6994 "\tvoid f() {\n"
6995 "\t\tsomeFunction(parameter1,\n"
6996 "\t\t\t parameter2);\n"
6997 "\t}\n"
6998 "};",
6999 Tab);
7000 verifyFormat("{\n"
7001 "\tQ(\n"
7002 "\t {\n"
7003 "\t\t int a;\n"
7004 "\t\t someFunction(aaaaaaaa,\n"
7005 "\t\t\t\t bbbbbbb);\n"
7006 "\t },\n"
7007 "\t p);\n"
7008 "}",
7009 Tab);
7010 EXPECT_EQ("{\n"
7011 "\t/* aaaa\n"
7012 "\t bbbb */\n"
7013 "}",
7014 format("{\n"
7015 "/* aaaa\n"
7016 " bbbb */\n"
7017 "}",
7018 Tab));
7019 EXPECT_EQ("{\n"
7020 "\t/*\n"
7021 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7022 "\t bbbbbbbbbbbbb\n"
7023 "\t*/\n"
7024 "}",
7025 format("{\n"
7026 "/*\n"
7027 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7028 "*/\n"
7029 "}",
7030 Tab));
7031 EXPECT_EQ("{\n"
7032 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7033 "\t// bbbbbbbbbbbbb\n"
7034 "}",
7035 format("{\n"
7036 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7037 "}",
7038 Tab));
7039 EXPECT_EQ("{\n"
7040 "\t/*\n"
7041 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7042 "\t bbbbbbbbbbbbb\n"
7043 "\t*/\n"
7044 "}",
7045 format("{\n"
7046 "\t/*\n"
7047 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7048 "\t*/\n"
7049 "}",
7050 Tab));
7051 EXPECT_EQ("{\n"
7052 "\t/*\n"
7053 "\n"
7054 "\t*/\n"
7055 "}",
7056 format("{\n"
7057 "\t/*\n"
7058 "\n"
7059 "\t*/\n"
7060 "}",
7061 Tab));
7062 EXPECT_EQ("{\n"
7063 "\t/*\n"
7064 " asdf\n"
7065 "\t*/\n"
7066 "}",
7067 format("{\n"
7068 "\t/*\n"
7069 " asdf\n"
7070 "\t*/\n"
7071 "}",
7072 Tab));
7073 EXPECT_EQ("/*\n"
7074 "\t a\t\tcomment\n"
7075 "\t in multiple lines\n"
7076 " */",
7077 format(" /*\t \t \n"
7078 " \t \t a\t\tcomment\t \t\n"
7079 " \t \t in multiple lines\t\n"
7080 " \t */",
7081 Tab));
7082 EXPECT_EQ("/* some\n"
7083 " comment */",
7084 format(" \t \t /* some\n"
7085 " \t \t comment */",
7086 Tab));
7087 EXPECT_EQ("int a; /* some\n"
7088 " comment */",
7089 format(" \t \t int a; /* some\n"
7090 " \t \t comment */",
7091 Tab));
7092 EXPECT_EQ("int a; /* some\n"
7093 "comment */",
7094 format(" \t \t int\ta; /* some\n"
7095 " \t \t comment */",
7096 Tab));
7097 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7098 " comment */",
7099 format(" \t \t f(\"\t\t\"); /* some\n"
7100 " \t \t comment */",
7101 Tab));
7102 EXPECT_EQ("{\n"
7103 " /*\n"
7104 " * Comment\n"
7105 " */\n"
7106 " int i;\n"
7107 "}",
7108 format("{\n"
7109 "\t/*\n"
7110 "\t * Comment\n"
7111 "\t */\n"
7112 "\t int i;\n"
7113 "}"));
7114 Tab.AlignConsecutiveAssignments = true;
7115 Tab.AlignConsecutiveDeclarations = true;
7116 Tab.TabWidth = 4;
7117 Tab.IndentWidth = 4;
7118 verifyFormat("class Assign {\n"
7119 "\tvoid f() {\n"
7120 "\t\tint x = 123;\n"
7121 "\t\tint random = 4;\n"
7122 "\t\tstd::string alphabet =\n"
7123 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
7124 "\t}\n"
7125 "};",
7126 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007127}
7128
Alexander Kornienko917f9e02013-09-10 12:29:48 +00007129TEST_F(FormatTest, CalculatesOriginalColumn) {
7130 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7131 "q\"; /* some\n"
7132 " comment */",
7133 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7134 "q\"; /* some\n"
7135 " comment */",
7136 getLLVMStyle()));
7137 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7138 "/* some\n"
7139 " comment */",
7140 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7141 " /* some\n"
7142 " comment */",
7143 getLLVMStyle()));
7144 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7145 "qqq\n"
7146 "/* some\n"
7147 " comment */",
7148 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7149 "qqq\n"
7150 " /* some\n"
7151 " comment */",
7152 getLLVMStyle()));
7153 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7154 "wwww; /* some\n"
7155 " comment */",
7156 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7157 "wwww; /* some\n"
7158 " comment */",
7159 getLLVMStyle()));
7160}
7161
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007162TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00007163 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007164 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00007165
7166 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007167 " continue;",
7168 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007169 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007170 " continue;",
7171 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007172 verifyFormat("if(true)\n"
7173 " f();\n"
7174 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007175 " f();",
7176 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007177 verifyFormat("do {\n"
7178 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007179 "} while(something());",
7180 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007181 verifyFormat("switch(x) {\n"
7182 "default:\n"
7183 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007184 "}",
7185 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00007186 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00007187 verifyFormat("size_t x = sizeof(x);", NoSpace);
7188 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
7189 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
7190 verifyFormat("alignas(128) char a[128];", NoSpace);
7191 verifyFormat("size_t x = alignof(MyType);", NoSpace);
7192 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
7193 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007194 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007195 verifyFormat("T A::operator()();", NoSpace);
7196 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007197
7198 FormatStyle Space = getLLVMStyle();
7199 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
7200
7201 verifyFormat("int f ();", Space);
7202 verifyFormat("void f (int a, T b) {\n"
7203 " while (true)\n"
7204 " continue;\n"
7205 "}",
7206 Space);
7207 verifyFormat("if (true)\n"
7208 " f ();\n"
7209 "else if (true)\n"
7210 " f ();",
7211 Space);
7212 verifyFormat("do {\n"
7213 " do_something ();\n"
7214 "} while (something ());",
7215 Space);
7216 verifyFormat("switch (x) {\n"
7217 "default:\n"
7218 " break;\n"
7219 "}",
7220 Space);
7221 verifyFormat("A::A () : a (1) {}", Space);
7222 verifyFormat("void f () __attribute__ ((asdf));", Space);
7223 verifyFormat("*(&a + 1);\n"
7224 "&((&a)[1]);\n"
7225 "a[(b + c) * d];\n"
7226 "(((a + 1) * 2) + 3) * 4;",
7227 Space);
7228 verifyFormat("#define A(x) x", Space);
7229 verifyFormat("#define A (x) x", Space);
7230 verifyFormat("#if defined(x)\n"
7231 "#endif",
7232 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00007233 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00007234 verifyFormat("size_t x = sizeof (x);", Space);
7235 verifyFormat("auto f (int x) -> decltype (x);", Space);
7236 verifyFormat("int f (T x) noexcept (x.create ());", Space);
7237 verifyFormat("alignas (128) char a[128];", Space);
7238 verifyFormat("size_t x = alignof (MyType);", Space);
7239 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
7240 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007241 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007242 verifyFormat("T A::operator() ();", Space);
7243 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007244}
7245
7246TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
7247 FormatStyle Spaces = getLLVMStyle();
7248
7249 Spaces.SpacesInParentheses = true;
7250 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007251 verifyFormat("call();", Spaces);
7252 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00007253 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
7254 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007255 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007256 " continue;",
7257 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007258 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007259 " continue;",
7260 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007261 verifyFormat("if ( true )\n"
7262 " f();\n"
7263 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007264 " f();",
7265 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007266 verifyFormat("do {\n"
7267 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007268 "} while ( something() );",
7269 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007270 verifyFormat("switch ( x ) {\n"
7271 "default:\n"
7272 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007273 "}",
7274 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007275
7276 Spaces.SpacesInParentheses = false;
7277 Spaces.SpacesInCStyleCastParentheses = true;
7278 verifyFormat("Type *A = ( Type * )P;", Spaces);
7279 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
7280 verifyFormat("x = ( int32 )y;", Spaces);
7281 verifyFormat("int a = ( int )(2.0f);", Spaces);
7282 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
7283 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
7284 verifyFormat("#define x (( int )-1)", Spaces);
7285
Daniel Jasper92e09822015-03-18 12:59:19 +00007286 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00007287 Spaces.SpacesInParentheses = false;
7288 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00007289 Spaces.SpacesInCStyleCastParentheses = true;
7290 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007291 verifyFormat("call( );", Spaces);
7292 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007293 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007294 " continue;",
7295 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007296 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007297 " continue;",
7298 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007299 verifyFormat("if (true)\n"
7300 " f( );\n"
7301 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007302 " f( );",
7303 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007304 verifyFormat("do {\n"
7305 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007306 "} while (something( ));",
7307 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007308 verifyFormat("switch (x) {\n"
7309 "default:\n"
7310 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007311 "}",
7312 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007313
Daniel Jasper92e09822015-03-18 12:59:19 +00007314 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007315 Spaces.SpaceAfterCStyleCast = true;
7316 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007317 verifyFormat("call( );", Spaces);
7318 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007319 verifyFormat("while (( bool ) 1)\n"
7320 " continue;",
7321 Spaces);
7322 verifyFormat("for (;;)\n"
7323 " continue;",
7324 Spaces);
7325 verifyFormat("if (true)\n"
7326 " f( );\n"
7327 "else if (true)\n"
7328 " f( );",
7329 Spaces);
7330 verifyFormat("do {\n"
7331 " do_something(( int ) i);\n"
7332 "} while (something( ));",
7333 Spaces);
7334 verifyFormat("switch (x) {\n"
7335 "default:\n"
7336 " break;\n"
7337 "}",
7338 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007339
7340 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007341 Spaces.SpacesInCStyleCastParentheses = false;
7342 Spaces.SpaceAfterCStyleCast = true;
7343 verifyFormat("while ((bool) 1)\n"
7344 " continue;",
7345 Spaces);
7346 verifyFormat("do {\n"
7347 " do_something((int) i);\n"
7348 "} while (something( ));",
7349 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007350}
7351
Daniel Jasperad981f82014-08-26 11:41:14 +00007352TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
7353 verifyFormat("int a[5];");
7354 verifyFormat("a[3] += 42;");
7355
7356 FormatStyle Spaces = getLLVMStyle();
7357 Spaces.SpacesInSquareBrackets = true;
7358 // Lambdas unchanged.
7359 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
7360 verifyFormat("return [i, args...] {};", Spaces);
7361
7362 // Not lambdas.
7363 verifyFormat("int a[ 5 ];", Spaces);
7364 verifyFormat("a[ 3 ] += 42;", Spaces);
7365 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
7366 verifyFormat("double &operator[](int i) { return 0; }\n"
7367 "int i;",
7368 Spaces);
7369 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
7370 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
7371 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
7372}
7373
Daniel Jasperd94bff32013-09-25 15:15:02 +00007374TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
7375 verifyFormat("int a = 5;");
7376 verifyFormat("a += 42;");
7377 verifyFormat("a or_eq 8;");
7378
7379 FormatStyle Spaces = getLLVMStyle();
7380 Spaces.SpaceBeforeAssignmentOperators = false;
7381 verifyFormat("int a= 5;", Spaces);
7382 verifyFormat("a+= 42;", Spaces);
7383 verifyFormat("a or_eq 8;", Spaces);
7384}
7385
Daniel Jaspera44991332015-04-29 13:06:49 +00007386TEST_F(FormatTest, AlignConsecutiveAssignments) {
7387 FormatStyle Alignment = getLLVMStyle();
7388 Alignment.AlignConsecutiveAssignments = false;
7389 verifyFormat("int a = 5;\n"
7390 "int oneTwoThree = 123;",
7391 Alignment);
7392 verifyFormat("int a = 5;\n"
7393 "int oneTwoThree = 123;",
7394 Alignment);
7395
7396 Alignment.AlignConsecutiveAssignments = true;
7397 verifyFormat("int a = 5;\n"
7398 "int oneTwoThree = 123;",
7399 Alignment);
7400 verifyFormat("int a = method();\n"
7401 "int oneTwoThree = 133;",
7402 Alignment);
7403 verifyFormat("a &= 5;\n"
7404 "bcd *= 5;\n"
7405 "ghtyf += 5;\n"
7406 "dvfvdb -= 5;\n"
7407 "a /= 5;\n"
7408 "vdsvsv %= 5;\n"
7409 "sfdbddfbdfbb ^= 5;\n"
7410 "dvsdsv |= 5;\n"
7411 "int dsvvdvsdvvv = 123;",
7412 Alignment);
7413 verifyFormat("int i = 1, j = 10;\n"
7414 "something = 2000;",
7415 Alignment);
7416 verifyFormat("something = 2000;\n"
7417 "int i = 1, j = 10;\n",
7418 Alignment);
7419 verifyFormat("something = 2000;\n"
7420 "another = 911;\n"
7421 "int i = 1, j = 10;\n"
7422 "oneMore = 1;\n"
7423 "i = 2;",
7424 Alignment);
7425 verifyFormat("int a = 5;\n"
7426 "int one = 1;\n"
7427 "method();\n"
7428 "int oneTwoThree = 123;\n"
7429 "int oneTwo = 12;",
7430 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00007431 verifyFormat("int oneTwoThree = 123;\n"
7432 "int oneTwo = 12;\n"
7433 "method();\n",
7434 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00007435 verifyFormat("int oneTwoThree = 123; // comment\n"
7436 "int oneTwo = 12; // comment",
7437 Alignment);
7438 EXPECT_EQ("int a = 5;\n"
7439 "\n"
7440 "int oneTwoThree = 123;",
7441 format("int a = 5;\n"
7442 "\n"
7443 "int oneTwoThree= 123;",
7444 Alignment));
7445 EXPECT_EQ("int a = 5;\n"
7446 "int one = 1;\n"
7447 "\n"
7448 "int oneTwoThree = 123;",
7449 format("int a = 5;\n"
7450 "int one = 1;\n"
7451 "\n"
7452 "int oneTwoThree = 123;",
7453 Alignment));
7454 EXPECT_EQ("int a = 5;\n"
7455 "int one = 1;\n"
7456 "\n"
7457 "int oneTwoThree = 123;\n"
7458 "int oneTwo = 12;",
7459 format("int a = 5;\n"
7460 "int one = 1;\n"
7461 "\n"
7462 "int oneTwoThree = 123;\n"
7463 "int oneTwo = 12;",
7464 Alignment));
7465 Alignment.AlignEscapedNewlinesLeft = true;
7466 verifyFormat("#define A \\\n"
7467 " int aaaa = 12; \\\n"
7468 " int b = 23; \\\n"
7469 " int ccc = 234; \\\n"
7470 " int dddddddddd = 2345;",
7471 Alignment);
7472 Alignment.AlignEscapedNewlinesLeft = false;
7473 verifyFormat("#define A "
7474 " \\\n"
7475 " int aaaa = 12; "
7476 " \\\n"
7477 " int b = 23; "
7478 " \\\n"
7479 " int ccc = 234; "
7480 " \\\n"
7481 " int dddddddddd = 2345;",
7482 Alignment);
7483 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
7484 "k = 4, int l = 5,\n"
7485 " int m = 6) {\n"
7486 " int j = 10;\n"
7487 " otherThing = 1;\n"
7488 "}",
7489 Alignment);
7490 verifyFormat("void SomeFunction(int parameter = 0) {\n"
7491 " int i = 1;\n"
7492 " int j = 2;\n"
7493 " int big = 10000;\n"
7494 "}",
7495 Alignment);
7496 verifyFormat("class C {\n"
7497 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00007498 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007499 " virtual void f() = 0;\n"
7500 "};",
7501 Alignment);
7502 verifyFormat("int i = 1;\n"
7503 "if (SomeType t = getSomething()) {\n"
7504 "}\n"
7505 "int j = 2;\n"
7506 "int big = 10000;",
7507 Alignment);
7508 verifyFormat("int j = 7;\n"
7509 "for (int k = 0; k < N; ++k) {\n"
7510 "}\n"
7511 "int j = 2;\n"
7512 "int big = 10000;\n"
7513 "}",
7514 Alignment);
7515 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7516 verifyFormat("int i = 1;\n"
7517 "LooooooooooongType loooooooooooooooooooooongVariable\n"
7518 " = someLooooooooooooooooongFunction();\n"
7519 "int j = 2;",
7520 Alignment);
7521 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7522 verifyFormat("int i = 1;\n"
7523 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
7524 " someLooooooooooooooooongFunction();\n"
7525 "int j = 2;",
7526 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00007527
7528 verifyFormat("auto lambda = []() {\n"
7529 " auto i = 0;\n"
7530 " return 0;\n"
7531 "};\n"
7532 "int i = 0;\n"
7533 "auto v = type{\n"
7534 " i = 1, //\n"
7535 " (i = 2), //\n"
7536 " i = 3 //\n"
7537 "};",
7538 Alignment);
7539
Daniel Jaspera44991332015-04-29 13:06:49 +00007540 // FIXME: Should align all three assignments
7541 verifyFormat(
7542 "int i = 1;\n"
7543 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
7544 " loooooooooooooooooooooongParameterB);\n"
7545 "int j = 2;",
7546 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00007547
7548 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
7549 " typename B = very_long_type_name_1,\n"
7550 " typename T_2 = very_long_type_name_2>\n"
7551 "auto foo() {}\n",
7552 Alignment);
7553 verifyFormat("int a, b = 1;\n"
7554 "int c = 2;\n"
7555 "int dd = 3;\n",
7556 Alignment);
7557 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
7558 "float b[1][] = {{3.f}};\n",
7559 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00007560}
7561
Daniel Jaspere12597c2015-10-01 10:06:54 +00007562TEST_F(FormatTest, AlignConsecutiveDeclarations) {
7563 FormatStyle Alignment = getLLVMStyle();
7564 Alignment.AlignConsecutiveDeclarations = false;
7565 verifyFormat("float const a = 5;\n"
7566 "int oneTwoThree = 123;",
7567 Alignment);
7568 verifyFormat("int a = 5;\n"
7569 "float const oneTwoThree = 123;",
7570 Alignment);
7571
7572 Alignment.AlignConsecutiveDeclarations = true;
7573 verifyFormat("float const a = 5;\n"
7574 "int oneTwoThree = 123;",
7575 Alignment);
7576 verifyFormat("int a = method();\n"
7577 "float const oneTwoThree = 133;",
7578 Alignment);
7579 verifyFormat("int i = 1, j = 10;\n"
7580 "something = 2000;",
7581 Alignment);
7582 verifyFormat("something = 2000;\n"
7583 "int i = 1, j = 10;\n",
7584 Alignment);
7585 verifyFormat("float something = 2000;\n"
7586 "double another = 911;\n"
7587 "int i = 1, j = 10;\n"
7588 "const int *oneMore = 1;\n"
7589 "unsigned i = 2;",
7590 Alignment);
7591 verifyFormat("float a = 5;\n"
7592 "int one = 1;\n"
7593 "method();\n"
7594 "const double oneTwoThree = 123;\n"
7595 "const unsigned int oneTwo = 12;",
7596 Alignment);
7597 verifyFormat("int oneTwoThree{0}; // comment\n"
7598 "unsigned oneTwo; // comment",
7599 Alignment);
7600 EXPECT_EQ("float const a = 5;\n"
7601 "\n"
7602 "int oneTwoThree = 123;",
7603 format("float const a = 5;\n"
7604 "\n"
7605 "int oneTwoThree= 123;",
7606 Alignment));
7607 EXPECT_EQ("float a = 5;\n"
7608 "int one = 1;\n"
7609 "\n"
7610 "unsigned oneTwoThree = 123;",
7611 format("float a = 5;\n"
7612 "int one = 1;\n"
7613 "\n"
7614 "unsigned oneTwoThree = 123;",
7615 Alignment));
7616 EXPECT_EQ("float a = 5;\n"
7617 "int one = 1;\n"
7618 "\n"
7619 "unsigned oneTwoThree = 123;\n"
7620 "int oneTwo = 12;",
7621 format("float a = 5;\n"
7622 "int one = 1;\n"
7623 "\n"
7624 "unsigned oneTwoThree = 123;\n"
7625 "int oneTwo = 12;",
7626 Alignment));
7627 Alignment.AlignConsecutiveAssignments = true;
7628 verifyFormat("float something = 2000;\n"
7629 "double another = 911;\n"
7630 "int i = 1, j = 10;\n"
7631 "const int *oneMore = 1;\n"
7632 "unsigned i = 2;",
7633 Alignment);
7634 verifyFormat("int oneTwoThree = {0}; // comment\n"
7635 "unsigned oneTwo = 0; // comment",
7636 Alignment);
7637 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
7638 " int const i = 1;\n"
7639 " int * j = 2;\n"
7640 " int big = 10000;\n"
7641 "\n"
7642 " unsigned oneTwoThree = 123;\n"
7643 " int oneTwo = 12;\n"
7644 " method();\n"
7645 " float k = 2;\n"
7646 " int ll = 10000;\n"
7647 "}",
7648 format("void SomeFunction(int parameter= 0) {\n"
7649 " int const i= 1;\n"
7650 " int *j=2;\n"
7651 " int big = 10000;\n"
7652 "\n"
7653 "unsigned oneTwoThree =123;\n"
7654 "int oneTwo = 12;\n"
7655 " method();\n"
7656 "float k= 2;\n"
7657 "int ll=10000;\n"
7658 "}",
7659 Alignment));
7660 Alignment.AlignConsecutiveAssignments = false;
7661 Alignment.AlignEscapedNewlinesLeft = true;
7662 verifyFormat("#define A \\\n"
7663 " int aaaa = 12; \\\n"
7664 " float b = 23; \\\n"
7665 " const int ccc = 234; \\\n"
7666 " unsigned dddddddddd = 2345;",
7667 Alignment);
7668 Alignment.AlignEscapedNewlinesLeft = false;
7669 Alignment.ColumnLimit = 30;
7670 verifyFormat("#define A \\\n"
7671 " int aaaa = 12; \\\n"
7672 " float b = 23; \\\n"
7673 " const int ccc = 234; \\\n"
7674 " int dddddddddd = 2345;",
7675 Alignment);
7676 Alignment.ColumnLimit = 80;
7677 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
7678 "k = 4, int l = 5,\n"
7679 " int m = 6) {\n"
7680 " const int j = 10;\n"
7681 " otherThing = 1;\n"
7682 "}",
7683 Alignment);
7684 verifyFormat("void SomeFunction(int parameter = 0) {\n"
7685 " int const i = 1;\n"
7686 " int * j = 2;\n"
7687 " int big = 10000;\n"
7688 "}",
7689 Alignment);
7690 verifyFormat("class C {\n"
7691 "public:\n"
7692 " int i = 1;\n"
7693 " virtual void f() = 0;\n"
7694 "};",
7695 Alignment);
7696 verifyFormat("float i = 1;\n"
7697 "if (SomeType t = getSomething()) {\n"
7698 "}\n"
7699 "const unsigned j = 2;\n"
7700 "int big = 10000;",
7701 Alignment);
7702 verifyFormat("float j = 7;\n"
7703 "for (int k = 0; k < N; ++k) {\n"
7704 "}\n"
7705 "unsigned j = 2;\n"
7706 "int big = 10000;\n"
7707 "}",
7708 Alignment);
7709 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7710 verifyFormat("float i = 1;\n"
7711 "LooooooooooongType loooooooooooooooooooooongVariable\n"
7712 " = someLooooooooooooooooongFunction();\n"
7713 "int j = 2;",
7714 Alignment);
7715 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7716 verifyFormat("int i = 1;\n"
7717 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
7718 " someLooooooooooooooooongFunction();\n"
7719 "int j = 2;",
7720 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00007721
7722 Alignment.AlignConsecutiveAssignments = true;
7723 verifyFormat("auto lambda = []() {\n"
7724 " auto ii = 0;\n"
7725 " float j = 0;\n"
7726 " return 0;\n"
7727 "};\n"
7728 "int i = 0;\n"
7729 "float i2 = 0;\n"
7730 "auto v = type{\n"
7731 " i = 1, //\n"
7732 " (i = 2), //\n"
7733 " i = 3 //\n"
7734 "};",
7735 Alignment);
7736 Alignment.AlignConsecutiveAssignments = false;
7737
Daniel Jaspere12597c2015-10-01 10:06:54 +00007738 // FIXME: Should align all three declarations
7739 verifyFormat(
7740 "int i = 1;\n"
7741 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
7742 " loooooooooooooooooooooongParameterB);\n"
7743 "int j = 2;",
7744 Alignment);
7745
7746 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
7747 // We expect declarations and assignments to align, as long as it doesn't
7748 // exceed the column limit, starting a new alignemnt sequence whenever it
7749 // happens.
7750 Alignment.AlignConsecutiveAssignments = true;
7751 Alignment.ColumnLimit = 30;
7752 verifyFormat("float ii = 1;\n"
7753 "unsigned j = 2;\n"
7754 "int someVerylongVariable = 1;\n"
7755 "AnotherLongType ll = 123456;\n"
7756 "VeryVeryLongType k = 2;\n"
7757 "int myvar = 1;",
7758 Alignment);
7759 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00007760 Alignment.AlignConsecutiveAssignments = false;
7761
7762 verifyFormat(
7763 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
7764 " typename LongType, typename B>\n"
7765 "auto foo() {}\n",
7766 Alignment);
7767 verifyFormat("float a, b = 1;\n"
7768 "int c = 2;\n"
7769 "int dd = 3;\n",
7770 Alignment);
7771 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
7772 "float b[1][] = {{3.f}};\n",
7773 Alignment);
7774 Alignment.AlignConsecutiveAssignments = true;
7775 verifyFormat("float a, b = 1;\n"
7776 "int c = 2;\n"
7777 "int dd = 3;\n",
7778 Alignment);
7779 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
7780 "float b[1][] = {{3.f}};\n",
7781 Alignment);
7782 Alignment.AlignConsecutiveAssignments = false;
7783
7784 Alignment.ColumnLimit = 30;
7785 Alignment.BinPackParameters = false;
7786 verifyFormat("void foo(float a,\n"
7787 " float b,\n"
7788 " int c,\n"
7789 " uint32_t *d) {\n"
7790 " int * e = 0;\n"
7791 " float f = 0;\n"
7792 " double g = 0;\n"
7793 "}\n"
7794 "void bar(ino_t a,\n"
7795 " int b,\n"
7796 " uint32_t *c,\n"
7797 " bool d) {}\n",
7798 Alignment);
7799 Alignment.BinPackParameters = true;
7800 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00007801}
7802
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007803TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007804 FormatStyle LinuxBraceStyle = getLLVMStyle();
7805 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007806 verifyFormat("namespace a\n"
7807 "{\n"
7808 "class A\n"
7809 "{\n"
7810 " void f()\n"
7811 " {\n"
7812 " if (true) {\n"
7813 " a();\n"
7814 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00007815 " } else {\n"
7816 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007817 " }\n"
7818 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007819 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007820 "};\n"
7821 "struct B {\n"
7822 " int x;\n"
7823 "};\n"
7824 "}\n",
7825 LinuxBraceStyle);
7826 verifyFormat("enum X {\n"
7827 " Y = 0,\n"
7828 "}\n",
7829 LinuxBraceStyle);
7830 verifyFormat("struct S {\n"
7831 " int Type;\n"
7832 " union {\n"
7833 " int x;\n"
7834 " double y;\n"
7835 " } Value;\n"
7836 " class C\n"
7837 " {\n"
7838 " MyFavoriteType Value;\n"
7839 " } Class;\n"
7840 "}\n",
7841 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007842}
7843
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00007844TEST_F(FormatTest, MozillaBraceBreaking) {
7845 FormatStyle MozillaBraceStyle = getLLVMStyle();
7846 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
7847 verifyFormat("namespace a {\n"
7848 "class A\n"
7849 "{\n"
7850 " void f()\n"
7851 " {\n"
7852 " if (true) {\n"
7853 " a();\n"
7854 " b();\n"
7855 " }\n"
7856 " }\n"
7857 " void g() { return; }\n"
7858 "};\n"
7859 "enum E\n"
7860 "{\n"
7861 " A,\n"
7862 " // foo\n"
7863 " B,\n"
7864 " C\n"
7865 "};\n"
7866 "struct B\n"
7867 "{\n"
7868 " int x;\n"
7869 "};\n"
7870 "}\n",
7871 MozillaBraceStyle);
7872 verifyFormat("struct S\n"
7873 "{\n"
7874 " int Type;\n"
7875 " union\n"
7876 " {\n"
7877 " int x;\n"
7878 " double y;\n"
7879 " } Value;\n"
7880 " class C\n"
7881 " {\n"
7882 " MyFavoriteType Value;\n"
7883 " } Class;\n"
7884 "}\n",
7885 MozillaBraceStyle);
7886}
7887
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007888TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007889 FormatStyle StroustrupBraceStyle = getLLVMStyle();
7890 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007891 verifyFormat("namespace a {\n"
7892 "class A {\n"
7893 " void f()\n"
7894 " {\n"
7895 " if (true) {\n"
7896 " a();\n"
7897 " b();\n"
7898 " }\n"
7899 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007900 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007901 "};\n"
7902 "struct B {\n"
7903 " int x;\n"
7904 "};\n"
7905 "}\n",
7906 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00007907
Daniel Jasperd9670872014-08-05 12:06:20 +00007908 verifyFormat("void foo()\n"
7909 "{\n"
7910 " if (a) {\n"
7911 " a();\n"
7912 " }\n"
7913 " else {\n"
7914 " b();\n"
7915 " }\n"
7916 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007917 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00007918
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00007919 verifyFormat("#ifdef _DEBUG\n"
7920 "int foo(int i = 0)\n"
7921 "#else\n"
7922 "int foo(int i = 5)\n"
7923 "#endif\n"
7924 "{\n"
7925 " return i;\n"
7926 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007927 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00007928
7929 verifyFormat("void foo() {}\n"
7930 "void bar()\n"
7931 "#ifdef _DEBUG\n"
7932 "{\n"
7933 " foo();\n"
7934 "}\n"
7935 "#else\n"
7936 "{\n"
7937 "}\n"
7938 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007939 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00007940
7941 verifyFormat("void foobar() { int i = 5; }\n"
7942 "#ifdef _DEBUG\n"
7943 "void bar() {}\n"
7944 "#else\n"
7945 "void bar() { foobar(); }\n"
7946 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007947 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007948}
7949
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00007950TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007951 FormatStyle AllmanBraceStyle = getLLVMStyle();
7952 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00007953 verifyFormat("namespace a\n"
7954 "{\n"
7955 "class A\n"
7956 "{\n"
7957 " void f()\n"
7958 " {\n"
7959 " if (true)\n"
7960 " {\n"
7961 " a();\n"
7962 " b();\n"
7963 " }\n"
7964 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007965 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007966 "};\n"
7967 "struct B\n"
7968 "{\n"
7969 " int x;\n"
7970 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00007971 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007972 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00007973
7974 verifyFormat("void f()\n"
7975 "{\n"
7976 " if (true)\n"
7977 " {\n"
7978 " a();\n"
7979 " }\n"
7980 " else if (false)\n"
7981 " {\n"
7982 " b();\n"
7983 " }\n"
7984 " else\n"
7985 " {\n"
7986 " c();\n"
7987 " }\n"
7988 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007989 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00007990
7991 verifyFormat("void f()\n"
7992 "{\n"
7993 " for (int i = 0; i < 10; ++i)\n"
7994 " {\n"
7995 " a();\n"
7996 " }\n"
7997 " while (false)\n"
7998 " {\n"
7999 " b();\n"
8000 " }\n"
8001 " do\n"
8002 " {\n"
8003 " c();\n"
8004 " } while (false)\n"
8005 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008006 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008007
8008 verifyFormat("void f(int a)\n"
8009 "{\n"
8010 " switch (a)\n"
8011 " {\n"
8012 " case 0:\n"
8013 " break;\n"
8014 " case 1:\n"
8015 " {\n"
8016 " break;\n"
8017 " }\n"
8018 " case 2:\n"
8019 " {\n"
8020 " }\n"
8021 " break;\n"
8022 " default:\n"
8023 " break;\n"
8024 " }\n"
8025 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008026 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008027
8028 verifyFormat("enum X\n"
8029 "{\n"
8030 " Y = 0,\n"
8031 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008032 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00008033 verifyFormat("enum X\n"
8034 "{\n"
8035 " Y = 0\n"
8036 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008037 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008038
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008039 verifyFormat("@interface BSApplicationController ()\n"
8040 "{\n"
8041 "@private\n"
8042 " id _extraIvar;\n"
8043 "}\n"
8044 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008045 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008046
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008047 verifyFormat("#ifdef _DEBUG\n"
8048 "int foo(int i = 0)\n"
8049 "#else\n"
8050 "int foo(int i = 5)\n"
8051 "#endif\n"
8052 "{\n"
8053 " return i;\n"
8054 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008055 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008056
8057 verifyFormat("void foo() {}\n"
8058 "void bar()\n"
8059 "#ifdef _DEBUG\n"
8060 "{\n"
8061 " foo();\n"
8062 "}\n"
8063 "#else\n"
8064 "{\n"
8065 "}\n"
8066 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008067 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008068
8069 verifyFormat("void foobar() { int i = 5; }\n"
8070 "#ifdef _DEBUG\n"
8071 "void bar() {}\n"
8072 "#else\n"
8073 "void bar() { foobar(); }\n"
8074 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008075 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008076
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008077 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008078 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008079 " // ...\n"
8080 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008081 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008082 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008083 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008084 " // ...\n"
8085 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008086 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008087 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008088 // .. or dict literals.
8089 verifyFormat("void f()\n"
8090 "{\n"
8091 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
8092 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008093 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00008094 verifyFormat("int f()\n"
8095 "{ // comment\n"
8096 " return 42;\n"
8097 "}",
8098 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008099
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008100 AllmanBraceStyle.ColumnLimit = 19;
8101 verifyFormat("void f() { int i; }", AllmanBraceStyle);
8102 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00008103 verifyFormat("void f()\n"
8104 "{\n"
8105 " int i;\n"
8106 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008107 AllmanBraceStyle);
8108 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00008109
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008110 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00008111 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
8112 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
8113 verifyFormat("void f(bool b)\n"
8114 "{\n"
8115 " if (b)\n"
8116 " {\n"
8117 " return;\n"
8118 " }\n"
8119 "}\n",
8120 BreakBeforeBraceShortIfs);
8121 verifyFormat("void f(bool b)\n"
8122 "{\n"
8123 " if (b) return;\n"
8124 "}\n",
8125 BreakBeforeBraceShortIfs);
8126 verifyFormat("void f(bool b)\n"
8127 "{\n"
8128 " while (b)\n"
8129 " {\n"
8130 " return;\n"
8131 " }\n"
8132 "}\n",
8133 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008134}
8135
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008136TEST_F(FormatTest, GNUBraceBreaking) {
8137 FormatStyle GNUBraceStyle = getLLVMStyle();
8138 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
8139 verifyFormat("namespace a\n"
8140 "{\n"
8141 "class A\n"
8142 "{\n"
8143 " void f()\n"
8144 " {\n"
8145 " int a;\n"
8146 " {\n"
8147 " int b;\n"
8148 " }\n"
8149 " if (true)\n"
8150 " {\n"
8151 " a();\n"
8152 " b();\n"
8153 " }\n"
8154 " }\n"
8155 " void g() { return; }\n"
8156 "}\n"
8157 "}",
8158 GNUBraceStyle);
8159
8160 verifyFormat("void f()\n"
8161 "{\n"
8162 " if (true)\n"
8163 " {\n"
8164 " a();\n"
8165 " }\n"
8166 " else if (false)\n"
8167 " {\n"
8168 " b();\n"
8169 " }\n"
8170 " else\n"
8171 " {\n"
8172 " c();\n"
8173 " }\n"
8174 "}\n",
8175 GNUBraceStyle);
8176
8177 verifyFormat("void f()\n"
8178 "{\n"
8179 " for (int i = 0; i < 10; ++i)\n"
8180 " {\n"
8181 " a();\n"
8182 " }\n"
8183 " while (false)\n"
8184 " {\n"
8185 " b();\n"
8186 " }\n"
8187 " do\n"
8188 " {\n"
8189 " c();\n"
8190 " }\n"
8191 " while (false);\n"
8192 "}\n",
8193 GNUBraceStyle);
8194
8195 verifyFormat("void f(int a)\n"
8196 "{\n"
8197 " switch (a)\n"
8198 " {\n"
8199 " case 0:\n"
8200 " break;\n"
8201 " case 1:\n"
8202 " {\n"
8203 " break;\n"
8204 " }\n"
8205 " case 2:\n"
8206 " {\n"
8207 " }\n"
8208 " break;\n"
8209 " default:\n"
8210 " break;\n"
8211 " }\n"
8212 "}\n",
8213 GNUBraceStyle);
8214
8215 verifyFormat("enum X\n"
8216 "{\n"
8217 " Y = 0,\n"
8218 "}\n",
8219 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008220
8221 verifyFormat("@interface BSApplicationController ()\n"
8222 "{\n"
8223 "@private\n"
8224 " id _extraIvar;\n"
8225 "}\n"
8226 "@end\n",
8227 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008228
8229 verifyFormat("#ifdef _DEBUG\n"
8230 "int foo(int i = 0)\n"
8231 "#else\n"
8232 "int foo(int i = 5)\n"
8233 "#endif\n"
8234 "{\n"
8235 " return i;\n"
8236 "}",
8237 GNUBraceStyle);
8238
8239 verifyFormat("void foo() {}\n"
8240 "void bar()\n"
8241 "#ifdef _DEBUG\n"
8242 "{\n"
8243 " foo();\n"
8244 "}\n"
8245 "#else\n"
8246 "{\n"
8247 "}\n"
8248 "#endif",
8249 GNUBraceStyle);
8250
8251 verifyFormat("void foobar() { int i = 5; }\n"
8252 "#ifdef _DEBUG\n"
8253 "void bar() {}\n"
8254 "#else\n"
8255 "void bar() { foobar(); }\n"
8256 "#endif",
8257 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008258}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00008259
8260TEST_F(FormatTest, WebKitBraceBreaking) {
8261 FormatStyle WebKitBraceStyle = getLLVMStyle();
8262 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
8263 verifyFormat("namespace a {\n"
8264 "class A {\n"
8265 " void f()\n"
8266 " {\n"
8267 " if (true) {\n"
8268 " a();\n"
8269 " b();\n"
8270 " }\n"
8271 " }\n"
8272 " void g() { return; }\n"
8273 "};\n"
8274 "enum E {\n"
8275 " A,\n"
8276 " // foo\n"
8277 " B,\n"
8278 " C\n"
8279 "};\n"
8280 "struct B {\n"
8281 " int x;\n"
8282 "};\n"
8283 "}\n",
8284 WebKitBraceStyle);
8285 verifyFormat("struct S {\n"
8286 " int Type;\n"
8287 " union {\n"
8288 " int x;\n"
8289 " double y;\n"
8290 " } Value;\n"
8291 " class C {\n"
8292 " MyFavoriteType Value;\n"
8293 " } Class;\n"
8294 "};\n",
8295 WebKitBraceStyle);
8296}
8297
Manuel Klimekd5735502013-08-12 03:51:17 +00008298TEST_F(FormatTest, CatchExceptionReferenceBinding) {
8299 verifyFormat("void f() {\n"
8300 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00008301 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00008302 " }\n"
8303 "}\n",
8304 getLLVMStyle());
8305}
8306
Daniel Jasper9613c812013-08-07 16:29:23 +00008307TEST_F(FormatTest, UnderstandsPragmas) {
8308 verifyFormat("#pragma omp reduction(| : var)");
8309 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00008310
8311 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
8312 "(including parentheses).",
8313 format("#pragma mark Any non-hyphenated or hyphenated string "
8314 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00008315}
8316
Daniel Jasperee4a8a12015-04-22 09:45:42 +00008317TEST_F(FormatTest, UnderstandPragmaOption) {
8318 verifyFormat("#pragma option -C -A");
8319
8320 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
8321}
8322
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008323#define EXPECT_ALL_STYLES_EQUAL(Styles) \
8324 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +00008325 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
8326 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +00008327
8328TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008329 SmallVector<FormatStyle, 3> Styles;
8330 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008331
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008332 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008333 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
8334 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
8335 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008336
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008337 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008338 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
8339 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
8340 EXPECT_ALL_STYLES_EQUAL(Styles);
8341
Nico Weber514ecc82014-02-02 20:50:45 +00008342 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008343 EXPECT_TRUE(
8344 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
8345 EXPECT_TRUE(
8346 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
8347 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008348
Nico Weber514ecc82014-02-02 20:50:45 +00008349 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008350 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
8351 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
8352 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008353
8354 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008355 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
8356 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
8357 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008358
Daniel Jasperffefb3d2013-07-24 13:10:59 +00008359 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008360 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
8361 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
8362 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00008363
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +00008364 Styles[0] = getGNUStyle();
8365 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
8366 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
8367 EXPECT_ALL_STYLES_EQUAL(Styles);
8368
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008369 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
8370}
8371
8372TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
8373 SmallVector<FormatStyle, 8> Styles;
8374 Styles.resize(2);
8375
8376 Styles[0] = getGoogleStyle();
8377 Styles[1] = getLLVMStyle();
8378 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
8379 EXPECT_ALL_STYLES_EQUAL(Styles);
8380
8381 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +00008382 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008383 Styles[1] = getLLVMStyle();
8384 Styles[1].Language = FormatStyle::LK_JavaScript;
8385 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
8386
8387 Styles[2] = getLLVMStyle();
8388 Styles[2].Language = FormatStyle::LK_JavaScript;
8389 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
8390 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008391 &Styles[2])
8392 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008393
8394 Styles[3] = getLLVMStyle();
8395 Styles[3].Language = FormatStyle::LK_JavaScript;
8396 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
8397 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008398 &Styles[3])
8399 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008400
8401 Styles[4] = getLLVMStyle();
8402 Styles[4].Language = FormatStyle::LK_JavaScript;
8403 EXPECT_EQ(0, parseConfiguration("---\n"
8404 "BasedOnStyle: LLVM\n"
8405 "IndentWidth: 123\n"
8406 "---\n"
8407 "BasedOnStyle: Google\n"
8408 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008409 &Styles[4])
8410 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008411 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008412}
8413
Daniel Jasper91881d92014-09-29 08:07:46 +00008414#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +00008415 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +00008416 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008417 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +00008418 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +00008419 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008420
Daniel Jasper91881d92014-09-29 08:07:46 +00008421#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
8422
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008423#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
8424 Style.STRUCT.FIELD = false; \
8425 EXPECT_EQ(0, \
8426 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
8427 .value()); \
8428 EXPECT_TRUE(Style.STRUCT.FIELD); \
8429 EXPECT_EQ(0, \
8430 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
8431 .value()); \
8432 EXPECT_FALSE(Style.STRUCT.FIELD);
8433
8434#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
8435 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
8436
Daniel Jasper00853002014-09-16 16:22:30 +00008437#define CHECK_PARSE(TEXT, FIELD, VALUE) \
8438 EXPECT_NE(VALUE, Style.FIELD); \
8439 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
8440 EXPECT_EQ(VALUE, Style.FIELD)
8441
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008442TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008443 FormatStyle Style = {};
8444 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00008445 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +00008446 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +00008447 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +00008448 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008449 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008450 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +00008451 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +00008452 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008453 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +00008454 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00008455 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +00008456 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00008457 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008458 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +00008459 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00008460 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008461 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008462 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +00008463 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +00008464 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +00008465 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008466 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00008467 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +00008468 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +00008469 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008470 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +00008471 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +00008472 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +00008473 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008474 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +00008475 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00008476 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008477 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +00008478 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008479 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008480 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00008481 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +00008482 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008483
8484 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
8485 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
8486 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
8487 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
8488 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
8489 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
8490 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
8491 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
8492 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
8493 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
8494 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008495}
Alexander Kornienkod6538332013-05-07 15:32:14 +00008496
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008497#undef CHECK_PARSE_BOOL
8498
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008499TEST_F(FormatTest, ParsesConfiguration) {
8500 FormatStyle Style = {};
8501 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00008502 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00008503 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
8504 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +00008505 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008506 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
8507 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +00008508 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
8509 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008510 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
8511 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
8512 PenaltyReturnTypeOnItsOwnLine, 1234u);
8513 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
8514 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +00008515 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +00008516 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00008517 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +00008518
Daniel Jasper553d4872014-06-17 12:40:34 +00008519 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +00008520 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
8521 FormatStyle::PAS_Left);
8522 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
8523 FormatStyle::PAS_Right);
8524 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
8525 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +00008526 // For backward compatibility:
8527 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
8528 FormatStyle::PAS_Left);
8529 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
8530 FormatStyle::PAS_Right);
8531 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
8532 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +00008533
Alexander Kornienkod6538332013-05-07 15:32:14 +00008534 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +00008535 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
8536 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008537 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
8538 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
8539 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
8540
Daniel Jasperac043c92014-09-15 11:11:00 +00008541 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +00008542 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
8543 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +00008544 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
8545 FormatStyle::BOS_None);
8546 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
8547 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00008548 // For backward compatibility:
8549 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
8550 FormatStyle::BOS_None);
8551 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
8552 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +00008553
Daniel Jasper6501f7e2015-10-27 12:38:37 +00008554 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8555 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
8556 FormatStyle::BAS_Align);
8557 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
8558 FormatStyle::BAS_DontAlign);
8559 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
8560 FormatStyle::BAS_AlwaysBreak);
8561 // For backward compatibility:
8562 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
8563 FormatStyle::BAS_DontAlign);
8564 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
8565 FormatStyle::BAS_Align);
8566
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008567 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008568 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
8569 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
8570 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008571 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
8572 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +00008573 // For backward compatibility:
8574 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
8575 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008576
Daniel Jasperd74cf402014-04-08 12:46:38 +00008577 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +00008578 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
8579 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
8580 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
8581 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +00008582 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
8583 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +00008584 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
8585 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00008586 // For backward compatibility:
8587 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
8588 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
8589 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
8590 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +00008591
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008592 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
8593 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
8594 FormatStyle::SBPO_Never);
8595 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
8596 FormatStyle::SBPO_Always);
8597 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
8598 FormatStyle::SBPO_ControlStatements);
8599 // For backward compatibility:
8600 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
8601 FormatStyle::SBPO_Never);
8602 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
8603 FormatStyle::SBPO_ControlStatements);
8604
Alexander Kornienkod6538332013-05-07 15:32:14 +00008605 Style.ColumnLimit = 123;
8606 FormatStyle BaseStyle = getLLVMStyle();
8607 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
8608 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
8609
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008610 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
8611 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
8612 FormatStyle::BS_Attach);
8613 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
8614 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008615 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
8616 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008617 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
8618 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008619 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
8620 FormatStyle::BS_Allman);
8621 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008622 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
8623 FormatStyle::BS_WebKit);
8624 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
8625 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008626
Zachary Turner448592e2015-12-18 22:20:15 +00008627 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
8628 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
8629 FormatStyle::RTBS_None);
8630 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
8631 FormatStyle::RTBS_All);
8632 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +00008633 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +00008634 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
8635 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
8636 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
8637 AlwaysBreakAfterReturnType,
8638 FormatStyle::RTBS_TopLevelDefinitions);
8639
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00008640 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
8641 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
8642 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
8643 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
8644 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
8645 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
8646 AlwaysBreakAfterDefinitionReturnType,
8647 FormatStyle::DRTBS_TopLevel);
8648
Daniel Jasper65ee3472013-07-31 23:16:02 +00008649 Style.NamespaceIndentation = FormatStyle::NI_All;
8650 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
8651 FormatStyle::NI_None);
8652 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
8653 FormatStyle::NI_Inner);
8654 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
8655 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +00008656
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00008657 // FIXME: This is required because parsing a configuration simply overwrites
8658 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +00008659 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +00008660 std::vector<std::string> BoostForeach;
8661 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00008662 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +00008663 std::vector<std::string> BoostAndQForeach;
8664 BoostAndQForeach.push_back("BOOST_FOREACH");
8665 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00008666 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
8667 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00008668
8669 Style.IncludeCategories.clear();
8670 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
8671 {".*", 1}};
8672 CHECK_PARSE("IncludeCategories:\n"
8673 " - Regex: abc/.*\n"
8674 " Priority: 2\n"
8675 " - Regex: .*\n"
8676 " Priority: 1",
8677 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00008678 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008679}
8680
8681TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
8682 FormatStyle Style = {};
8683 Style.Language = FormatStyle::LK_Cpp;
8684 CHECK_PARSE("Language: Cpp\n"
8685 "IndentWidth: 12",
8686 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +00008687 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
8688 "IndentWidth: 34",
8689 &Style),
8690 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008691 EXPECT_EQ(12u, Style.IndentWidth);
8692 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
8693 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
8694
8695 Style.Language = FormatStyle::LK_JavaScript;
8696 CHECK_PARSE("Language: JavaScript\n"
8697 "IndentWidth: 12",
8698 IndentWidth, 12u);
8699 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +00008700 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
8701 "IndentWidth: 34",
8702 &Style),
8703 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008704 EXPECT_EQ(23u, Style.IndentWidth);
8705 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
8706 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
8707
8708 CHECK_PARSE("BasedOnStyle: LLVM\n"
8709 "IndentWidth: 67",
8710 IndentWidth, 67u);
8711
8712 CHECK_PARSE("---\n"
8713 "Language: JavaScript\n"
8714 "IndentWidth: 12\n"
8715 "---\n"
8716 "Language: Cpp\n"
8717 "IndentWidth: 34\n"
8718 "...\n",
8719 IndentWidth, 12u);
8720
8721 Style.Language = FormatStyle::LK_Cpp;
8722 CHECK_PARSE("---\n"
8723 "Language: JavaScript\n"
8724 "IndentWidth: 12\n"
8725 "---\n"
8726 "Language: Cpp\n"
8727 "IndentWidth: 34\n"
8728 "...\n",
8729 IndentWidth, 34u);
8730 CHECK_PARSE("---\n"
8731 "IndentWidth: 78\n"
8732 "---\n"
8733 "Language: JavaScript\n"
8734 "IndentWidth: 56\n"
8735 "...\n",
8736 IndentWidth, 78u);
8737
8738 Style.ColumnLimit = 123;
8739 Style.IndentWidth = 234;
8740 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
8741 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +00008742 EXPECT_FALSE(parseConfiguration("---\n"
8743 "IndentWidth: 456\n"
8744 "BreakBeforeBraces: Allman\n"
8745 "---\n"
8746 "Language: JavaScript\n"
8747 "IndentWidth: 111\n"
8748 "TabWidth: 111\n"
8749 "---\n"
8750 "Language: Cpp\n"
8751 "BreakBeforeBraces: Stroustrup\n"
8752 "TabWidth: 789\n"
8753 "...\n",
8754 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008755 EXPECT_EQ(123u, Style.ColumnLimit);
8756 EXPECT_EQ(456u, Style.IndentWidth);
8757 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
8758 EXPECT_EQ(789u, Style.TabWidth);
8759
Rafael Espindola1f243172014-06-12 11:35:17 +00008760 EXPECT_EQ(parseConfiguration("---\n"
8761 "Language: JavaScript\n"
8762 "IndentWidth: 56\n"
8763 "---\n"
8764 "IndentWidth: 78\n"
8765 "...\n",
8766 &Style),
8767 ParseError::Error);
8768 EXPECT_EQ(parseConfiguration("---\n"
8769 "Language: JavaScript\n"
8770 "IndentWidth: 56\n"
8771 "---\n"
8772 "Language: JavaScript\n"
8773 "IndentWidth: 78\n"
8774 "...\n",
8775 &Style),
8776 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008777
8778 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
8779}
Daniel Jasper65ee3472013-07-31 23:16:02 +00008780
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008781#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008782
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008783TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
8784 FormatStyle Style = {};
8785 Style.Language = FormatStyle::LK_JavaScript;
8786 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008787 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00008788 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008789
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008790 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008791 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008792 "BasedOnStyle: Google\n"
8793 "---\n"
8794 "Language: JavaScript\n"
8795 "IndentWidth: 76\n"
8796 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008797 &Style)
8798 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00008799 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008800 EXPECT_EQ(76u, Style.IndentWidth);
8801 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
8802}
8803
Alexander Kornienkod6538332013-05-07 15:32:14 +00008804TEST_F(FormatTest, ConfigurationRoundTripTest) {
8805 FormatStyle Style = getLLVMStyle();
8806 std::string YAML = configurationAsText(Style);
8807 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008808 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00008809 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
8810 EXPECT_EQ(Style, ParsedStyle);
8811}
8812
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008813TEST_F(FormatTest, WorksFor8bitEncodings) {
8814 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
8815 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
8816 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
8817 "\"\xef\xee\xf0\xf3...\"",
8818 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
8819 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
8820 "\xef\xee\xf0\xf3...\"",
8821 getLLVMStyleWithColumns(12)));
8822}
8823
Alexander Kornienko393e3082013-11-13 14:04:17 +00008824TEST_F(FormatTest, HandlesUTF8BOM) {
8825 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
8826 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
8827 format("\xef\xbb\xbf#include <iostream>"));
8828 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
8829 format("\xef\xbb\xbf\n#include <iostream>"));
8830}
8831
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +00008832// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
8833#if !defined(_MSC_VER)
8834
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008835TEST_F(FormatTest, CountsUTF8CharactersProperly) {
8836 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
8837 getLLVMStyleWithColumns(35));
8838 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008839 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008840 verifyFormat("// Однажды в студёную зимнюю пору...",
8841 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +00008842 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008843 verifyFormat("/* Однажды в студёную зимнюю пору... */",
8844 getLLVMStyleWithColumns(39));
8845 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008846 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008847}
8848
8849TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +00008850 // Non-printable characters' width is currently considered to be the length in
8851 // bytes in UTF8. The characters can be displayed in very different manner
8852 // (zero-width, single width with a substitution glyph, expanded to their code
8853 // (e.g. "<8d>"), so there's no single correct way to handle them.
8854 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00008855 "\"\xc2\x8d\";",
8856 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +00008857 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00008858 "\"\xc2\x8d\";",
8859 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008860 EXPECT_EQ("\"Однажды, в \"\n"
8861 "\"студёную \"\n"
8862 "\"зимнюю \"\n"
8863 "\"пору,\"",
8864 format("\"Однажды, в студёную зимнюю пору,\"",
8865 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008866 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +00008867 "\"一 二 三 \"\n"
8868 "\"四 五六 \"\n"
8869 "\"七 八 九 \"\n"
8870 "\"十\"",
8871 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008872 EXPECT_EQ("\"一\t二 \"\n"
8873 "\"\t三 \"\n"
8874 "\"四 五\t六 \"\n"
8875 "\"\t七 \"\n"
8876 "\"八九十\tqq\"",
8877 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
8878 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +00008879
8880 // UTF8 character in an escape sequence.
8881 EXPECT_EQ("\"aaaaaa\"\n"
8882 "\"\\\xC2\x8D\"",
8883 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008884}
8885
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008886TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
8887 EXPECT_EQ("const char *sssss =\n"
8888 " \"一二三四五六七八\\\n"
8889 " 九 十\";",
8890 format("const char *sssss = \"一二三四五六七八\\\n"
8891 " 九 十\";",
8892 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008893}
8894
8895TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00008896 EXPECT_EQ("// aaaaÄ\xc2\x8d",
8897 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008898 EXPECT_EQ("// Я из лесу\n"
8899 "// вышел; был\n"
8900 "// сильный\n"
8901 "// мороз.",
8902 format("// Я из лесу вышел; был сильный мороз.",
8903 getLLVMStyleWithColumns(13)));
8904 EXPECT_EQ("// 一二三\n"
8905 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008906 "// 八 九\n"
8907 "// 十",
8908 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008909}
8910
8911TEST_F(FormatTest, SplitsUTF8BlockComments) {
8912 EXPECT_EQ("/* Гляжу,\n"
8913 " * поднимается\n"
8914 " * медленно в\n"
8915 " * гору\n"
8916 " * Лошадка,\n"
8917 " * везущая\n"
8918 " * хворосту\n"
8919 " * воз. */",
8920 format("/* Гляжу, поднимается медленно в гору\n"
8921 " * Лошадка, везущая хворосту воз. */",
8922 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008923 EXPECT_EQ(
8924 "/* 一二三\n"
8925 " * 四五六七\n"
8926 " * 八 九\n"
8927 " * 十 */",
8928 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +00008929 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
8930 " * 𝕓𝕪𝕥𝕖\n"
8931 " * 𝖀𝕿𝕱-𝟠 */",
8932 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008933}
8934
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008935#endif // _MSC_VER
8936
Daniel Jaspercdaffa42013-08-13 10:58:30 +00008937TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
8938 FormatStyle Style = getLLVMStyle();
8939
8940 Style.ConstructorInitializerIndentWidth = 4;
8941 verifyFormat(
8942 "SomeClass::Constructor()\n"
8943 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
8944 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
8945 Style);
8946
8947 Style.ConstructorInitializerIndentWidth = 2;
8948 verifyFormat(
8949 "SomeClass::Constructor()\n"
8950 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
8951 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
8952 Style);
8953
8954 Style.ConstructorInitializerIndentWidth = 0;
8955 verifyFormat(
8956 "SomeClass::Constructor()\n"
8957 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
8958 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
8959 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +00008960 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8961 verifyFormat(
8962 "SomeLongTemplateVariableName<\n"
8963 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
8964 Style);
8965 verifyFormat(
8966 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
8967 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
8968 Style);
Daniel Jasper00853002014-09-16 16:22:30 +00008969}
Daniel Jaspercdaffa42013-08-13 10:58:30 +00008970
Daniel Jasper00853002014-09-16 16:22:30 +00008971TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
8972 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +00008973 Style.BreakConstructorInitializersBeforeComma = true;
8974 Style.ConstructorInitializerIndentWidth = 4;
8975 verifyFormat("SomeClass::Constructor()\n"
8976 " : a(a)\n"
8977 " , b(b)\n"
8978 " , c(c) {}",
8979 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00008980 verifyFormat("SomeClass::Constructor()\n"
8981 " : a(a) {}",
8982 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00008983
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00008984 Style.ColumnLimit = 0;
8985 verifyFormat("SomeClass::Constructor()\n"
8986 " : a(a) {}",
8987 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +00008988 verifyFormat("SomeClass::Constructor() noexcept\n"
8989 " : a(a) {}",
8990 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00008991 verifyFormat("SomeClass::Constructor()\n"
8992 " : a(a)\n"
8993 " , b(b)\n"
8994 " , c(c) {}",
8995 Style);
8996 verifyFormat("SomeClass::Constructor()\n"
8997 " : a(a) {\n"
8998 " foo();\n"
8999 " bar();\n"
9000 "}",
9001 Style);
9002
Daniel Jasperd74cf402014-04-08 12:46:38 +00009003 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009004 verifyFormat("SomeClass::Constructor()\n"
9005 " : a(a)\n"
9006 " , b(b)\n"
9007 " , c(c) {\n}",
9008 Style);
9009 verifyFormat("SomeClass::Constructor()\n"
9010 " : a(a) {\n}",
9011 Style);
9012
9013 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009014 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009015 Style.ConstructorInitializerIndentWidth = 2;
9016 verifyFormat("SomeClass::Constructor()\n"
9017 " : a(a)\n"
9018 " , b(b)\n"
9019 " , c(c) {}",
9020 Style);
9021
9022 Style.ConstructorInitializerIndentWidth = 0;
9023 verifyFormat("SomeClass::Constructor()\n"
9024 ": a(a)\n"
9025 ", b(b)\n"
9026 ", c(c) {}",
9027 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009028
9029 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
9030 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009031 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
9032 verifyFormat(
9033 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
9034 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009035 verifyFormat(
9036 "SomeClass::Constructor()\n"
9037 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
9038 Style);
9039 Style.ConstructorInitializerIndentWidth = 4;
9040 Style.ColumnLimit = 60;
9041 verifyFormat("SomeClass::Constructor()\n"
9042 " : aaaaaaaa(aaaaaaaa)\n"
9043 " , aaaaaaaa(aaaaaaaa)\n"
9044 " , aaaaaaaa(aaaaaaaa) {}",
9045 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009046}
9047
Daniel Jasper38efc132014-10-21 07:51:54 +00009048TEST_F(FormatTest, Destructors) {
9049 verifyFormat("void F(int &i) { i.~int(); }");
9050 verifyFormat("void F(int &i) { i->~int(); }");
9051}
9052
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009053TEST_F(FormatTest, FormatsWithWebKitStyle) {
9054 FormatStyle Style = getWebKitStyle();
9055
9056 // Don't indent in outer namespaces.
9057 verifyFormat("namespace outer {\n"
9058 "int i;\n"
9059 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00009060 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009061 "} // namespace inner\n"
9062 "} // namespace outer\n"
9063 "namespace other_outer {\n"
9064 "int i;\n"
9065 "}",
9066 Style);
9067
9068 // Don't indent case labels.
9069 verifyFormat("switch (variable) {\n"
9070 "case 1:\n"
9071 "case 2:\n"
9072 " doSomething();\n"
9073 " break;\n"
9074 "default:\n"
9075 " ++variable;\n"
9076 "}",
9077 Style);
9078
9079 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +00009080 EXPECT_EQ("void f()\n"
9081 "{\n"
9082 " if (aaaaaaaaaaaaaaaa\n"
9083 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
9084 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9085 " return;\n"
9086 "}",
9087 format("void f() {\n"
9088 "if (aaaaaaaaaaaaaaaa\n"
9089 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
9090 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9091 "return;\n"
9092 "}",
9093 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009094
Daniel Jasper35995672014-04-29 14:05:20 +00009095 // Allow functions on a single line.
9096 verifyFormat("void f() { return; }", Style);
9097
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009098 // Constructor initializers are formatted one per line with the "," on the
9099 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009100 verifyFormat("Constructor()\n"
9101 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
9102 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00009103 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +00009104 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
9105 "{\n"
9106 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009107 Style);
9108 verifyFormat("SomeClass::Constructor()\n"
9109 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +00009110 "{\n"
9111 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009112 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +00009113 EXPECT_EQ("SomeClass::Constructor()\n"
9114 " : a(a)\n"
9115 "{\n"
9116 "}",
9117 format("SomeClass::Constructor():a(a){}", Style));
9118 verifyFormat("SomeClass::Constructor()\n"
9119 " : a(a)\n"
9120 " , b(b)\n"
9121 " , c(c)\n"
9122 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009123 "}",
9124 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009125 verifyFormat("SomeClass::Constructor()\n"
9126 " : a(a)\n"
9127 "{\n"
9128 " foo();\n"
9129 " bar();\n"
9130 "}",
9131 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009132
Daniel Jasper65ee3472013-07-31 23:16:02 +00009133 // Access specifiers should be aligned left.
9134 verifyFormat("class C {\n"
9135 "public:\n"
9136 " int i;\n"
9137 "};",
9138 Style);
9139
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009140 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +00009141 verifyFormat("int a; // Do not\n"
9142 "double b; // align comments.",
9143 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009144
Daniel Jasper3219e432014-12-02 13:24:51 +00009145 // Do not align operands.
9146 EXPECT_EQ("ASSERT(aaaa\n"
9147 " || bbbb);",
9148 format("ASSERT ( aaaa\n||bbbb);", Style));
9149
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009150 // Accept input's line breaks.
9151 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
9152 " || bbbbbbbbbbbbbbb) {\n"
9153 " i++;\n"
9154 "}",
9155 format("if (aaaaaaaaaaaaaaa\n"
9156 "|| bbbbbbbbbbbbbbb) { i++; }",
9157 Style));
9158 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
9159 " i++;\n"
9160 "}",
9161 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +00009162
9163 // Don't automatically break all macro definitions (llvm.org/PR17842).
9164 verifyFormat("#define aNumber 10", Style);
9165 // However, generally keep the line breaks that the user authored.
9166 EXPECT_EQ("#define aNumber \\\n"
9167 " 10",
9168 format("#define aNumber \\\n"
9169 " 10",
9170 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +00009171
9172 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009173 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
9174 " copyItems:YES];",
9175 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
9176 "copyItems:YES];",
9177 Style));
9178 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
9179 " copyItems:YES];",
9180 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
9181 " copyItems:YES];",
9182 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +00009183 // FIXME: This does not seem right, there should be more indentation before
9184 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009185 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +00009186 " @\"a\",\n"
9187 " @\"a\"\n"
9188 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009189 " copyItems:YES];",
9190 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
9191 " @\"a\",\n"
9192 " @\"a\"\n"
9193 " ]\n"
9194 " copyItems:YES];",
9195 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009196 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009197 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
9198 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009199 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
9200 " copyItems:YES];",
9201 Style));
9202
9203 verifyFormat("[self.a b:c c:d];", Style);
9204 EXPECT_EQ("[self.a b:c\n"
9205 " c:d];",
9206 format("[self.a b:c\n"
9207 "c:d];",
9208 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009209}
9210
Manuel Klimekffdeb592013-09-03 15:10:01 +00009211TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +00009212 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
9213 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
9214 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
9215 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
9216 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +00009217 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +00009218 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009219 verifyFormat("void f() {\n"
9220 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
9221 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009222 verifyFormat("void f() {\n"
9223 " other(x.begin(), //\n"
9224 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +00009225 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009226 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +00009227 verifyFormat("SomeFunction([]() { // A cool function...\n"
9228 " return 43;\n"
9229 "});");
Daniel Jasper56346192014-10-27 16:31:46 +00009230 EXPECT_EQ("SomeFunction([]() {\n"
9231 "#define A a\n"
9232 " return 43;\n"
9233 "});",
9234 format("SomeFunction([](){\n"
9235 "#define A a\n"
9236 "return 43;\n"
9237 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +00009238 verifyFormat("void f() {\n"
9239 " SomeFunction([](decltype(x), A *a) {});\n"
9240 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +00009241 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9242 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +00009243 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
9244 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
9245 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +00009246 verifyFormat("Constructor()\n"
9247 " : Field([] { // comment\n"
9248 " int i;\n"
9249 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +00009250 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
9251 " return some_parameter.size();\n"
9252 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +00009253 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
9254 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +00009255 verifyFormat("int i = aaaaaa ? 1 //\n"
9256 " : [] {\n"
9257 " return 2; //\n"
9258 " }();");
9259 verifyFormat("llvm::errs() << \"number of twos is \"\n"
9260 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
9261 " return x == 2; // force break\n"
9262 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +00009263 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
9264 " int iiiiiiiiiiii) {\n"
9265 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
9266 "});",
9267 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +00009268 verifyFormat("SomeFunction({[&] {\n"
9269 " // comment\n"
9270 " },\n"
9271 " [&] {\n"
9272 " // comment\n"
9273 " }});");
9274 verifyFormat("SomeFunction({[&] {\n"
9275 " // comment\n"
9276 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00009277 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
9278 " [&]() { return true; },\n"
9279 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +00009280
Daniel Jaspercb51cf42014-01-16 09:11:55 +00009281 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +00009282 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +00009283 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +00009284 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
9285 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +00009286 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +00009287 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +00009288 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
9289 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +00009290 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +00009291 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
9292 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +00009293 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +00009294 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +00009295 verifyFormat(
9296 "aaaaaaaaaaaaaaaaaaaaaa(\n"
9297 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
9298 " return aaaaaaaaaaaaaaaaa;\n"
9299 " });",
9300 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +00009301 verifyFormat("[]() //\n"
9302 " -> int {\n"
9303 " return 1; //\n"
9304 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +00009305
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +00009306 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +00009307 verifyFormat("SomeFunction(\n"
9308 " []() {\n"
9309 " int i = 42;\n"
9310 " return i;\n"
9311 " },\n"
9312 " []() {\n"
9313 " int j = 43;\n"
9314 " return j;\n"
9315 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +00009316
Daniel Jasperda18fd82014-06-10 06:39:03 +00009317 // More complex introducers.
9318 verifyFormat("return [i, args...] {};");
9319
Daniel Jasperbf02b2c12013-09-05 11:49:39 +00009320 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +00009321 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +00009322 verifyFormat("double &operator[](int i) { return 0; }\n"
9323 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +00009324 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +00009325 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +00009326 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +00009327
9328 // Other corner cases.
9329 verifyFormat("void f() {\n"
9330 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
9331 " );\n"
9332 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +00009333
9334 // Lambdas created through weird macros.
9335 verifyFormat("void f() {\n"
9336 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +00009337 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +00009338 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +00009339
9340 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
9341 " doo_dah();\n"
9342 " doo_dah();\n"
9343 " })) {\n"
9344 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +00009345 verifyFormat("auto lambda = []() {\n"
9346 " int a = 2\n"
9347 "#if A\n"
9348 " + 2\n"
9349 "#endif\n"
9350 " ;\n"
9351 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +00009352}
9353
Manuel Klimek516e0542013-09-04 13:25:30 +00009354TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +00009355 FormatStyle ShortBlocks = getLLVMStyle();
9356 ShortBlocks.AllowShortBlocksOnASingleLine = true;
9357 verifyFormat("int (^Block)(int, int);", ShortBlocks);
9358 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
9359 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
9360 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
9361 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
9362 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +00009363
Daniel Jasper76284682014-10-22 09:12:44 +00009364 verifyFormat("foo(^{ bar(); });", ShortBlocks);
9365 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
9366 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +00009367
Daniel Jasper76284682014-10-22 09:12:44 +00009368 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009369 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009370 "}];");
9371 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009372 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009373 "}]};");
9374 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009375 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009376 "}];");
9377 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009378 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009379 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +00009380 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009381 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009382 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009383 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +00009384 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009385
9386 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009387 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009388 "}];",
9389 getLLVMStyleWithColumns(60));
9390 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009391 " NSString *path = [self sessionFilePath];\n"
9392 " if (path) {\n"
9393 " // ...\n"
9394 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009395 "});");
9396 verifyFormat("[[SessionService sharedService]\n"
9397 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009398 " if (window) {\n"
9399 " [self windowDidLoad:window];\n"
9400 " } else {\n"
9401 " [self errorLoadingWindow];\n"
9402 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009403 " }];");
9404 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009405 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009406 "};\n",
9407 getLLVMStyleWithColumns(40));
9408 verifyFormat("[[SessionService sharedService]\n"
9409 " loadWindowWithCompletionBlock: //\n"
9410 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009411 " if (window) {\n"
9412 " [self windowDidLoad:window];\n"
9413 " } else {\n"
9414 " [self errorLoadingWindow];\n"
9415 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009416 " }];",
9417 getLLVMStyleWithColumns(60));
9418 verifyFormat("[myObject doSomethingWith:arg1\n"
9419 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009420 " // ...\n"
9421 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009422 " }\n"
9423 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009424 " // ...\n"
9425 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +00009426 " }\n"
9427 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009428 " // ...\n"
9429 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009430 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +00009431 verifyFormat("[myObject doSomethingWith:arg1\n"
9432 " firstBlock:-1\n"
9433 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009434 " // ...\n"
9435 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +00009436 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009437
9438 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009439 " @autoreleasepool {\n"
9440 " if (a) {\n"
9441 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009442 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009443 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009444 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +00009445 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +00009446 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
9447 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +00009448
9449 FormatStyle FourIndent = getLLVMStyle();
9450 FourIndent.ObjCBlockIndentWidth = 4;
9451 verifyFormat("[operation setCompletionBlock:^{\n"
9452 " [self onOperationDone];\n"
9453 "}];",
9454 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +00009455}
9456
Daniel Jasper289afc02015-04-23 09:23:17 +00009457TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
9458 FormatStyle ZeroColumn = getLLVMStyle();
9459 ZeroColumn.ColumnLimit = 0;
9460
9461 verifyFormat("[[SessionService sharedService] "
9462 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9463 " if (window) {\n"
9464 " [self windowDidLoad:window];\n"
9465 " } else {\n"
9466 " [self errorLoadingWindow];\n"
9467 " }\n"
9468 "}];",
9469 ZeroColumn);
9470 EXPECT_EQ("[[SessionService sharedService]\n"
9471 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9472 " if (window) {\n"
9473 " [self windowDidLoad:window];\n"
9474 " } else {\n"
9475 " [self errorLoadingWindow];\n"
9476 " }\n"
9477 " }];",
9478 format("[[SessionService sharedService]\n"
9479 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9480 " if (window) {\n"
9481 " [self windowDidLoad:window];\n"
9482 " } else {\n"
9483 " [self errorLoadingWindow];\n"
9484 " }\n"
9485 "}];",
9486 ZeroColumn));
9487 verifyFormat("[myObject doSomethingWith:arg1\n"
9488 " firstBlock:^(Foo *a) {\n"
9489 " // ...\n"
9490 " int i;\n"
9491 " }\n"
9492 " secondBlock:^(Bar *b) {\n"
9493 " // ...\n"
9494 " int i;\n"
9495 " }\n"
9496 " thirdBlock:^Foo(Bar *b) {\n"
9497 " // ...\n"
9498 " int i;\n"
9499 " }];",
9500 ZeroColumn);
9501 verifyFormat("f(^{\n"
9502 " @autoreleasepool {\n"
9503 " if (a) {\n"
9504 " g();\n"
9505 " }\n"
9506 " }\n"
9507 "});",
9508 ZeroColumn);
9509 verifyFormat("void (^largeBlock)(void) = ^{\n"
9510 " // ...\n"
9511 "};",
9512 ZeroColumn);
9513
9514 ZeroColumn.AllowShortBlocksOnASingleLine = true;
9515 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009516 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +00009517 ZeroColumn.AllowShortBlocksOnASingleLine = false;
9518 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
9519 " int i;\n"
9520 "};",
9521 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
9522}
9523
Alexander Kornienko9e649af2013-09-11 12:25:57 +00009524TEST_F(FormatTest, SupportsCRLF) {
9525 EXPECT_EQ("int a;\r\n"
9526 "int b;\r\n"
9527 "int c;\r\n",
9528 format("int a;\r\n"
9529 " int b;\r\n"
9530 " int c;\r\n",
9531 getLLVMStyle()));
9532 EXPECT_EQ("int a;\r\n"
9533 "int b;\r\n"
9534 "int c;\r\n",
9535 format("int a;\r\n"
9536 " int b;\n"
9537 " int c;\r\n",
9538 getLLVMStyle()));
9539 EXPECT_EQ("int a;\n"
9540 "int b;\n"
9541 "int c;\n",
9542 format("int a;\r\n"
9543 " int b;\n"
9544 " int c;\n",
9545 getLLVMStyle()));
9546 EXPECT_EQ("\"aaaaaaa \"\r\n"
9547 "\"bbbbbbb\";\r\n",
9548 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
9549 EXPECT_EQ("#define A \\\r\n"
9550 " b; \\\r\n"
9551 " c; \\\r\n"
9552 " d;\r\n",
9553 format("#define A \\\r\n"
9554 " b; \\\r\n"
9555 " c; d; \r\n",
9556 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +00009557
9558 EXPECT_EQ("/*\r\n"
9559 "multi line block comments\r\n"
9560 "should not introduce\r\n"
9561 "an extra carriage return\r\n"
9562 "*/\r\n",
9563 format("/*\r\n"
9564 "multi line block comments\r\n"
9565 "should not introduce\r\n"
9566 "an extra carriage return\r\n"
9567 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +00009568}
9569
Manuel Klimekb212f3b2013-10-12 22:46:56 +00009570TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
9571 verifyFormat("MY_CLASS(C) {\n"
9572 " int i;\n"
9573 " int j;\n"
9574 "};");
9575}
9576
Daniel Jasper6633ab82013-10-18 10:38:14 +00009577TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
9578 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
9579 TwoIndent.ContinuationIndentWidth = 2;
9580
9581 EXPECT_EQ("int i =\n"
9582 " longFunction(\n"
9583 " arg);",
9584 format("int i = longFunction(arg);", TwoIndent));
9585
9586 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
9587 SixIndent.ContinuationIndentWidth = 6;
9588
9589 EXPECT_EQ("int i =\n"
9590 " longFunction(\n"
9591 " arg);",
9592 format("int i = longFunction(arg);", SixIndent));
9593}
9594
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009595TEST_F(FormatTest, SpacesInAngles) {
9596 FormatStyle Spaces = getLLVMStyle();
9597 Spaces.SpacesInAngles = true;
9598
9599 verifyFormat("static_cast< int >(arg);", Spaces);
9600 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
9601 verifyFormat("f< int, float >();", Spaces);
9602 verifyFormat("template <> g() {}", Spaces);
9603 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009604 verifyFormat("std::function< void(int, int) > fct;", Spaces);
9605 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
9606 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009607
9608 Spaces.Standard = FormatStyle::LS_Cpp03;
9609 Spaces.SpacesInAngles = true;
9610 verifyFormat("A< A< int > >();", Spaces);
9611
9612 Spaces.SpacesInAngles = false;
9613 verifyFormat("A<A<int> >();", Spaces);
9614
9615 Spaces.Standard = FormatStyle::LS_Cpp11;
9616 Spaces.SpacesInAngles = true;
9617 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00009618
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009619 Spaces.SpacesInAngles = false;
9620 verifyFormat("A<A<int>>();", Spaces);
9621}
9622
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00009623TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
9624 FormatStyle Style = getLLVMStyle();
9625 Style.SpaceAfterTemplateKeyword = false;
9626 verifyFormat("template<int> void foo();", Style);
9627}
9628
Jacques Pienaarfc275112015-02-18 23:48:37 +00009629TEST_F(FormatTest, TripleAngleBrackets) {
9630 verifyFormat("f<<<1, 1>>>();");
9631 verifyFormat("f<<<1, 1, 1, s>>>();");
9632 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +00009633 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009634 verifyFormat("f<param><<<1, 1>>>();");
9635 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +00009636 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009637 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9638 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +00009639 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
9640 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +00009641}
9642
9643TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +00009644 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +00009645 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009646 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9647 "aaallvm::outs() <<");
9648 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9649 "aaaallvm::outs()\n <<");
9650}
9651
Manuel Klimek819788d2014-03-18 11:22:45 +00009652TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
9653 std::string code = "#if A\n"
9654 "#if B\n"
9655 "a.\n"
9656 "#endif\n"
9657 " a = 1;\n"
9658 "#else\n"
9659 "#endif\n"
9660 "#if C\n"
9661 "#else\n"
9662 "#endif\n";
9663 EXPECT_EQ(code, format(code));
9664}
9665
Manuel Klimek68b03042014-04-14 09:14:11 +00009666TEST_F(FormatTest, HandleConflictMarkers) {
9667 // Git/SVN conflict markers.
9668 EXPECT_EQ("int a;\n"
9669 "void f() {\n"
9670 " callme(some(parameter1,\n"
9671 "<<<<<<< text by the vcs\n"
9672 " parameter2),\n"
9673 "||||||| text by the vcs\n"
9674 " parameter2),\n"
9675 " parameter3,\n"
9676 "======= text by the vcs\n"
9677 " parameter2, parameter3),\n"
9678 ">>>>>>> text by the vcs\n"
9679 " otherparameter);\n",
9680 format("int a;\n"
9681 "void f() {\n"
9682 " callme(some(parameter1,\n"
9683 "<<<<<<< text by the vcs\n"
9684 " parameter2),\n"
9685 "||||||| text by the vcs\n"
9686 " parameter2),\n"
9687 " parameter3,\n"
9688 "======= text by the vcs\n"
9689 " parameter2,\n"
9690 " parameter3),\n"
9691 ">>>>>>> text by the vcs\n"
9692 " otherparameter);\n"));
9693
9694 // Perforce markers.
9695 EXPECT_EQ("void f() {\n"
9696 " function(\n"
9697 ">>>> text by the vcs\n"
9698 " parameter,\n"
9699 "==== text by the vcs\n"
9700 " parameter,\n"
9701 "==== text by the vcs\n"
9702 " parameter,\n"
9703 "<<<< text by the vcs\n"
9704 " parameter);\n",
9705 format("void f() {\n"
9706 " function(\n"
9707 ">>>> text by the vcs\n"
9708 " parameter,\n"
9709 "==== text by the vcs\n"
9710 " parameter,\n"
9711 "==== text by the vcs\n"
9712 " parameter,\n"
9713 "<<<< text by the vcs\n"
9714 " parameter);\n"));
9715
9716 EXPECT_EQ("<<<<<<<\n"
9717 "|||||||\n"
9718 "=======\n"
9719 ">>>>>>>",
9720 format("<<<<<<<\n"
9721 "|||||||\n"
9722 "=======\n"
9723 ">>>>>>>"));
9724
9725 EXPECT_EQ("<<<<<<<\n"
9726 "|||||||\n"
9727 "int i;\n"
9728 "=======\n"
9729 ">>>>>>>",
9730 format("<<<<<<<\n"
9731 "|||||||\n"
9732 "int i;\n"
9733 "=======\n"
9734 ">>>>>>>"));
9735
9736 // FIXME: Handle parsing of macros around conflict markers correctly:
9737 EXPECT_EQ("#define Macro \\\n"
9738 "<<<<<<<\n"
9739 "Something \\\n"
9740 "|||||||\n"
9741 "Else \\\n"
9742 "=======\n"
9743 "Other \\\n"
9744 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00009745 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +00009746 format("#define Macro \\\n"
9747 "<<<<<<<\n"
9748 " Something \\\n"
9749 "|||||||\n"
9750 " Else \\\n"
9751 "=======\n"
9752 " Other \\\n"
9753 ">>>>>>>\n"
9754 " End\n"
9755 "int i;\n"));
9756}
9757
Daniel Jasper471894432014-08-06 13:40:26 +00009758TEST_F(FormatTest, DisableRegions) {
9759 EXPECT_EQ("int i;\n"
9760 "// clang-format off\n"
9761 " int j;\n"
9762 "// clang-format on\n"
9763 "int k;",
9764 format(" int i;\n"
9765 " // clang-format off\n"
9766 " int j;\n"
9767 " // clang-format on\n"
9768 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +00009769 EXPECT_EQ("int i;\n"
9770 "/* clang-format off */\n"
9771 " int j;\n"
9772 "/* clang-format on */\n"
9773 "int k;",
9774 format(" int i;\n"
9775 " /* clang-format off */\n"
9776 " int j;\n"
9777 " /* clang-format on */\n"
9778 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +00009779
9780 // Don't reflow comments within disabled regions.
9781 EXPECT_EQ(
9782 "// clang-format off\n"
9783 "// long long long long long long line\n"
9784 "/* clang-format on */\n"
9785 "/* long long long\n"
9786 " * long long long\n"
9787 " * line */\n"
9788 "int i;\n"
9789 "/* clang-format off */\n"
9790 "/* long long long long long long line */\n",
9791 format("// clang-format off\n"
9792 "// long long long long long long line\n"
9793 "/* clang-format on */\n"
9794 "/* long long long long long long line */\n"
9795 "int i;\n"
9796 "/* clang-format off */\n"
9797 "/* long long long long long long line */\n",
9798 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +00009799}
9800
Manuel Klimekf0c95b32015-06-11 10:14:13 +00009801TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
9802 format("? ) =");
9803 verifyNoCrash("#define a\\\n /**/}");
9804}
Manuel Klimek5f594f82014-08-13 14:00:41 +00009805
Daniel Jasper498f5582015-12-25 08:53:31 +00009806TEST_F(FormatTest, FormatsTableGenCode) {
9807 FormatStyle Style = getLLVMStyle();
9808 Style.Language = FormatStyle::LK_TableGen;
9809 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
9810}
9811
Nico Weberb2673a12016-11-10 21:49:25 +00009812TEST_F(FormatTest, ArrayOfTemplates) {
9813 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
9814 format("auto a = new unique_ptr<int > [ 10];"));
9815
9816 FormatStyle Spaces = getLLVMStyle();
9817 Spaces.SpacesInSquareBrackets = true;
9818 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
9819 format("auto a = new unique_ptr<int > [10];", Spaces));
9820}
9821
9822TEST_F(FormatTest, ArrayAsTemplateType) {
9823 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
9824 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
9825
9826 FormatStyle Spaces = getLLVMStyle();
9827 Spaces.SpacesInSquareBrackets = true;
9828 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
9829 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
9830}
9831
Eric Liu547d8792016-03-24 13:22:42 +00009832TEST(FormatStyle, GetStyleOfFile) {
9833 vfs::InMemoryFileSystem FS;
9834 // Test 1: format file in the same directory.
9835 ASSERT_TRUE(
9836 FS.addFile("/a/.clang-format", 0,
9837 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
9838 ASSERT_TRUE(
9839 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +00009840 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +00009841 ASSERT_TRUE((bool)Style1);
9842 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +00009843
Antonio Maiorano7eb75072017-01-20 01:22:42 +00009844 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +00009845 ASSERT_TRUE(
9846 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +00009847 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +00009848 ASSERT_TRUE((bool)Style2);
9849 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +00009850
Antonio Maiorano7eb75072017-01-20 01:22:42 +00009851 // Test 2.2: no format on 'none' fallback style.
9852 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
9853 ASSERT_TRUE((bool)Style2);
9854 ASSERT_EQ(*Style2, getNoStyle());
9855
9856 // Test 2.3: format if config is found with no based style while fallback is
9857 // 'none'.
9858 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
9859 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
9860 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
9861 ASSERT_TRUE((bool)Style2);
9862 ASSERT_EQ(*Style2, getLLVMStyle());
9863
9864 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
9865 Style2 = getStyle("{}", "a.h", "none", "", &FS);
9866 ASSERT_TRUE((bool)Style2);
9867 ASSERT_EQ(*Style2, getLLVMStyle());
9868
Eric Liu547d8792016-03-24 13:22:42 +00009869 // Test 3: format file in parent directory.
9870 ASSERT_TRUE(
9871 FS.addFile("/c/.clang-format", 0,
9872 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
9873 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
9874 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +00009875 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +00009876 ASSERT_TRUE((bool)Style3);
9877 ASSERT_EQ(*Style3, getGoogleStyle());
9878
9879 // Test 4: error on invalid fallback style
9880 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
9881 ASSERT_FALSE((bool)Style4);
9882 llvm::consumeError(Style4.takeError());
9883
9884 // Test 5: error on invalid yaml on command line
9885 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
9886 ASSERT_FALSE((bool)Style5);
9887 llvm::consumeError(Style5.takeError());
9888
9889 // Test 6: error on invalid style
9890 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
9891 ASSERT_FALSE((bool)Style6);
9892 llvm::consumeError(Style6.takeError());
9893
9894 // Test 7: found config file, error on parsing it
9895 ASSERT_TRUE(
9896 FS.addFile("/d/.clang-format", 0,
9897 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
9898 "InvalidKey: InvalidValue")));
9899 ASSERT_TRUE(
9900 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
9901 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
9902 ASSERT_FALSE((bool)Style7);
9903 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +00009904}
9905
Manuel Klimekb12e5a52016-03-01 12:37:30 +00009906TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
9907 // Column limit is 20.
9908 std::string Code = "Type *a =\n"
9909 " new Type();\n"
9910 "g(iiiii, 0, jjjjj,\n"
9911 " 0, kkkkk, 0, mm);\n"
9912 "int bad = format ;";
9913 std::string Expected = "auto a = new Type();\n"
9914 "g(iiiii, nullptr,\n"
9915 " jjjjj, nullptr,\n"
9916 " kkkkk, nullptr,\n"
9917 " mm);\n"
9918 "int bad = format ;";
9919 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +00009920 tooling::Replacements Replaces = toReplacements(
9921 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
9922 "auto "),
9923 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
9924 "nullptr"),
9925 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
9926 "nullptr"),
9927 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
9928 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +00009929
9930 format::FormatStyle Style = format::getLLVMStyle();
9931 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +00009932 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
9933 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
9934 << llvm::toString(FormattedReplaces.takeError()) << "\n";
9935 auto Result = applyAllReplacements(Code, *FormattedReplaces);
9936 EXPECT_TRUE(static_cast<bool>(Result));
9937 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +00009938}
9939
Eric Liubaf58c22016-05-18 13:43:48 +00009940TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
9941 std::string Code = "#include \"a.h\"\n"
9942 "#include \"c.h\"\n"
9943 "\n"
9944 "int main() {\n"
9945 " return 0;\n"
9946 "}";
9947 std::string Expected = "#include \"a.h\"\n"
9948 "#include \"b.h\"\n"
9949 "#include \"c.h\"\n"
9950 "\n"
9951 "int main() {\n"
9952 " return 0;\n"
9953 "}";
9954 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +00009955 tooling::Replacements Replaces = toReplacements(
9956 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
9957 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +00009958
9959 format::FormatStyle Style = format::getLLVMStyle();
9960 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +00009961 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
9962 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
9963 << llvm::toString(FormattedReplaces.takeError()) << "\n";
9964 auto Result = applyAllReplacements(Code, *FormattedReplaces);
9965 EXPECT_TRUE(static_cast<bool>(Result));
9966 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +00009967}
9968
Daniel Jasperd246a5a2015-06-15 15:25:11 +00009969} // end namespace
9970} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +00009971} // end namespace clang