blob: 5444069dc825061ef7c8d806827d3e6ce0029d1e [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 Jasper23c2b5a2017-02-17 10:44:07 +0000142 verifyFormat("ALWAYS_INLINE ::std::string getName();");
143 verifyFormat("some::string getName();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000144}
145
Daniel Jasper7b038a22013-01-30 09:46:12 +0000146TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
147 EXPECT_EQ("if (a) {\n"
148 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000149 "}",
150 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000151 EXPECT_EQ(4, ReplacementCount);
152 EXPECT_EQ("if (a) {\n"
153 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000154 "}",
155 format("if (a) {\n"
156 " f();\n"
157 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000158 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000159 EXPECT_EQ("/*\r\n"
160 "\r\n"
161 "*/\r\n",
162 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000163 "\r\n"
164 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000165 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000166}
167
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000168TEST_F(FormatTest, RemovesEmptyLines) {
169 EXPECT_EQ("class C {\n"
170 " int i;\n"
171 "};",
172 format("class C {\n"
173 " int i;\n"
174 "\n"
175 "};"));
176
Nico Weber34272652014-11-13 16:25:37 +0000177 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000178 EXPECT_EQ("namespace N {\n"
179 "\n"
180 "int i;\n"
181 "}",
182 format("namespace N {\n"
183 "\n"
184 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000185 "}",
186 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000187 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
188 "\n"
189 "int i;\n"
190 "}",
191 format("extern /**/ \"C\" /**/ {\n"
192 "\n"
193 "int i;\n"
194 "}",
195 getGoogleStyle()));
196
197 // ...but do keep inlining and removing empty lines for non-block extern "C"
198 // functions.
199 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
200 EXPECT_EQ("extern \"C\" int f() {\n"
201 " int i = 42;\n"
202 " return i;\n"
203 "}",
204 format("extern \"C\" int f() {\n"
205 "\n"
206 " int i = 42;\n"
207 " return i;\n"
208 "}",
209 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000210
Daniel Jasper11164bd2014-03-21 12:58:53 +0000211 // Remove empty lines at the beginning and end of blocks.
212 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000213 "\n"
214 " if (a) {\n"
215 "\n"
216 " f();\n"
217 " }\n"
218 "}",
219 format("void f() {\n"
220 "\n"
221 " if (a) {\n"
222 "\n"
223 " f();\n"
224 "\n"
225 " }\n"
226 "\n"
227 "}",
228 getLLVMStyle()));
229 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000230 " if (a) {\n"
231 " f();\n"
232 " }\n"
233 "}",
234 format("void f() {\n"
235 "\n"
236 " if (a) {\n"
237 "\n"
238 " f();\n"
239 "\n"
240 " }\n"
241 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000242 "}",
243 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000244
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000245 // Don't remove empty lines in more complex control statements.
246 EXPECT_EQ("void f() {\n"
247 " if (a) {\n"
248 " f();\n"
249 "\n"
250 " } else if (b) {\n"
251 " f();\n"
252 " }\n"
253 "}",
254 format("void f() {\n"
255 " if (a) {\n"
256 " f();\n"
257 "\n"
258 " } else if (b) {\n"
259 " f();\n"
260 "\n"
261 " }\n"
262 "\n"
263 "}"));
264
265 // FIXME: This is slightly inconsistent.
266 EXPECT_EQ("namespace {\n"
267 "int i;\n"
268 "}",
269 format("namespace {\n"
270 "int i;\n"
271 "\n"
272 "}"));
273 EXPECT_EQ("namespace {\n"
274 "int i;\n"
275 "\n"
276 "} // namespace",
277 format("namespace {\n"
278 "int i;\n"
279 "\n"
280 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000281
282 FormatStyle Style = getLLVMStyle();
283 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
284 Style.MaxEmptyLinesToKeep = 2;
285 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
286 Style.BraceWrapping.AfterClass = true;
287 Style.BraceWrapping.AfterFunction = true;
288 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
289
290 EXPECT_EQ("class Foo\n"
291 "{\n"
292 " Foo() {}\n"
293 "\n"
294 " void funk() {}\n"
295 "};",
296 format("class Foo\n"
297 "{\n"
298 " Foo()\n"
299 " {\n"
300 " }\n"
301 "\n"
302 " void funk() {}\n"
303 "};",
304 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000305}
306
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000307TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000308 verifyFormat("x = (a) and (b);");
309 verifyFormat("x = (a) or (b);");
310 verifyFormat("x = (a) bitand (b);");
311 verifyFormat("x = (a) bitor (b);");
312 verifyFormat("x = (a) not_eq (b);");
313 verifyFormat("x = (a) and_eq (b);");
314 verifyFormat("x = (a) or_eq (b);");
315 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000316}
317
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000318//===----------------------------------------------------------------------===//
319// Tests for control statements.
320//===----------------------------------------------------------------------===//
321
Daniel Jaspercdd06622013-05-14 10:31:09 +0000322TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000323 verifyFormat("if (true)\n f();\ng();");
324 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000325 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000326
Daniel Jasper3a685df2013-05-16 12:12:21 +0000327 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000328 AllowsMergedIf.AlignEscapedNewlinesLeft = true;
Daniel Jasperced17f82013-01-16 15:44:34 +0000329 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
330 verifyFormat("if (a)\n"
331 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000332 " f();",
333 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000334 verifyFormat("{\n"
335 " if (a)\n"
336 " label:\n"
337 " f();\n"
338 "}",
339 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000340 verifyFormat("#define A \\\n"
341 " if (a) \\\n"
342 " label: \\\n"
343 " f()",
344 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000345 verifyFormat("if (a)\n"
346 " ;",
347 AllowsMergedIf);
348 verifyFormat("if (a)\n"
349 " if (b) return;",
350 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000351
Daniel Jasper3a685df2013-05-16 12:12:21 +0000352 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000353 " f();\n",
354 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000355 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000356 " f();",
357 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000358 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000359 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000360 "}",
361 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000362 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000363 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000364 "}",
365 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000366
367 AllowsMergedIf.ColumnLimit = 14;
368 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000369 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000370 " return;",
371 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000372
373 AllowsMergedIf.ColumnLimit = 13;
374 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000375}
376
Daniel Jasper3a685df2013-05-16 12:12:21 +0000377TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
378 FormatStyle AllowsMergedLoops = getLLVMStyle();
379 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
380 verifyFormat("while (true) continue;", AllowsMergedLoops);
381 verifyFormat("for (;;) continue;", AllowsMergedLoops);
382 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
383 verifyFormat("while (true)\n"
384 " ;",
385 AllowsMergedLoops);
386 verifyFormat("for (;;)\n"
387 " ;",
388 AllowsMergedLoops);
389 verifyFormat("for (;;)\n"
390 " for (;;) continue;",
391 AllowsMergedLoops);
392 verifyFormat("for (;;) // Can't merge this\n"
393 " continue;",
394 AllowsMergedLoops);
395 verifyFormat("for (;;) /* still don't merge */\n"
396 " continue;",
397 AllowsMergedLoops);
398}
399
Daniel Jasper17605d32014-05-14 09:33:35 +0000400TEST_F(FormatTest, FormatShortBracedStatements) {
401 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
402 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
403
404 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
405 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
406
407 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
408 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
409 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
410 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
411 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
412 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
413 verifyFormat("if (true) { //\n"
414 " f();\n"
415 "}",
416 AllowSimpleBracedStatements);
417 verifyFormat("if (true) {\n"
418 " f();\n"
419 " f();\n"
420 "}",
421 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000422 verifyFormat("if (true) {\n"
423 " f();\n"
424 "} else {\n"
425 " f();\n"
426 "}",
427 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000428
Daniel Jasperbd630732014-05-22 13:25:26 +0000429 verifyFormat("template <int> struct A2 {\n"
430 " struct B {};\n"
431 "};",
432 AllowSimpleBracedStatements);
433
Daniel Jasper17605d32014-05-14 09:33:35 +0000434 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
435 verifyFormat("if (true) {\n"
436 " f();\n"
437 "}",
438 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000439 verifyFormat("if (true) {\n"
440 " f();\n"
441 "} else {\n"
442 " f();\n"
443 "}",
444 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000445
446 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
447 verifyFormat("while (true) {\n"
448 " f();\n"
449 "}",
450 AllowSimpleBracedStatements);
451 verifyFormat("for (;;) {\n"
452 " f();\n"
453 "}",
454 AllowSimpleBracedStatements);
455}
456
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000457TEST_F(FormatTest, ParseIfElse) {
458 verifyFormat("if (true)\n"
459 " if (true)\n"
460 " if (true)\n"
461 " f();\n"
462 " else\n"
463 " g();\n"
464 " else\n"
465 " h();\n"
466 "else\n"
467 " i();");
468 verifyFormat("if (true)\n"
469 " if (true)\n"
470 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000471 " if (true)\n"
472 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000473 " } else {\n"
474 " g();\n"
475 " }\n"
476 " else\n"
477 " h();\n"
478 "else {\n"
479 " i();\n"
480 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000481 verifyFormat("void f() {\n"
482 " if (a) {\n"
483 " } else {\n"
484 " }\n"
485 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000486}
487
488TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000489 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000490 verifyFormat("if (a)\n"
491 " f();\n"
492 "else if (b)\n"
493 " g();\n"
494 "else\n"
495 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000496 verifyFormat("if (a) {\n"
497 " f();\n"
498 "}\n"
499 "// or else ..\n"
500 "else {\n"
501 " g()\n"
502 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000503
504 verifyFormat("if (a) {\n"
505 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
506 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
507 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000508 verifyFormat("if (a) {\n"
509 "} else if (\n"
510 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
511 "}",
512 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000513}
514
Daniel Jasperf7935112012-12-03 18:12:45 +0000515TEST_F(FormatTest, FormatsForLoop) {
516 verifyFormat(
517 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000518 " ++VeryVeryLongLoopVariable)\n"
519 " ;");
520 verifyFormat("for (;;)\n"
521 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000522 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000523 verifyFormat("for (;;) {\n"
524 " f();\n"
525 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000526 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000527
528 verifyFormat(
529 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
530 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000531 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000532
533 verifyFormat(
534 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000535 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000536 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
537 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000538 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000539 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
540 " I = FD->getDeclsInPrototypeScope().begin(),\n"
541 " E = FD->getDeclsInPrototypeScope().end();\n"
542 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000543 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
544 " I = Container.begin(),\n"
545 " E = Container.end();\n"
546 " I != E; ++I) {\n}",
547 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000548
Daniel Jasper48c62f92013-01-28 17:30:17 +0000549 verifyFormat(
550 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000552 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
553 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000554 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000555 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
556 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
557 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000558 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
559 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
560 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000561 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
562 " aaaaaaaaaa);\n"
563 " iter; ++iter) {\n"
564 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000565 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
566 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
567 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
568 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000569
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000570 FormatStyle NoBinPacking = getLLVMStyle();
571 NoBinPacking.BinPackParameters = false;
572 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
573 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
574 " aaaaaaaaaaaaaaaa,\n"
575 " aaaaaaaaaaaaaaaa,\n"
576 " aaaaaaaaaaaaaaaa);\n"
577 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
578 "}",
579 NoBinPacking);
580 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000581 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
582 " E = UnwrappedLines.end();\n"
583 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000584 " ++I) {\n}",
585 NoBinPacking);
Daniel Jasperf7935112012-12-03 18:12:45 +0000586}
587
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000588TEST_F(FormatTest, RangeBasedForLoops) {
589 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
590 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
591 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
592 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000593 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
594 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000595 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
596 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000597}
598
Daniel Jaspere1e43192014-04-01 12:55:11 +0000599TEST_F(FormatTest, ForEachLoops) {
600 verifyFormat("void f() {\n"
601 " foreach (Item *item, itemlist) {}\n"
602 " Q_FOREACH (Item *item, itemlist) {}\n"
603 " BOOST_FOREACH (Item *item, itemlist) {}\n"
604 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
605 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000606
607 // As function-like macros.
608 verifyFormat("#define foreach(x, y)\n"
609 "#define Q_FOREACH(x, y)\n"
610 "#define BOOST_FOREACH(x, y)\n"
611 "#define UNKNOWN_FOREACH(x, y)\n");
612
613 // Not as function-like macros.
614 verifyFormat("#define foreach (x, y)\n"
615 "#define Q_FOREACH (x, y)\n"
616 "#define BOOST_FOREACH (x, y)\n"
617 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000618}
619
Daniel Jasperf7935112012-12-03 18:12:45 +0000620TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000621 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000622 verifyFormat("while (true)\n"
623 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000624 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000625 verifyFormat("while () {\n"
626 " f();\n"
627 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000628}
629
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000630TEST_F(FormatTest, FormatsDoWhile) {
631 verifyFormat("do {\n"
632 " do_something();\n"
633 "} while (something());");
634 verifyFormat("do\n"
635 " do_something();\n"
636 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000637}
638
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000639TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000640 verifyFormat("switch (x) {\n"
641 "case 1:\n"
642 " f();\n"
643 " break;\n"
644 "case kFoo:\n"
645 "case ns::kBar:\n"
646 "case kBaz:\n"
647 " break;\n"
648 "default:\n"
649 " g();\n"
650 " break;\n"
651 "}");
652 verifyFormat("switch (x) {\n"
653 "case 1: {\n"
654 " f();\n"
655 " break;\n"
656 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000657 "case 2: {\n"
658 " break;\n"
659 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000660 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000661 verifyFormat("switch (x) {\n"
662 "case 1: {\n"
663 " f();\n"
664 " {\n"
665 " g();\n"
666 " h();\n"
667 " }\n"
668 " break;\n"
669 "}\n"
670 "}");
671 verifyFormat("switch (x) {\n"
672 "case 1: {\n"
673 " f();\n"
674 " if (foo) {\n"
675 " g();\n"
676 " h();\n"
677 " }\n"
678 " break;\n"
679 "}\n"
680 "}");
681 verifyFormat("switch (x) {\n"
682 "case 1: {\n"
683 " f();\n"
684 " g();\n"
685 "} break;\n"
686 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000687 verifyFormat("switch (test)\n"
688 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000689 verifyFormat("switch (x) {\n"
690 "default: {\n"
691 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000692 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000693 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000694 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000695 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000696 "// if 1, do f()\n"
697 "case 1:\n"
698 " f();\n"
699 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000700 verifyFormat("switch (x) {\n"
701 "case 1:\n"
702 " // Do amazing stuff\n"
703 " {\n"
704 " f();\n"
705 " g();\n"
706 " }\n"
707 " break;\n"
708 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000709 verifyFormat("#define A \\\n"
710 " switch (x) { \\\n"
711 " case a: \\\n"
712 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000713 " }",
714 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000715 verifyFormat("#define OPERATION_CASE(name) \\\n"
716 " case OP_name: \\\n"
717 " return operations::Operation##name\n",
718 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000719 verifyFormat("switch (x) {\n"
720 "case 1:;\n"
721 "default:;\n"
722 " int i;\n"
723 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000724
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000725 verifyGoogleFormat("switch (x) {\n"
726 " case 1:\n"
727 " f();\n"
728 " break;\n"
729 " case kFoo:\n"
730 " case ns::kBar:\n"
731 " case kBaz:\n"
732 " break;\n"
733 " default:\n"
734 " g();\n"
735 " break;\n"
736 "}");
737 verifyGoogleFormat("switch (x) {\n"
738 " case 1: {\n"
739 " f();\n"
740 " break;\n"
741 " }\n"
742 "}");
743 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000744 " ;");
745
746 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
747 " case OP_name: \\\n"
748 " return operations::Operation##name\n");
749 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
750 " // Get the correction operation class.\n"
751 " switch (OpCode) {\n"
752 " CASE(Add);\n"
753 " CASE(Subtract);\n"
754 " default:\n"
755 " return operations::Unknown;\n"
756 " }\n"
757 "#undef OPERATION_CASE\n"
758 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000759 verifyFormat("DEBUG({\n"
760 " switch (x) {\n"
761 " case A:\n"
762 " f();\n"
763 " break;\n"
764 " // On B:\n"
765 " case B:\n"
766 " g();\n"
767 " break;\n"
768 " }\n"
769 "});");
Daniel Jasper031e2402014-04-28 07:48:36 +0000770 verifyFormat("switch (a) {\n"
771 "case (b):\n"
772 " return;\n"
773 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000774
775 verifyFormat("switch (a) {\n"
776 "case some_namespace::\n"
777 " some_constant:\n"
778 " return;\n"
779 "}",
780 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000781}
782
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000783TEST_F(FormatTest, CaseRanges) {
784 verifyFormat("switch (x) {\n"
785 "case 'A' ... 'Z':\n"
786 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000787 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000788 " break;\n"
789 "}");
790}
791
Daniel Jasperb87899b2014-09-10 13:11:45 +0000792TEST_F(FormatTest, ShortCaseLabels) {
793 FormatStyle Style = getLLVMStyle();
794 Style.AllowShortCaseLabelsOnASingleLine = true;
795 verifyFormat("switch (a) {\n"
796 "case 1: x = 1; break;\n"
797 "case 2: return;\n"
798 "case 3:\n"
799 "case 4:\n"
800 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000801 "case 6: // comment\n"
802 " return;\n"
803 "case 7:\n"
804 " // comment\n"
805 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000806 "case 8:\n"
807 " x = 8; // comment\n"
808 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000809 "default: y = 1; break;\n"
810 "}",
811 Style);
812 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +0000813 "#if FOO\n"
814 "case 0: return 0;\n"
815 "#endif\n"
816 "}",
817 Style);
818 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000819 "case 1: {\n"
820 "}\n"
821 "case 2: {\n"
822 " return;\n"
823 "}\n"
824 "case 3: {\n"
825 " x = 1;\n"
826 " return;\n"
827 "}\n"
828 "case 4:\n"
829 " if (x)\n"
830 " return;\n"
831 "}",
832 Style);
833 Style.ColumnLimit = 21;
834 verifyFormat("switch (a) {\n"
835 "case 1: x = 1; break;\n"
836 "case 2: return;\n"
837 "case 3:\n"
838 "case 4:\n"
839 "case 5: return;\n"
840 "default:\n"
841 " y = 1;\n"
842 " break;\n"
843 "}",
844 Style);
845}
846
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000847TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000848 verifyFormat("void f() {\n"
849 " some_code();\n"
850 "test_label:\n"
851 " some_other_code();\n"
852 " {\n"
853 " some_more_code();\n"
854 " another_label:\n"
855 " some_more_code();\n"
856 " }\n"
857 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +0000858 verifyFormat("{\n"
859 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000860 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +0000861 " some_other_code();\n"
862 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000863 verifyFormat("{\n"
864 " some_code();\n"
865 "test_label:;\n"
866 " int i = 0;\n"
867 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000868}
869
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000870//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000871// Tests for classes, namespaces, etc.
872//===----------------------------------------------------------------------===//
873
874TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000875 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000876}
877
878TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
879 verifyFormat("class A {\n"
880 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +0000881 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000882 "protected:\n"
883 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000884 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000885 "};");
886 verifyGoogleFormat("class A {\n"
887 " public:\n"
888 " protected:\n"
889 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000890 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000891 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +0000892 verifyFormat("class A {\n"
893 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000894 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +0000895 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000896 " void f2() {}\n"
897 "protected slots:\n"
898 " void f3() {}\n"
899 "protected Q_SLOTS:\n"
900 " void f4() {}\n"
901 "private slots:\n"
902 " void f5() {}\n"
903 "private Q_SLOTS:\n"
904 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +0000905 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000906 " void g1();\n"
907 "Q_SIGNALS:\n"
908 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +0000909 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +0000910
911 // Don't interpret 'signals' the wrong way.
912 verifyFormat("signals.set();");
913 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +0000914 verifyFormat("{\n"
915 " signals.set(); // This needs indentation.\n"
916 "}");
Daniel Jasper31343832016-07-27 10:13:24 +0000917 verifyFormat("void f() {\n"
918 "label:\n"
919 " signals.baz();\n"
920 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000921}
922
Alexander Kornienkofd433362013-03-27 17:08:02 +0000923TEST_F(FormatTest, SeparatesLogicalBlocks) {
924 EXPECT_EQ("class A {\n"
925 "public:\n"
926 " void f();\n"
927 "\n"
928 "private:\n"
929 " void g() {}\n"
930 " // test\n"
931 "protected:\n"
932 " int h;\n"
933 "};",
934 format("class A {\n"
935 "public:\n"
936 "void f();\n"
937 "private:\n"
938 "void g() {}\n"
939 "// test\n"
940 "protected:\n"
941 "int h;\n"
942 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +0000943 EXPECT_EQ("class A {\n"
944 "protected:\n"
945 "public:\n"
946 " void f();\n"
947 "};",
948 format("class A {\n"
949 "protected:\n"
950 "\n"
951 "public:\n"
952 "\n"
953 " void f();\n"
954 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +0000955
956 // Even ensure proper spacing inside macros.
957 EXPECT_EQ("#define B \\\n"
958 " class A { \\\n"
959 " protected: \\\n"
960 " public: \\\n"
961 " void f(); \\\n"
962 " };",
963 format("#define B \\\n"
964 " class A { \\\n"
965 " protected: \\\n"
966 " \\\n"
967 " public: \\\n"
968 " \\\n"
969 " void f(); \\\n"
970 " };",
971 getGoogleStyle()));
972 // But don't remove empty lines after macros ending in access specifiers.
973 EXPECT_EQ("#define A private:\n"
974 "\n"
975 "int i;",
976 format("#define A private:\n"
977 "\n"
978 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +0000979}
980
Daniel Jasper83193602013-04-05 17:22:09 +0000981TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000982 verifyFormat("class A : public B {};");
983 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +0000984
985 verifyFormat(
986 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000987 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +0000988 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
989 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000990 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +0000991 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000992 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +0000993 verifyFormat("class AAAAAAAAAAAA : public B,\n"
994 " public C,\n"
995 " public D,\n"
996 " public E,\n"
997 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000998 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +0000999
1000 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001001 " ReallyReallyLongClassName {\n"
1002 " int i;\n"
1003 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001004 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001005 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1006 " aaaaaaaaaaaaaaaa> {};");
1007 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1008 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1009 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001010 verifyFormat("template <class R, class C>\n"
1011 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1012 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001013 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001014}
1015
Manuel Klimek28cacc72013-01-07 18:10:23 +00001016TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001017 verifyFormat("class A {\n} a, b;");
1018 verifyFormat("struct A {\n} a, b;");
1019 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001020}
1021
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001022TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001023 verifyFormat("enum {\n"
1024 " Zero,\n"
1025 " One = 1,\n"
1026 " Two = One + 1,\n"
1027 " Three = (One + Two),\n"
1028 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1029 " Five = (One, Two, Three, Four, 5)\n"
1030 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001031 verifyGoogleFormat("enum {\n"
1032 " Zero,\n"
1033 " One = 1,\n"
1034 " Two = One + 1,\n"
1035 " Three = (One + Two),\n"
1036 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1037 " Five = (One, Two, Three, Four, 5)\n"
1038 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001039 verifyFormat("enum Enum {};");
1040 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001041 verifyFormat("enum X E {} d;");
1042 verifyFormat("enum __attribute__((...)) E {} d;");
1043 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001044 verifyFormat("enum {\n"
1045 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001046 "};",
1047 getLLVMStyleWithColumns(30));
1048
1049 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001050 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001051
1052 EXPECT_EQ("enum KeepEmptyLines {\n"
1053 " ONE,\n"
1054 "\n"
1055 " TWO,\n"
1056 "\n"
1057 " THREE\n"
1058 "}",
1059 format("enum KeepEmptyLines {\n"
1060 " ONE,\n"
1061 "\n"
1062 " TWO,\n"
1063 "\n"
1064 "\n"
1065 " THREE\n"
1066 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001067 verifyFormat("enum E { // comment\n"
1068 " ONE,\n"
1069 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001070 "};\n"
1071 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001072 // Not enums.
1073 verifyFormat("enum X f() {\n"
1074 " a();\n"
1075 " return 42;\n"
1076 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001077 verifyFormat("enum X Type::f() {\n"
1078 " a();\n"
1079 " return 42;\n"
1080 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001081 verifyFormat("enum ::X f() {\n"
1082 " a();\n"
1083 " return 42;\n"
1084 "}");
1085 verifyFormat("enum ns::X f() {\n"
1086 " a();\n"
1087 " return 42;\n"
1088 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001089}
1090
Daniel Jasperb7150872013-08-30 10:10:19 +00001091TEST_F(FormatTest, FormatsEnumsWithErrors) {
1092 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001093 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001094 " Two = 1;\n"
1095 "};");
1096 verifyFormat("namespace n {\n"
1097 "enum Type {\n"
1098 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001099 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001100 " int i;\n"
1101 "}\n"
1102 "void g() {}");
1103}
1104
Daniel Jasper2b41a822013-08-20 12:42:50 +00001105TEST_F(FormatTest, FormatsEnumStruct) {
1106 verifyFormat("enum struct {\n"
1107 " Zero,\n"
1108 " One = 1,\n"
1109 " Two = One + 1,\n"
1110 " Three = (One + Two),\n"
1111 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1112 " Five = (One, Two, Three, Four, 5)\n"
1113 "};");
1114 verifyFormat("enum struct Enum {};");
1115 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001116 verifyFormat("enum struct X E {} d;");
1117 verifyFormat("enum struct __attribute__((...)) E {} d;");
1118 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001119 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1120}
1121
1122TEST_F(FormatTest, FormatsEnumClass) {
1123 verifyFormat("enum class {\n"
1124 " Zero,\n"
1125 " One = 1,\n"
1126 " Two = One + 1,\n"
1127 " Three = (One + Two),\n"
1128 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1129 " Five = (One, Two, Three, Four, 5)\n"
1130 "};");
1131 verifyFormat("enum class Enum {};");
1132 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001133 verifyFormat("enum class X E {} d;");
1134 verifyFormat("enum class __attribute__((...)) E {} d;");
1135 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001136 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1137}
1138
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001139TEST_F(FormatTest, FormatsEnumTypes) {
1140 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001141 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001142 " B\n"
1143 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001144 verifyFormat("enum X : int { A, B };");
1145 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001146}
1147
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001148TEST_F(FormatTest, FormatsNSEnums) {
1149 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1150 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1151 " // Information about someDecentlyLongValue.\n"
1152 " someDecentlyLongValue,\n"
1153 " // Information about anotherDecentlyLongValue.\n"
1154 " anotherDecentlyLongValue,\n"
1155 " // Information about aThirdDecentlyLongValue.\n"
1156 " aThirdDecentlyLongValue\n"
1157 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001158 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1159 " a = 1,\n"
1160 " b = 2,\n"
1161 " c = 3,\n"
1162 "};");
1163 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1164 " a = 1,\n"
1165 " b = 2,\n"
1166 " c = 3,\n"
1167 "};");
1168 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1169 " a = 1,\n"
1170 " b = 2,\n"
1171 " c = 3,\n"
1172 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001173}
1174
Nico Weber7769a902013-01-14 05:49:49 +00001175TEST_F(FormatTest, FormatsBitfields) {
1176 verifyFormat("struct Bitfields {\n"
1177 " unsigned sClass : 8;\n"
1178 " unsigned ValueKind : 2;\n"
1179 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001180 verifyFormat("struct A {\n"
1181 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1182 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1183 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001184 verifyFormat("struct MyStruct {\n"
1185 " uchar data;\n"
1186 " uchar : 8;\n"
1187 " uchar : 8;\n"
1188 " uchar other;\n"
1189 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001190}
1191
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001192TEST_F(FormatTest, FormatsNamespaces) {
1193 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001194 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001195 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001196 "}");
1197 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001198 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001199 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001200 "}");
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001201 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001202 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001203 "void f() { f(); }\n"
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001204 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001205 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001206 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001207 "void f() { f(); }");
Manuel Klimek046b9302013-02-06 16:08:09 +00001208
1209 // This code is more common than we thought; if we
1210 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001211 // its own line, which is undesirable.
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001212 verifyFormat("namespace {};");
Manuel Klimek046b9302013-02-06 16:08:09 +00001213 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001214 "class A {};\n"
Manuel Klimek046b9302013-02-06 16:08:09 +00001215 "};");
Daniel Jasper251b3c92013-07-01 11:22:57 +00001216
1217 verifyFormat("namespace {\n"
1218 "int SomeVariable = 0; // comment\n"
1219 "} // namespace");
1220 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1221 "#define HEADER_GUARD\n"
1222 "namespace my_namespace {\n"
1223 "int i;\n"
1224 "} // my_namespace\n"
1225 "#endif // HEADER_GUARD",
1226 format("#ifndef HEADER_GUARD\n"
1227 " #define HEADER_GUARD\n"
1228 " namespace my_namespace {\n"
1229 "int i;\n"
1230 "} // my_namespace\n"
1231 "#endif // HEADER_GUARD"));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001232
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001233 EXPECT_EQ("namespace A::B {\n"
1234 "class C {};\n"
1235 "}",
1236 format("namespace A::B {\n"
1237 "class C {};\n"
1238 "}"));
1239
Daniel Jasper65ee3472013-07-31 23:16:02 +00001240 FormatStyle Style = getLLVMStyle();
1241 Style.NamespaceIndentation = FormatStyle::NI_All;
1242 EXPECT_EQ("namespace out {\n"
1243 " int i;\n"
1244 " namespace in {\n"
1245 " int i;\n"
1246 " } // namespace\n"
1247 "} // namespace",
1248 format("namespace out {\n"
1249 "int i;\n"
1250 "namespace in {\n"
1251 "int i;\n"
1252 "} // namespace\n"
1253 "} // namespace",
1254 Style));
1255
1256 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1257 EXPECT_EQ("namespace out {\n"
1258 "int i;\n"
1259 "namespace in {\n"
1260 " int i;\n"
1261 "} // namespace\n"
1262 "} // namespace",
1263 format("namespace out {\n"
1264 "int i;\n"
1265 "namespace in {\n"
1266 "int i;\n"
1267 "} // namespace\n"
1268 "} // namespace",
1269 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001270}
1271
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001272TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00001273
Daniel Jasper40aacf42013-03-14 13:45:21 +00001274TEST_F(FormatTest, FormatsInlineASM) {
1275 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001276 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001277 verifyFormat(
1278 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1279 " \"cpuid\\n\\t\"\n"
1280 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001281 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001282 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001283 EXPECT_EQ(
1284 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001285 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001286 " mov edx,[that] // vtable in edx\n"
1287 " mov eax,methodIndex\n"
1288 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001289 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001290 "}",
1291 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1292 " __asm {\n"
1293 " mov edx,[that] // vtable in edx\n"
1294 " mov eax,methodIndex\n"
1295 " call [edx][eax*4] // stdcall\n"
1296 " }\n"
1297 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001298 EXPECT_EQ("_asm {\n"
1299 " xor eax, eax;\n"
1300 " cpuid;\n"
1301 "}",
1302 format("_asm {\n"
1303 " xor eax, eax;\n"
1304 " cpuid;\n"
1305 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001306 verifyFormat("void function() {\n"
1307 " // comment\n"
1308 " asm(\"\");\n"
1309 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001310 EXPECT_EQ("__asm {\n"
1311 "}\n"
1312 "int i;",
1313 format("__asm {\n"
1314 "}\n"
1315 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001316}
1317
Nico Weberd5650bd2013-01-07 16:36:17 +00001318TEST_F(FormatTest, FormatTryCatch) {
1319 verifyFormat("try {\n"
1320 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001321 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001322 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001323 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001324 " exit(42);\n"
1325 "}");
1326
1327 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001328 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001329 " return 5;\n"
1330 "}");
1331 verifyFormat("class A {\n"
1332 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001333 " A() try : a(0) {\n"
1334 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001335 " throw;\n"
1336 " }\n"
1337 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001338
1339 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001340 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001341}
1342
Nico Weberfac23712015-02-04 15:26:27 +00001343TEST_F(FormatTest, FormatSEHTryCatch) {
1344 verifyFormat("__try {\n"
1345 " int a = b * c;\n"
1346 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1347 " // Do nothing.\n"
1348 "}");
1349
1350 verifyFormat("__try {\n"
1351 " int a = b * c;\n"
1352 "} __finally {\n"
1353 " // Do nothing.\n"
1354 "}");
1355
1356 verifyFormat("DEBUG({\n"
1357 " __try {\n"
1358 " } __finally {\n"
1359 " }\n"
1360 "});\n");
1361}
1362
Daniel Jasper04a71a42014-05-08 11:58:24 +00001363TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1364 verifyFormat("try {\n"
1365 " f();\n"
1366 "} catch {\n"
1367 " g();\n"
1368 "}");
1369 verifyFormat("try {\n"
1370 " f();\n"
1371 "} catch (A a) MACRO(x) {\n"
1372 " g();\n"
1373 "} catch (B b) MACRO(x) {\n"
1374 " g();\n"
1375 "}");
1376}
1377
1378TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1379 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001380 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1381 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001382 Style.BreakBeforeBraces = BraceStyle;
1383 verifyFormat("try {\n"
1384 " // something\n"
1385 "} catch (...) {\n"
1386 " // something\n"
1387 "}",
1388 Style);
1389 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001390 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1391 verifyFormat("try {\n"
1392 " // something\n"
1393 "}\n"
1394 "catch (...) {\n"
1395 " // something\n"
1396 "}",
1397 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001398 verifyFormat("__try {\n"
1399 " // something\n"
1400 "}\n"
1401 "__finally {\n"
1402 " // something\n"
1403 "}",
1404 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001405 verifyFormat("@try {\n"
1406 " // something\n"
1407 "}\n"
1408 "@finally {\n"
1409 " // something\n"
1410 "}",
1411 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001412 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1413 verifyFormat("try\n"
1414 "{\n"
1415 " // something\n"
1416 "}\n"
1417 "catch (...)\n"
1418 "{\n"
1419 " // something\n"
1420 "}",
1421 Style);
1422 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1423 verifyFormat("try\n"
1424 " {\n"
1425 " // something\n"
1426 " }\n"
1427 "catch (...)\n"
1428 " {\n"
1429 " // something\n"
1430 " }",
1431 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001432 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1433 Style.BraceWrapping.BeforeCatch = true;
1434 verifyFormat("try {\n"
1435 " // something\n"
1436 "}\n"
1437 "catch (...) {\n"
1438 " // something\n"
1439 "}",
1440 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001441}
1442
Daniel Jaspere25509f2012-12-17 11:29:41 +00001443TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001444 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001445
Daniel Jaspera44991332015-04-29 13:06:49 +00001446 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1447 " 100000000, "
1448 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001449
Daniel Jasper473c62c2013-05-17 09:35:01 +00001450 // Here, everything other than the "}" would fit on a line.
1451 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001452 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001453 EXPECT_EQ("S s = {a,\n"
1454 "\n"
1455 " b};",
1456 format("S s = {\n"
1457 " a,\n"
1458 "\n"
1459 " b\n"
1460 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001461
1462 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1463 // line. However, the formatting looks a bit off and this probably doesn't
1464 // happen often in practice.
1465 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001466 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001467 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001468}
1469
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001470TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001471 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1472 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1473 " .bbbbbbbbbb = 2,\n"
1474 " .cccccccccc = 3,\n"
1475 " .dddddddddd = 4,\n"
1476 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001477 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001478 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1479 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1480 " .ccccccccccccccccccccccccccc = 3,\n"
1481 " .ddddddddddddddddddddddddddd = 4,\n"
1482 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001483
1484 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
1485}
1486
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001487TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001488 verifyFormat("static A x = {{{}}};\n");
1489 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
1490 " {init1, init2, init3, init4}}};",
1491 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00001492
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001493 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001494 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1495 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1496 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
1497 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00001498 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001499 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1500 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1501 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00001502 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
1503 " {rect.fRight - rect.fLeft, rect.fBottom - "
1504 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001505
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001506 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001507 "SomeArrayOfSomeType a = {\n"
1508 " {{1, 2, 3},\n"
1509 " {1, 2, 3},\n"
1510 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
1511 " 333333333333333333333333333333},\n"
1512 " {1, 2, 3},\n"
1513 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00001514 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00001515 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001516 " {{1, 2, 3}},\n"
1517 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001518 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
1519 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001520 " {{1, 2, 3}},\n"
1521 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001522
Daniel Jaspera44991332015-04-29 13:06:49 +00001523 verifyFormat("struct {\n"
1524 " unsigned bit;\n"
1525 " const char *const name;\n"
1526 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
1527 " {kOsWin, \"Windows\"},\n"
1528 " {kOsLinux, \"Linux\"},\n"
1529 " {kOsCrOS, \"Chrome OS\"}};");
1530 verifyFormat("struct {\n"
1531 " unsigned bit;\n"
1532 " const char *const name;\n"
1533 "} kBitsToOs[] = {\n"
1534 " {kOsMac, \"Mac\"},\n"
1535 " {kOsWin, \"Windows\"},\n"
1536 " {kOsLinux, \"Linux\"},\n"
1537 " {kOsCrOS, \"Chrome OS\"},\n"
1538 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001539}
1540
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001541TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
1542 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1543 " \\\n"
1544 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
1545}
1546
Daniel Jasperda16db32013-01-07 10:48:50 +00001547TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001548 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
1549 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00001550
1551 // Do break defaulted and deleted functions.
1552 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1553 " default;",
1554 getLLVMStyleWithColumns(40));
1555 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1556 " delete;",
1557 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001558}
1559
1560TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
1561 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
1562 getLLVMStyleWithColumns(40));
1563 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1564 getLLVMStyleWithColumns(40));
1565 EXPECT_EQ("#define Q \\\n"
1566 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
1567 " \"aaaaaaaa.cpp\"",
1568 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1569 getLLVMStyleWithColumns(40)));
1570}
1571
1572TEST_F(FormatTest, UnderstandsLinePPDirective) {
1573 EXPECT_EQ("# 123 \"A string literal\"",
1574 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00001575}
1576
Manuel Klimek591b5802013-01-31 15:58:48 +00001577TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00001578 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00001579 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001580}
1581
1582TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
1583 EXPECT_EQ("#line 42 \"test\"\n",
1584 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001585 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
1586 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001587}
1588
1589TEST_F(FormatTest, EndOfFileEndsPPDirective) {
1590 EXPECT_EQ("#line 42 \"test\"",
1591 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001592 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001593}
1594
Daniel Jasper877615c2013-10-11 19:45:02 +00001595TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
1596 verifyFormat("#define A \\x20");
1597 verifyFormat("#define A \\ x20");
1598 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
1599 verifyFormat("#define A ''");
1600 verifyFormat("#define A ''qqq");
1601 verifyFormat("#define A `qqq");
1602 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00001603 EXPECT_EQ("const char *c = STRINGIFY(\n"
1604 "\\na : b);",
1605 format("const char * c = STRINGIFY(\n"
1606 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00001607
1608 verifyFormat("a\r\\");
1609 verifyFormat("a\v\\");
1610 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00001611}
1612
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001613TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001614 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
1615 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001616 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001617 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00001618 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00001619
1620 verifyFormat("#define A A\n#define A A");
1621 verifyFormat("#define A(X) A\n#define A A");
1622
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001623 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
1624 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001625}
1626
1627TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001628 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001629 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001630 "#define A( \\\n"
1631 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001632 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001633 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001634 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001635 " #include \"a.h\"\n"
1636 "#define A(A,\\\n"
1637 " B)\n"
1638 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001639 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001640 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001641}
1642
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001643TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001644
1645TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
1646 EXPECT_EQ("#define A \\\n"
1647 " c; \\\n"
1648 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001649 "f;",
1650 format("#define A c; e;\n"
1651 "f;",
1652 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001653}
1654
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001655TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001656
Manuel Klimek1abf7892013-01-04 23:34:14 +00001657TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00001658 EXPECT_EQ("int x,\n"
1659 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001660 " y;",
1661 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001662}
1663
Manuel Klimek09e07972013-01-05 21:34:55 +00001664TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00001665 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00001666 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00001667 verifyFormat("#define A \\\n"
1668 " { \\\n"
1669 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001670 " }",
1671 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00001672
1673 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001674 " void function##X()",
1675 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00001676
1677 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001678 " void a##b##c()",
1679 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00001680
Daniel Jasper39825ea2013-01-14 15:40:57 +00001681 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00001682}
1683
Manuel Klimekd053c5b2013-01-23 14:37:36 +00001684TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00001685 EXPECT_EQ("#define A (x)", format("#define A (x)"));
1686 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00001687}
1688
Manuel Klimek0c137952013-02-11 12:33:24 +00001689TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
1690 EXPECT_EQ("#define A b;", format("#define A \\\n"
1691 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001692 " b;",
1693 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001694 EXPECT_EQ("#define A \\\n"
1695 " \\\n"
1696 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001697 " b;",
1698 format("#define A \\\n"
1699 " \\\n"
1700 " a; \\\n"
1701 " b;",
1702 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001703 EXPECT_EQ("#define A \\\n"
1704 " a; \\\n"
1705 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001706 " b;",
1707 format("#define A \\\n"
1708 " a; \\\n"
1709 " \\\n"
1710 " b;",
1711 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001712}
1713
Daniel Jasper00475962013-02-19 17:14:38 +00001714TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001715 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00001716 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00001717 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00001718 " case 2\n",
1719 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00001720 verifyFormat("#define MACRO(a) \\\n"
1721 " if (a) \\\n"
1722 " f(); \\\n"
1723 " else \\\n"
1724 " g()",
1725 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00001726 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001727 verifyIncompleteFormat("#define STR(x) #x\n"
1728 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00001729 verifyFormat("#pragma omp threadprivate( \\\n"
1730 " y)), // expected-warning",
1731 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00001732 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00001733 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001734 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00001735 "#define b \\\n"
1736 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001737 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00001738 "a",
1739 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00001740 verifyFormat("#define A \\\n"
1741 " { \\\n"
1742 " {\n"
1743 "#define B \\\n"
1744 " } \\\n"
1745 " }",
1746 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00001747 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00001748 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00001749 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00001750 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00001751}
1752
Daniel Jasper40e19212013-05-29 13:16:10 +00001753TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
1754 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
1755 EXPECT_EQ("class A : public QObject {\n"
1756 " Q_OBJECT\n"
1757 "\n"
1758 " A() {}\n"
1759 "};",
1760 format("class A : public QObject {\n"
1761 " Q_OBJECT\n"
1762 "\n"
1763 " A() {\n}\n"
1764 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00001765 EXPECT_EQ("MACRO\n"
1766 "/*static*/ int i;",
1767 format("MACRO\n"
1768 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00001769 EXPECT_EQ("SOME_MACRO\n"
1770 "namespace {\n"
1771 "void f();\n"
1772 "}",
1773 format("SOME_MACRO\n"
1774 " namespace {\n"
1775 "void f( );\n"
1776 "}"));
Daniel Jasper40e19212013-05-29 13:16:10 +00001777 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00001778 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
1779 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00001780 // Only if everything is upper case.
1781 EXPECT_EQ("class A : public QObject {\n"
1782 " Q_Object A() {}\n"
1783 "};",
1784 format("class A : public QObject {\n"
1785 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00001786 " A() {\n}\n"
1787 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00001788
1789 // Only if the next line can actually start an unwrapped line.
1790 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
1791 format("SOME_WEIRD_LOG_MACRO\n"
1792 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00001793
1794 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00001795 "(n, buffers))\n",
1796 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00001797}
1798
Alexander Kornienkode644272013-04-08 22:16:06 +00001799TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
1800 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
1801 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
1802 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001803 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00001804 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
1805 "int *createScopDetectionPass() { return 0; }",
1806 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
1807 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
1808 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
1809 " class X {};\n"
1810 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
1811 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001812 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
1813 // braces, so that inner block is indented one level more.
1814 EXPECT_EQ("int q() {\n"
1815 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
1816 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
1817 " IPC_END_MESSAGE_MAP()\n"
1818 "}",
1819 format("int q() {\n"
1820 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
1821 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
1822 " IPC_END_MESSAGE_MAP()\n"
1823 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00001824
Daniel Jasper352dae12014-01-03 11:50:46 +00001825 // Same inside macros.
1826 EXPECT_EQ("#define LIST(L) \\\n"
1827 " L(A) \\\n"
1828 " L(B) \\\n"
1829 " L(C)",
1830 format("#define LIST(L) \\\n"
1831 " L(A) \\\n"
1832 " L(B) \\\n"
1833 " L(C)",
1834 getGoogleStyle()));
1835
Daniel Jasper545c6522013-09-17 09:26:07 +00001836 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001837 EXPECT_EQ("int q() {\n"
1838 " f(x);\n"
1839 " f(x) {}\n"
1840 " f(x)->g();\n"
1841 " f(x)->*g();\n"
1842 " f(x).g();\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) >>= x;\n"
1853 " f(x) <<= x;\n"
1854 " f(x)[y].z();\n"
1855 " LOG(INFO) << x;\n"
1856 " ifstream(x) >> x;\n"
1857 "}\n",
1858 format("int q() {\n"
1859 " f(x)\n;\n"
1860 " f(x)\n {}\n"
1861 " f(x)\n->g();\n"
1862 " f(x)\n->*g();\n"
1863 " f(x)\n.g();\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 >>= x;\n"
1874 " f(x)\n <<= x;\n"
1875 " f(x)\n[y].z();\n"
1876 " LOG(INFO)\n << x;\n"
1877 " ifstream(x)\n >> x;\n"
1878 "}\n"));
1879 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001880 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001881 " if (1) {\n"
1882 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001883 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001884 " while (1) {\n"
1885 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001886 " F(x)\n"
1887 " G(x);\n"
1888 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001889 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001890 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001891 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001892 " }\n"
1893 "}\n",
1894 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001895 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001896 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001897 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001898 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001899 "F(x)\n"
1900 "G(x);\n"
1901 "F(x)\n"
1902 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001903 "}\n"));
1904 EXPECT_EQ("class A {\n"
1905 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00001906 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001907 " A(X x)\n" // FIXME: function-level try blocks are broken.
1908 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001909 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001910 " }\n"
1911 "};",
1912 format("class A {\n"
1913 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00001914 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001915 " A(X x)\n"
1916 " try : t(0) {} catch (...) {}\n"
1917 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00001918 EXPECT_EQ("class SomeClass {\n"
1919 "public:\n"
1920 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1921 "};",
1922 format("class SomeClass {\n"
1923 "public:\n"
1924 " SomeClass()\n"
1925 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1926 "};"));
1927 EXPECT_EQ("class SomeClass {\n"
1928 "public:\n"
1929 " SomeClass()\n"
1930 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1931 "};",
1932 format("class SomeClass {\n"
1933 "public:\n"
1934 " SomeClass()\n"
1935 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1936 "};",
1937 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00001938
1939 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00001940}
1941
Manuel Klimek4fe43002013-05-22 12:51:29 +00001942TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
1943 verifyFormat("#define A \\\n"
1944 " f({ \\\n"
1945 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001946 " });",
1947 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00001948}
1949
Manuel Klimekef2cfb12013-01-05 22:14:16 +00001950TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
1951 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
1952}
1953
Manuel Klimek52d0fd82013-01-05 22:56:06 +00001954TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001955 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00001956}
1957
Manuel Klimek1058d982013-01-06 20:07:31 +00001958TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
1959 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
1960 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
1961 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
1962 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
1963}
Manuel Klimek1abf7892013-01-04 23:34:14 +00001964
Daniel Jaspere2408e32015-05-06 11:16:43 +00001965TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00001966 EXPECT_EQ(
1967 "#define A \\\n int i; \\\n int j;",
1968 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00001969 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00001970 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00001971 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00001972 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00001973}
1974
Manuel Klimek38ba11e2013-01-07 09:24:17 +00001975TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
1976 verifyFormat("#define A \\\n"
1977 " int v( \\\n"
1978 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001979 " int i;",
1980 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00001981}
1982
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001983TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00001984 EXPECT_EQ(
1985 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1986 " \\\n"
1987 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
1988 "\n"
1989 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
1990 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
1991 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
1992 "\\\n"
1993 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
1994 " \n"
1995 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
1996 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001997}
1998
Manuel Klimek52b15152013-01-09 15:25:02 +00001999TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2000 EXPECT_EQ("int\n"
2001 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002002 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002003 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002004 verifyFormat("functionCallTo(\n"
2005 " someOtherFunction(\n"
2006 " withSomeParameters, whichInSequence,\n"
2007 " areLongerThanALine(andAnotherCall,\n"
2008 "#define A B\n"
2009 " withMoreParamters,\n"
2010 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002011 " andMoreParameters),\n"
2012 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002013 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002014 verifyFormat("Foo::Foo()\n"
2015 "#ifdef BAR\n"
2016 " : baz(0)\n"
2017 "#endif\n"
2018 "{\n"
2019 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002020 verifyFormat("void f() {\n"
2021 " if (true)\n"
2022 "#ifdef A\n"
2023 " f(42);\n"
2024 " x();\n"
2025 "#else\n"
2026 " g();\n"
2027 " x();\n"
2028 "#endif\n"
2029 "}");
2030 verifyFormat("void f(param1, param2,\n"
2031 " param3,\n"
2032 "#ifdef A\n"
2033 " param4(param5,\n"
2034 "#ifdef A1\n"
2035 " param6,\n"
2036 "#ifdef A2\n"
2037 " param7),\n"
2038 "#else\n"
2039 " param8),\n"
2040 " param9,\n"
2041 "#endif\n"
2042 " param10,\n"
2043 "#endif\n"
2044 " param11)\n"
2045 "#else\n"
2046 " param12)\n"
2047 "#endif\n"
2048 "{\n"
2049 " x();\n"
2050 "}",
2051 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002052 verifyFormat("#if 1\n"
2053 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002054 verifyFormat("#if 1\n"
2055 "#endif\n"
2056 "#if 1\n"
2057 "#else\n"
2058 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002059 verifyFormat("DEBUG({\n"
2060 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2061 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2062 "});\n"
2063 "#if a\n"
2064 "#else\n"
2065 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002066
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002067 verifyIncompleteFormat("void f(\n"
2068 "#if A\n"
2069 " );\n"
2070 "#else\n"
2071 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002072}
2073
Manuel Klimek14bd9172014-01-29 08:49:02 +00002074TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2075 verifyFormat("#endif\n"
2076 "#if B");
2077}
2078
Manuel Klimek88033d72013-10-21 08:11:15 +00002079TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2080 FormatStyle SingleLine = getLLVMStyle();
2081 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002082 verifyFormat("#if 0\n"
2083 "#elif 1\n"
2084 "#endif\n"
2085 "void foo() {\n"
2086 " if (test) foo2();\n"
2087 "}",
2088 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002089}
2090
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002091TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002092 verifyFormat("functionCall({ int i; });");
2093 verifyFormat("functionCall({\n"
2094 " int i;\n"
2095 " int j;\n"
2096 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002097 verifyFormat("functionCall(\n"
2098 " {\n"
2099 " int i;\n"
2100 " int j;\n"
2101 " },\n"
2102 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002103 verifyFormat("functionA(functionB({\n"
2104 " int i;\n"
2105 " int j;\n"
2106 " }),\n"
2107 " aaaa, bbbb, cccc);");
2108 verifyFormat("functionCall(\n"
2109 " {\n"
2110 " int i;\n"
2111 " int j;\n"
2112 " },\n"
2113 " aaaa, bbbb, // comment\n"
2114 " cccc);");
2115 verifyFormat("functionA(functionB({\n"
2116 " int i;\n"
2117 " int j;\n"
2118 " }),\n"
2119 " aaaa, bbbb, // comment\n"
2120 " cccc);");
2121 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2122 verifyFormat("functionCall(aaaa, bbbb, {\n"
2123 " int i;\n"
2124 " int j;\n"
2125 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002126 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002127 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002128 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002129 " int i; // break\n"
2130 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002131 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2132 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002133 verifyFormat("DEBUG({\n"
2134 " if (a)\n"
2135 " f();\n"
2136 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002137}
2138
2139TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002140 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002141 "int i;",
2142 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002143}
2144
2145TEST_F(FormatTest, LayoutNestedBlocks) {
2146 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2147 " struct s {\n"
2148 " int i;\n"
2149 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002150 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002151 " for (int i = 0; i < 10; ++i)\n"
2152 " return;\n"
2153 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002154 verifyFormat("call(parameter, {\n"
2155 " something();\n"
2156 " // Comment using all columns.\n"
2157 " somethingelse();\n"
2158 "});",
2159 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002160 verifyFormat("DEBUG( //\n"
2161 " { f(); }, a);");
2162 verifyFormat("DEBUG( //\n"
2163 " {\n"
2164 " f(); //\n"
2165 " },\n"
2166 " a);");
2167
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002168 EXPECT_EQ("call(parameter, {\n"
2169 " something();\n"
2170 " // Comment too\n"
2171 " // looooooooooong.\n"
2172 " somethingElse();\n"
2173 "});",
2174 format("call(parameter, {\n"
2175 " something();\n"
2176 " // Comment too looooooooooong.\n"
2177 " somethingElse();\n"
2178 "});",
2179 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002180 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00002181 EXPECT_EQ("DEBUG({ // comment\n"
2182 " int i;\n"
2183 "});",
2184 format("DEBUG({ // comment\n"
2185 "int i;\n"
2186 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002187 EXPECT_EQ("DEBUG({\n"
2188 " int i;\n"
2189 "\n"
2190 " // comment\n"
2191 " int j;\n"
2192 "});",
2193 format("DEBUG({\n"
2194 " int i;\n"
2195 "\n"
2196 " // comment\n"
2197 " int j;\n"
2198 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00002199
2200 verifyFormat("DEBUG({\n"
2201 " if (a)\n"
2202 " return;\n"
2203 "});");
2204 verifyGoogleFormat("DEBUG({\n"
2205 " if (a) return;\n"
2206 "});");
2207 FormatStyle Style = getGoogleStyle();
2208 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00002209 verifyFormat("Debug(aaaaa,\n"
2210 " {\n"
2211 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
2212 " },\n"
2213 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00002214 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002215
Daniel Jaspera87af7a2015-06-30 11:32:22 +00002216 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
2217
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002218 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00002219}
2220
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002221TEST_F(FormatTest, FormatNestedBlocksInMacros) {
2222 EXPECT_EQ("#define MACRO() \\\n"
2223 " Debug(aaa, /* force line break */ \\\n"
2224 " { \\\n"
2225 " int i; \\\n"
2226 " int j; \\\n"
2227 " })",
2228 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
2229 " { int i; int j; })",
2230 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00002231
2232 EXPECT_EQ("#define A \\\n"
2233 " [] { \\\n"
2234 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2235 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
2236 " }",
2237 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2238 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
2239 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002240}
2241
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002242TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2243 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002244 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002245 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002246}
2247
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00002248TEST_F(FormatTest, FormatBeginBlockEndMacros) {
2249 FormatStyle Style = getLLVMStyle();
2250 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
2251 Style.MacroBlockEnd = "^[A-Z_]+_END$";
2252 verifyFormat("FOO_BEGIN\n"
2253 " FOO_ENTRY\n"
2254 "FOO_END", Style);
2255 verifyFormat("FOO_BEGIN\n"
2256 " NESTED_FOO_BEGIN\n"
2257 " NESTED_FOO_ENTRY\n"
2258 " NESTED_FOO_END\n"
2259 "FOO_END", Style);
2260 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
2261 " int x;\n"
2262 " x = 1;\n"
2263 "FOO_END(Baz)", Style);
2264}
2265
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002266//===----------------------------------------------------------------------===//
2267// Line break tests.
2268//===----------------------------------------------------------------------===//
2269
Daniel Jasperf79b0b12013-08-30 08:29:25 +00002270TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002271 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00002272 "void f() {\n"
2273 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
2274 " parameter, parameter, parameter)),\n"
2275 " SecondLongCall(parameter));\n"
2276 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002277 verifyFormat(
2278 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2279 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2280 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2281 " aaaaaaaaaaaaaaaaaaaaaaaa);");
2282 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00002283 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2284 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
2285 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
2286 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002287 verifyFormat(
2288 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
2289 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
2290 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
2291 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00002292 verifyFormat("int a = bbbb && ccc &&\n"
2293 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00002294 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00002295 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002296}
2297
Daniel Jasperd69fc772013-05-08 14:12:04 +00002298TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
2299 verifyFormat(
2300 "bool aaaaaaa =\n"
2301 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
2302 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002303 verifyFormat(
2304 "bool aaaaaaa =\n"
2305 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
2306 " bbbbbbbb();");
2307
Daniel Jasperd69fc772013-05-08 14:12:04 +00002308 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2309 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
2310 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002311 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2312 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
2313 " ccccccccc == ddddddddddd;");
2314 verifyFormat(
2315 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
2316 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
2317 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00002318
2319 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2320 " aaaaaa) &&\n"
2321 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00002322 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2323 " aaaaaa) >>\n"
2324 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00002325 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00002326 " SourceMgr.getSpellingColumnNumber(\n"
2327 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
2328 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00002329
Daniel Jasper68d888c2013-06-03 08:42:05 +00002330 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2331 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
2332 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00002333 verifyFormat("b = a &&\n"
2334 " // Comment\n"
2335 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00002336
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002337 // If the LHS of a comparison is not a binary expression itself, the
2338 // additional linebreak confuses many people.
2339 verifyFormat(
2340 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2341 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
2342 "}");
2343 verifyFormat(
2344 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2345 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2346 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00002347 verifyFormat(
2348 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
2349 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2350 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002351 // Even explicit parentheses stress the precedence enough to make the
2352 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00002353 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2354 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2355 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002356 // This cases is borderline, but with the indentation it is still readable.
2357 verifyFormat(
2358 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2359 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2360 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
2361 "}",
2362 getLLVMStyleWithColumns(75));
2363
2364 // If the LHS is a binary expression, we should still use the additional break
2365 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00002366 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2367 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2368 " 5) {\n"
2369 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002370
Daniel Jasper571f1af2013-05-14 20:39:56 +00002371 FormatStyle OnePerLine = getLLVMStyle();
2372 OnePerLine.BinPackParameters = false;
2373 verifyFormat(
2374 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2375 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2376 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
2377 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00002378
2379 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
2380 " .aaa(aaaaaaaaaaaaa) *\n"
2381 " aaaaaaa +\n"
2382 " aaaaaaa;",
2383 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00002384}
2385
Daniel Jasper6bee6822013-04-08 20:33:42 +00002386TEST_F(FormatTest, ExpressionIndentation) {
2387 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2389 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2390 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2391 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
2392 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
2393 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2394 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
2395 " ccccccccccccccccccccccccccccccccccccccccc;");
2396 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2397 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2398 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2399 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2400 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2401 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2402 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2403 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2404 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2405 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2406 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2407 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002408 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002409 "} else if (aaaaa && bbbbb > // break\n"
2410 " ccccc) {\n"
2411 "}");
2412 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00002413 "} else if (aaaaa &&\n"
2414 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002415 " ccccc &&\n"
2416 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002417 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00002418
2419 // Presence of a trailing comment used to change indentation of b.
2420 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
2421 " b;\n"
2422 "return aaaaaaaaaaaaaaaaaaa +\n"
2423 " b; //",
2424 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00002425}
2426
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002427TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
2428 // Not sure what the best system is here. Like this, the LHS can be found
2429 // immediately above an operator (everything with the same or a higher
2430 // indent). The RHS is aligned right of the operator and so compasses
2431 // everything until something with the same indent as the operator is found.
2432 // FIXME: Is this a good system?
2433 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00002434 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002435 verifyFormat(
2436 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002437 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2438 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2439 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2440 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2441 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002442 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002443 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2444 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002445 Style);
2446 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002447 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2448 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002449 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2450 Style);
2451 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002452 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2453 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002454 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2455 Style);
2456 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2457 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002458 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2459 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002460 Style);
2461 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00002462 "} else if (aaaaa\n"
2463 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002464 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002465 "}",
2466 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00002467 verifyFormat("return (a)\n"
2468 " // comment\n"
2469 " + b;",
2470 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00002471 verifyFormat(
2472 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2473 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2474 " + cc;",
2475 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002476
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00002477 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2478 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
2479 Style);
2480
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002481 // Forced by comments.
2482 verifyFormat(
2483 "unsigned ContentSize =\n"
2484 " sizeof(int16_t) // DWARF ARange version number\n"
2485 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
2486 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
2487 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00002488
2489 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
2490 " == boost::fusion::at_c<1>(iiii).second;",
2491 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00002492
2493 Style.ColumnLimit = 60;
2494 verifyFormat("zzzzzzzzzz\n"
2495 " = bbbbbbbbbbbbbbbbb\n"
2496 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
2497 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002498}
2499
Daniel Jasperb1270392017-02-01 23:27:37 +00002500TEST_F(FormatTest, EnforcedOperatorWraps) {
2501 // Here we'd like to wrap after the || operators, but a comment is forcing an
2502 // earlier wrap.
2503 verifyFormat("bool x = aaaaa //\n"
2504 " || bbbbb\n"
2505 " //\n"
2506 " || cccc;");
2507}
2508
Daniel Jasper3219e432014-12-02 13:24:51 +00002509TEST_F(FormatTest, NoOperandAlignment) {
2510 FormatStyle Style = getLLVMStyle();
2511 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00002512 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
2513 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2514 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
2515 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002516 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00002517 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2518 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2519 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2520 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2521 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2522 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2523 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2524 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2525 " > ccccccccccccccccccccccccccccccccccccccccc;",
2526 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002527
2528 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2529 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2530 " + cc;",
2531 Style);
2532 verifyFormat("int a = aa\n"
2533 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002534 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00002535 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00002536
Daniel Jasper6501f7e2015-10-27 12:38:37 +00002537 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00002538 verifyFormat("return (a > b\n"
2539 " // comment1\n"
2540 " // comment2\n"
2541 " || c);",
2542 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002543}
2544
Daniel Jasperac043c92014-09-15 11:11:00 +00002545TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
2546 FormatStyle Style = getLLVMStyle();
2547 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2548 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
2549 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00002550 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
2551 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00002552}
2553
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002554TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002555 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002556 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
2557 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002558 verifyFormat("Constructor()\n"
2559 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002560 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002561 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002562 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002563 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002564
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002565 verifyFormat("template <typename T>\n"
2566 "Constructor() : Initializer(FitsOnTheLine) {}",
2567 getLLVMStyleWithColumns(45));
2568
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002569 verifyFormat(
2570 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002571 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002572
2573 verifyFormat(
2574 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002575 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002576 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002577 verifyFormat(
2578 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002579 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002580 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002581 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2582 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2583 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002584
2585 verifyFormat("Constructor()\n"
2586 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2587 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2588 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002589 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002590
Daniel Jasper65585ed2013-01-28 13:31:35 +00002591 verifyFormat("Constructor()\n"
2592 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002593 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00002594
Daniel Jasper62e68172013-02-25 15:59:54 +00002595 verifyFormat("Constructor(int Parameter = 0)\n"
2596 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
2597 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00002598 verifyFormat("Constructor()\n"
2599 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
2600 "}",
2601 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00002602 verifyFormat("Constructor()\n"
2603 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2604 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00002605
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002606 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002607 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002608 verifyFormat("Constructor()\n"
2609 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
2610 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
2611 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002612
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002613 FormatStyle OnePerLine = getLLVMStyle();
2614 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00002615 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002616 verifyFormat("SomeClass::Constructor()\n"
2617 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2618 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002619 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002620 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002621 verifyFormat("SomeClass::Constructor()\n"
2622 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
2623 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002624 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002625 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002626 verifyFormat("MyClass::MyClass(int var)\n"
2627 " : some_var_(var), // 4 space indent\n"
2628 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002629 "}",
2630 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00002631 verifyFormat("Constructor()\n"
2632 " : aaaaa(aaaaaa),\n"
2633 " aaaaa(aaaaaa),\n"
2634 " aaaaa(aaaaaa),\n"
2635 " aaaaa(aaaaaa),\n"
2636 " aaaaa(aaaaaa) {}",
2637 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00002638 verifyFormat("Constructor()\n"
2639 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
2640 " aaaaaaaaaaaaaaaaaaaaaa) {}",
2641 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00002642 OnePerLine.BinPackParameters = false;
2643 verifyFormat(
2644 "Constructor()\n"
2645 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2646 " aaaaaaaaaaa().aaa(),\n"
2647 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2648 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00002649 OnePerLine.ColumnLimit = 60;
2650 verifyFormat("Constructor()\n"
2651 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
2652 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
2653 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00002654
2655 EXPECT_EQ("Constructor()\n"
2656 " : // Comment forcing unwanted break.\n"
2657 " aaaa(aaaa) {}",
2658 format("Constructor() :\n"
2659 " // Comment forcing unwanted break.\n"
2660 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002661}
2662
2663TEST_F(FormatTest, MemoizationTests) {
2664 // This breaks if the memoization lookup does not take \c Indent and
2665 // \c LastSpace into account.
2666 verifyFormat(
2667 "extern CFRunLoopTimerRef\n"
2668 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
2669 " CFTimeInterval interval, CFOptionFlags flags,\n"
2670 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002671 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002672
2673 // Deep nesting somewhat works around our memoization.
2674 verifyFormat(
2675 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2676 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2677 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2678 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2679 " aaaaa())))))))))))))))))))))))))))))))))))))));",
2680 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00002681 verifyFormat(
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(\n"
2705 " aaaaa,\n"
2706 " aaaaa))))))))))));",
2707 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00002708 verifyFormat(
2709 "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"
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),\n"
2725 " a),\n"
2726 " a)",
2727 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00002728
2729 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002730 FormatStyle OnePerLine = getLLVMStyle();
2731 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002732 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00002733 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00002734 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00002735 for (unsigned i = 0, e = 80; i != e; ++i) {
2736 input += " a,\n";
2737 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002738 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002739 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002740}
2741
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002742TEST_F(FormatTest, BreaksAsHighAsPossible) {
2743 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00002744 "void f() {\n"
2745 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
2746 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
2747 " f();\n"
2748 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00002749 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00002750 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002751}
2752
Daniel Jasper6728fc12013-04-11 14:29:13 +00002753TEST_F(FormatTest, BreaksFunctionDeclarations) {
2754 // Principially, we break function declarations in a certain order:
2755 // 1) break amongst arguments.
2756 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
2757 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00002758 verifyFormat("template <class TemplateIt>\n"
2759 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
2760 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00002761
2762 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00002763 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002764 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002765 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002766 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002767
2768 // 3) break after (.
2769 verifyFormat(
2770 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00002771 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
2772 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002773
2774 // 4) break before after nested name specifiers.
2775 verifyFormat(
2776 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002777 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
2778 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002779 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002780
2781 // However, there are exceptions, if a sufficient amount of lines can be
2782 // saved.
2783 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
2784 // more adjusting.
2785 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
2786 " Cccccccccccccc cccccccccc,\n"
2787 " Cccccccccccccc cccccccccc,\n"
2788 " Cccccccccccccc cccccccccc,\n"
2789 " Cccccccccccccc cccccccccc);");
2790 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002791 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002792 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2793 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2794 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002795 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002796 verifyFormat(
2797 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
2798 " Cccccccccccccc cccccccccc,\n"
2799 " Cccccccccccccc cccccccccc,\n"
2800 " Cccccccccccccc cccccccccc,\n"
2801 " Cccccccccccccc cccccccccc,\n"
2802 " Cccccccccccccc cccccccccc,\n"
2803 " Cccccccccccccc cccccccccc);");
2804 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
2805 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2806 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2807 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2808 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00002809
2810 // Break after multi-line parameters.
2811 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2812 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2813 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2814 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00002815 verifyFormat("void SomeLoooooooooooongFunction(\n"
2816 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
2817 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2818 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00002819
2820 // Treat overloaded operators like other functions.
2821 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2822 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00002823 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2824 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00002825 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2826 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
2827 verifyGoogleFormat(
2828 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
2829 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00002830 verifyGoogleFormat(
2831 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
2832 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00002833 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2834 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
2835 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
2836 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00002837 verifyGoogleFormat(
2838 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
2839 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2840 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00002841 verifyGoogleFormat(
2842 "template <typename T>\n"
2843 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2844 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
2845 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00002846
2847 FormatStyle Style = getLLVMStyle();
2848 Style.PointerAlignment = FormatStyle::PAS_Left;
2849 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2850 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
2851 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00002852 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
2853 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2854 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00002855}
2856
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00002857TEST_F(FormatTest, TrailingReturnType) {
2858 verifyFormat("auto foo() -> int;\n");
2859 verifyFormat("struct S {\n"
2860 " auto bar() const -> int;\n"
2861 "};");
2862 verifyFormat("template <size_t Order, typename T>\n"
2863 "auto load_img(const std::string &filename)\n"
2864 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00002865 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
2866 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00002867 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00002868 verifyFormat("template <typename T>\n"
2869 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
2870 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00002871
2872 // Not trailing return types.
2873 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00002874}
2875
Daniel Jasper5be31f72013-05-21 09:16:31 +00002876TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002877 // Avoid breaking before trailing 'const' or other trailing annotations, if
2878 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00002879 FormatStyle Style = getGoogleStyle();
2880 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00002881 verifyFormat("void someLongFunction(\n"
2882 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00002883 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00002884 verifyFormat("LoooooongReturnType\n"
2885 "someLoooooooongFunction() const {}",
2886 getLLVMStyleWithColumns(47));
2887 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
2888 " const {}",
2889 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002890 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2891 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
2892 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2893 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
2894 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2895 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00002896 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
2897 " aaaaaaaaaaa aaaaa) const override;");
2898 verifyGoogleFormat(
2899 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
2900 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00002901
Daniel Jasper5550de62014-02-17 07:57:46 +00002902 // Even if the first parameter has to be wrapped.
2903 verifyFormat("void someLongFunction(\n"
2904 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002905 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00002906 verifyFormat("void someLongFunction(\n"
2907 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002908 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00002909 verifyFormat("void someLongFunction(\n"
2910 " int someLongParameter) override {}",
2911 Style);
2912 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00002913 " int someLongParameter) OVERRIDE {}",
2914 Style);
2915 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00002916 " int someLongParameter) final {}",
2917 Style);
2918 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00002919 " int someLongParameter) FINAL {}",
2920 Style);
2921 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00002922 " int parameter) const override {}",
2923 Style);
2924
Daniel Jaspere3f907f2014-06-02 09:52:08 +00002925 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2926 verifyFormat("void someLongFunction(\n"
2927 " int someLongParameter) const\n"
2928 "{\n"
2929 "}",
2930 Style);
2931
Daniel Jasper5550de62014-02-17 07:57:46 +00002932 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002933 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
2934 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2935 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00002936
2937 // Breaking before function-like trailing annotations is fine to keep them
2938 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00002939 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2940 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
2941 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
2942 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
2943 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
2944 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00002945 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
2946 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00002947 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00002948
2949 verifyFormat(
2950 "void aaaaaaaaaaaaaaaaaa()\n"
2951 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
2952 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
2953 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2954 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00002955 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002956 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00002957 " GUARDED_BY(aaaaaaaaaaaa);");
2958 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00002959 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00002960 " GUARDED_BY(aaaaaaaaaaaa);");
2961 verifyGoogleFormat(
2962 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
2963 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00002964 verifyGoogleFormat(
2965 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
2966 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00002967}
2968
Daniel Jasperf090f032015-05-18 09:47:22 +00002969TEST_F(FormatTest, FunctionAnnotations) {
2970 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00002971 "int OldFunction(const string &parameter) {}");
2972 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00002973 "string OldFunction(const string &parameter) {}");
2974 verifyFormat("template <typename T>\n"
2975 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
2976 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00002977
2978 // Not function annotations.
2979 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2980 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00002981 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
2982 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00002983 verifyFormat("MACRO(abc).function() // wrap\n"
2984 " << abc;");
2985 verifyFormat("MACRO(abc)->function() // wrap\n"
2986 " << abc;");
2987 verifyFormat("MACRO(abc)::function() // wrap\n"
2988 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00002989}
2990
Daniel Jasperf7935112012-12-03 18:12:45 +00002991TEST_F(FormatTest, BreaksDesireably) {
2992 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
2993 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002994 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00002995 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2996 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
2997 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00002998
2999 verifyFormat(
3000 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003001 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003002
3003 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3004 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3005 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00003006
3007 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003008 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3009 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3010 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00003011 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3012 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003013
3014 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3015 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3016
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003017 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003018 "void f() {\n"
3019 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
3020 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3021 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00003022 verifyFormat(
3023 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3024 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3025 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003026 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3027 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3028 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003029 "aaaaaa(aaa,\n"
3030 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003031 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3032 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003033 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3034 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3035 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003036
Daniel Jasper739b85f2015-06-29 10:42:59 +00003037 // Indent consistently independent of call expression and unary operator.
3038 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3039 " dddddddddddddddddddddddddddddd));");
3040 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3041 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003042 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003043 " dddddddddddddddddddddddddddddd));");
3044
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003045 // This test case breaks on an incorrect memoization, i.e. an optimization not
3046 // taking into account the StopAt value.
3047 verifyFormat(
3048 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003049 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3050 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3051 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00003052
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003053 verifyFormat("{\n {\n {\n"
3054 " Annotation.SpaceRequiredBefore =\n"
3055 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
3056 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
3057 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00003058
3059 // Break on an outer level if there was a break on an inner level.
3060 EXPECT_EQ("f(g(h(a, // comment\n"
3061 " b, c),\n"
3062 " d, e),\n"
3063 " x, y);",
3064 format("f(g(h(a, // comment\n"
3065 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00003066
3067 // Prefer breaking similar line breaks.
3068 verifyFormat(
3069 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
3070 " NSTrackingMouseEnteredAndExited |\n"
3071 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00003072}
3073
Daniel Jasper18210d72014-10-09 09:52:05 +00003074TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
3075 FormatStyle NoBinPacking = getGoogleStyle();
3076 NoBinPacking.BinPackParameters = false;
3077 NoBinPacking.BinPackArguments = true;
3078 verifyFormat("void f() {\n"
3079 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
3080 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3081 "}",
3082 NoBinPacking);
3083 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
3084 " int aaaaaaaaaaaaaaaaaaaa,\n"
3085 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3086 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003087
Daniel Jasper00693b082016-01-09 15:56:47 +00003088 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
3089 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3090 " vector<int> bbbbbbbbbbbbbbb);",
3091 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003092 // FIXME: This behavior difference is probably not wanted. However, currently
3093 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
3094 // template arguments from BreakBeforeParameter being set because of the
3095 // one-per-line formatting.
3096 verifyFormat(
3097 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3098 " aaaaaaaaaa> aaaaaaaaaa);",
3099 NoBinPacking);
3100 verifyFormat(
3101 "void fffffffffff(\n"
3102 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
3103 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00003104}
3105
Daniel Jasper9278eb92013-01-16 14:59:02 +00003106TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00003107 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003108 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00003109 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003110 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
3111 " aaaaaaaaaaaaaaaaaaaa,\n"
3112 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
3113 NoBinPacking);
3114 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
3115 " aaaaaaaaaaaaa,\n"
3116 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
3117 NoBinPacking);
3118 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003119 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3120 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3121 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
3122 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003123 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
3124 NoBinPacking);
3125 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3126 " .aaaaaaaaaaaaaaaaaa();",
3127 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003128 verifyFormat("void f() {\n"
3129 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3130 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
3131 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003132 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003133
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003134 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00003135 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3136 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003137 " aaaaaaaaaaaa);",
3138 NoBinPacking);
3139 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003140 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
3141 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003142 " test);",
3143 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003144
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003145 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3146 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00003147 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
3148 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003149 NoBinPacking);
3150 verifyFormat("a(\"a\"\n"
3151 " \"a\",\n"
3152 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00003153
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003154 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00003155 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00003156 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00003157 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003158 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00003159 verifyFormat(
3160 "void f() {\n"
3161 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3162 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003163 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003164 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00003165 verifyFormat(
3166 "template <class SomeType, class SomeOtherType>\n"
3167 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
3168 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003169}
3170
Daniel Jasperb10cbc42013-07-10 14:02:49 +00003171TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
3172 FormatStyle Style = getLLVMStyleWithColumns(15);
3173 Style.ExperimentalAutoDetectBinPacking = true;
3174 EXPECT_EQ("aaa(aaaa,\n"
3175 " aaaa,\n"
3176 " aaaa);\n"
3177 "aaa(aaaa,\n"
3178 " aaaa,\n"
3179 " aaaa);",
3180 format("aaa(aaaa,\n" // one-per-line
3181 " aaaa,\n"
3182 " aaaa );\n"
3183 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3184 Style));
3185 EXPECT_EQ("aaa(aaaa, aaaa,\n"
3186 " aaaa);\n"
3187 "aaa(aaaa, aaaa,\n"
3188 " aaaa);",
3189 format("aaa(aaaa, aaaa,\n" // bin-packed
3190 " aaaa );\n"
3191 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3192 Style));
3193}
3194
Daniel Jasper04468962013-01-18 10:56:38 +00003195TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00003196 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
3197 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
3198 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
3199 " .StartsWith(\".init\", ORDER_INIT)\n"
3200 " .StartsWith(\".fini\", ORDER_FINI)\n"
3201 " .StartsWith(\".hash\", ORDER_HASH)\n"
3202 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00003203
Daniel Jaspereb50c672013-02-15 20:33:06 +00003204 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003205 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003206 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00003207 "aaaaaaa->aaaaaaa\n"
3208 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3209 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003210 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003211 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00003212 "aaaaaaa->aaaaaaa\n"
3213 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3214 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
3215 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00003216 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00003217 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003218 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003219 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
3220 " aaaaaa->aaaaaaaaaaaa()\n"
3221 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00003222 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003223 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00003224 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003225 "void f() {\n"
3226 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003227 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003228 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003229 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003230 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003231 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003232 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003233 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003234 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003235 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003236 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003237 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00003238
3239 verifyFormat(
3240 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
3241 verifyFormat("aaaaaaaaaaaaaaa()\n"
3242 " .aaaaaaaaaaaaaaa()\n"
3243 " .aaaaaaaaaaaaaaa()\n"
3244 " .aaaaaaaaaaaaaaa()\n"
3245 " .aaaaaaaaaaaaaaa();");
3246 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3247 " .aaaaaaaaaaaaaaa()\n"
3248 " .aaaaaaaaaaaaaaa()\n"
3249 " .aaaaaaaaaaaaaaa();");
3250 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3251 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3252 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00003253 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
3254 " ->aaaaaaaaaaaaaae(0)\n"
3255 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003256
Daniel Jasper775954b2015-04-24 10:08:09 +00003257 // Don't linewrap after very short segments.
3258 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3259 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3260 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3261 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3262 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3263 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3264 verifyFormat("aaa()\n"
3265 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3266 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3267 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3268
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003269 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3270 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3271 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
3272 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3273 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003274 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003275
Daniel Jaspera41aa532014-09-19 08:01:25 +00003276 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003277 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
3278 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00003279
3280 // Prefer not to create "hanging" indents.
3281 verifyFormat(
3282 "return !soooooooooooooome_map\n"
3283 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3284 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00003285 verifyFormat(
3286 "return aaaaaaaaaaaaaaaa\n"
3287 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
3288 " .aaaa(aaaaaaaaaaaaaa);");
3289 // No hanging indent here.
3290 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
3291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3292 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
3293 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00003294 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3295 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3296 getLLVMStyleWithColumns(60));
3297 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
3298 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3299 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3300 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00003301 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3302 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3303 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00003304}
3305
Daniel Jasperde5c2072012-12-24 00:13:23 +00003306TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
3307 verifyFormat(
3308 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003309 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003310 verifyFormat(
3311 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
3312 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
3313
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003314 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003315 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003316 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
3317 " ccccccccccccccccccccccccc) {\n}");
3318
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003319 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003320 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003321 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
3322 " ccccccccccccccccccccccccc) {\n}");
3323
Daniel Jasperde5c2072012-12-24 00:13:23 +00003324 verifyFormat(
3325 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003326 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003327 verifyFormat(
3328 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
3329 " ccccccccccccccccccccccccc) {\n}");
3330
Daniel Jasper400adc62013-02-08 15:28:42 +00003331 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
3332 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
3333 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
3334 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003335 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
3336 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
3337 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
3338 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
3339
Daniel Jasper400adc62013-02-08 15:28:42 +00003340 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
3341 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
3342 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003343 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
3344 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
3345 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00003346}
3347
Daniel Jasper43b65482013-01-23 12:27:43 +00003348TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00003349 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00003350 "unsigned Cost =\n"
3351 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
3352 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00003353 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00003354 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
3355 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00003356
3357 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003358 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
3359 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00003360 verifyFormat("unsigned OriginalStartColumn =\n"
3361 " SourceMgr.getSpellingColumnNumber(\n"
3362 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
3363 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00003364}
3365
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003366TEST_F(FormatTest, AlignsAfterAssignments) {
3367 verifyFormat(
3368 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003369 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003370 verifyFormat(
3371 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003372 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003373 verifyFormat(
3374 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003375 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003376 verifyFormat(
3377 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003378 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00003379 verifyFormat(
3380 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3381 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3382 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003383}
3384
3385TEST_F(FormatTest, AlignsAfterReturn) {
3386 verifyFormat(
3387 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3388 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
3389 verifyFormat(
3390 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3391 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00003392 verifyFormat(
3393 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003394 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00003395 verifyFormat(
3396 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003397 " aaaaaaaaaaaaaaaaaaaaaa());");
3398 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3399 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3400 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3401 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
3402 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00003403 verifyFormat("return\n"
3404 " // true if code is one of a or b.\n"
3405 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003406}
3407
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003408TEST_F(FormatTest, AlignsAfterOpenBracket) {
3409 verifyFormat(
3410 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3411 " aaaaaaaaa aaaaaaa) {}");
3412 verifyFormat(
3413 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3414 " aaaaaaaaaaa aaaaaaaaa);");
3415 verifyFormat(
3416 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3417 " aaaaaaaaaaaaaaaaaaaaa));");
3418 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003419 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00003420 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3421 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
3422 Style);
3423 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3424 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
3425 Style);
3426 verifyFormat("SomeLongVariableName->someFunction(\n"
3427 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
3428 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003429 verifyFormat(
3430 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3431 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3432 Style);
3433 verifyFormat(
3434 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3435 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3436 Style);
3437 verifyFormat(
3438 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3439 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
3440 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003441
Daniel Jasper2a9f7202016-02-08 09:52:54 +00003442 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
3443 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
3444 " b));",
3445 Style);
3446
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003447 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
3448 Style.BinPackArguments = false;
3449 Style.BinPackParameters = false;
3450 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3451 " aaaaaaaaaaa aaaaaaaa,\n"
3452 " aaaaaaaaa aaaaaaa,\n"
3453 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3454 Style);
3455 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3456 " aaaaaaaaaaa aaaaaaaaa,\n"
3457 " aaaaaaaaaaa aaaaaaaaa,\n"
3458 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3459 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00003460 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
3461 " aaaaaaaaaaaaaaa,\n"
3462 " aaaaaaaaaaaaaaaaaaaaa,\n"
3463 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003464 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00003465 verifyFormat(
3466 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
3467 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3468 Style);
3469 verifyFormat(
3470 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
3471 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3472 Style);
3473 verifyFormat(
3474 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3475 " aaaaaaaaaaaaaaaaaaaaa(\n"
3476 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
3477 " aaaaaaaaaaaaaaaa);",
3478 Style);
3479 verifyFormat(
3480 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3481 " aaaaaaaaaaaaaaaaaaaaa(\n"
3482 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
3483 " aaaaaaaaaaaaaaaa);",
3484 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003485}
3486
Daniel Jasper3219e432014-12-02 13:24:51 +00003487TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
3488 FormatStyle Style = getLLVMStyleWithColumns(40);
3489 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3490 " bbbbbbbbbbbbbbbbbbbbbb);",
3491 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003492 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00003493 Style.AlignOperands = false;
3494 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3495 " bbbbbbbbbbbbbbbbbbbbbb);",
3496 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003497 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00003498 Style.AlignOperands = true;
3499 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3500 " bbbbbbbbbbbbbbbbbbbbbb);",
3501 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003502 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00003503 Style.AlignOperands = false;
3504 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3505 " bbbbbbbbbbbbbbbbbbbbbb);",
3506 Style);
3507}
3508
Daniel Jasper399d24b2013-01-09 07:06:56 +00003509TEST_F(FormatTest, BreaksConditionalExpressions) {
3510 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003511 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3512 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3513 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3514 verifyFormat(
3515 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003516 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3517 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00003518 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003519 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3520 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3521 verifyFormat(
3522 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003523 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3524 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00003525 verifyFormat(
3526 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
3527 " : aaaaaaaaaaaaa);");
3528 verifyFormat(
3529 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00003530 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00003531 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3532 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003533 verifyFormat(
3534 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3535 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3536 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00003537 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3538 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3539 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3540 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3541 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3542 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3543 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3544 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3545 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3546 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3547 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3548 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003549 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3550 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3551 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3552 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3553 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00003554 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3555 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3556 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00003557 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
3558 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3559 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3560 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00003561 verifyFormat(
3562 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3563 " ? aaaaaaaaaaaaaaa\n"
3564 " : aaaaaaaaaaaaaaa;");
3565 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003566 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00003567 " ? b\n"
3568 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00003569 verifyFormat("return aaaa == bbbb\n"
3570 " // comment\n"
3571 " ? aaaa\n"
3572 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003573 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003574 " format(TheLine.First,\n"
3575 " IndentForLevel[TheLine.Level] >= 0\n"
3576 " ? IndentForLevel[TheLine.Level]\n"
3577 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003578 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00003579 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00003580 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
3581 " ? aaaaaaaaaaaaaaa\n"
3582 " : bbbbbbbbbbbbbbb //\n"
3583 " ? ccccccccccccccc\n"
3584 " : ddddddddddddddd;");
3585 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
3586 " ? aaaaaaaaaaaaaaa\n"
3587 " : (bbbbbbbbbbbbbbb //\n"
3588 " ? ccccccccccccccc\n"
3589 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003590 verifyFormat(
3591 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3592 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3593 " aaaaaaaaaaaaaaaaaaaaa +\n"
3594 " aaaaaaaaaaaaaaaaaaaaa\n"
3595 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00003596 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003597 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3598 " : aaaaaaaaaaaaaaaaaaaaaa\n"
3599 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00003600
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003601 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00003602 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003603 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00003604 "void f() {\n"
3605 " g(aaa,\n"
3606 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
3607 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3608 " ? aaaaaaaaaaaaaaa\n"
3609 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003610 "}",
3611 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003612 verifyFormat(
3613 "void f() {\n"
3614 " g(aaa,\n"
3615 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
3616 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3617 " ?: aaaaaaaaaaaaaaa);\n"
3618 "}",
3619 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00003620
3621 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
3622 " // comment.\n"
3623 " ccccccccccccccccccccccccccccccccccccccc\n"
3624 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3625 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00003626
3627 // Assignments in conditional expressions. Apparently not uncommon :-(.
3628 verifyFormat("return a != b\n"
3629 " // comment\n"
3630 " ? a = b\n"
3631 " : a = b;");
3632 verifyFormat("return a != b\n"
3633 " // comment\n"
3634 " ? a = a != b\n"
3635 " // comment\n"
3636 " ? a = b\n"
3637 " : a\n"
3638 " : a;\n");
3639 verifyFormat("return a != b\n"
3640 " // comment\n"
3641 " ? a\n"
3642 " : a = a != b\n"
3643 " // comment\n"
3644 " ? a = b\n"
3645 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00003646}
3647
Daniel Jasper165b29e2013-11-08 00:57:11 +00003648TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
3649 FormatStyle Style = getLLVMStyle();
3650 Style.BreakBeforeTernaryOperators = false;
3651 Style.ColumnLimit = 70;
3652 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003653 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3654 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3655 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3656 Style);
3657 verifyFormat(
3658 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003659 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3660 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00003661 Style);
3662 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003663 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3664 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3665 Style);
3666 verifyFormat(
3667 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003668 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3669 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00003670 Style);
3671 verifyFormat(
3672 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
3673 " aaaaaaaaaaaaa);",
3674 Style);
3675 verifyFormat(
3676 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3677 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3678 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3679 " aaaaaaaaaaaaa);",
3680 Style);
3681 verifyFormat(
3682 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3683 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3684 " aaaaaaaaaaaaa);",
3685 Style);
3686 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3687 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3688 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3689 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3690 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3691 Style);
3692 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3693 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3694 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3695 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3696 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3697 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3698 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3699 Style);
3700 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3701 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
3702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3703 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3704 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3705 Style);
3706 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3707 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3708 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3709 Style);
3710 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00003711 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00003712 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3713 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3714 Style);
3715 verifyFormat(
3716 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3717 " aaaaaaaaaaaaaaa :\n"
3718 " aaaaaaaaaaaaaaa;",
3719 Style);
3720 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
3721 " aaaaaaaaa ?\n"
3722 " b :\n"
3723 " c);",
3724 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00003725 verifyFormat("unsigned Indent =\n"
3726 " format(TheLine.First,\n"
3727 " IndentForLevel[TheLine.Level] >= 0 ?\n"
3728 " IndentForLevel[TheLine.Level] :\n"
3729 " TheLine * 2,\n"
3730 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
3731 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00003732 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
3733 " aaaaaaaaaaaaaaa :\n"
3734 " bbbbbbbbbbbbbbb ? //\n"
3735 " ccccccccccccccc :\n"
3736 " ddddddddddddddd;",
3737 Style);
3738 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
3739 " aaaaaaaaaaaaaaa :\n"
3740 " (bbbbbbbbbbbbbbb ? //\n"
3741 " ccccccccccccccc :\n"
3742 " ddddddddddddddd);",
3743 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00003744 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3745 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
3746 " ccccccccccccccccccccccccccc;",
3747 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00003748 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3749 " aaaaa :\n"
3750 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
3751 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00003752}
3753
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003754TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
3755 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
3756 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
3757 verifyFormat("bool a = true, b = false;");
3758
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003759 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00003760 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003761 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00003762 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003763 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00003764 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00003765 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003766 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00003767 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
3768 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
3769 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
3770 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
3771 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
3772 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003773
Daniel Jasperbea1ab42015-03-01 18:55:26 +00003774 FormatStyle Style = getGoogleStyle();
3775 Style.PointerAlignment = FormatStyle::PAS_Left;
3776 Style.DerivePointerAlignment = false;
3777 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3778 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
3779 " *b = bbbbbbbbbbbbbbbbbbb;",
3780 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003781 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
3782 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
3783 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00003784 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00003785 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003786}
3787
Nico Weber4a5030c2013-01-12 01:28:06 +00003788TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
3789 verifyFormat("arr[foo ? bar : baz];");
3790 verifyFormat("f()[foo ? bar : baz];");
3791 verifyFormat("(a + b)[foo ? bar : baz];");
3792 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
3793}
3794
Daniel Jasperf7935112012-12-03 18:12:45 +00003795TEST_F(FormatTest, AlignsStringLiterals) {
3796 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
3797 " \"short literal\");");
3798 verifyFormat(
3799 "looooooooooooooooooooooooongFunction(\n"
3800 " \"short literal\"\n"
3801 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003802 verifyFormat("someFunction(\"Always break between multi-line\"\n"
3803 " \" string literals\",\n"
3804 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003805 EXPECT_EQ("fun + \"1243\" /* comment */\n"
3806 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00003807 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003808 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00003809 getLLVMStyleWithColumns(28)));
3810 EXPECT_EQ(
3811 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
3812 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
3813 " \"aaaaaaaaaaaaaaaa\";",
3814 format("aaaaaa ="
3815 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
3816 "aaaaaaaaaaaaaaaaaaaaa\" "
3817 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003818 verifyFormat("a = a + \"a\"\n"
3819 " \"a\"\n"
3820 " \"a\";");
3821 verifyFormat("f(\"a\", \"b\"\n"
3822 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00003823
3824 verifyFormat(
3825 "#define LL_FORMAT \"ll\"\n"
3826 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
3827 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00003828
3829 verifyFormat("#define A(X) \\\n"
3830 " \"aaaaa\" #X \"bbbbbb\" \\\n"
3831 " \"ccccc\"",
3832 getLLVMStyleWithColumns(23));
3833 verifyFormat("#define A \"def\"\n"
3834 "f(\"abc\" A \"ghi\"\n"
3835 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00003836
3837 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00003838 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00003839 verifyFormat("#define A(X) \\\n"
3840 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
3841 " L\"ccccc\"",
3842 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00003843
3844 verifyFormat("f(@\"a\"\n"
3845 " @\"b\");");
3846 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00003847 " @\"b\"\n"
3848 " @\"c\";");
3849 verifyFormat("NSString s = @\"a\"\n"
3850 " \"b\"\n"
3851 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00003852}
3853
Zachary Turner448592e2015-12-18 22:20:15 +00003854TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003855 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00003856 // No declarations or definitions should be moved to own line.
3857 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
3858 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003859 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003860 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003861 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003862 "int f() { return 1; }\n"
3863 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003864 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00003865
3866 // All declarations and definitions should have the return type moved to its
3867 // own
3868 // line.
3869 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
3870 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003871 " int\n"
3872 " f() {\n"
3873 " return 1;\n"
3874 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003875 " int\n"
3876 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003877 "};\n"
3878 "int\n"
3879 "f() {\n"
3880 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003881 "}\n"
3882 "int\n"
3883 "g();\n",
3884 Style);
3885
3886 // Top-level definitions, and no kinds of declarations should have the
3887 // return type moved to its own line.
3888 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
3889 verifyFormat("class B {\n"
3890 " int f() { return 1; }\n"
3891 " int g();\n"
3892 "};\n"
3893 "int\n"
3894 "f() {\n"
3895 " return 1;\n"
3896 "}\n"
3897 "int g();\n",
3898 Style);
3899
3900 // Top-level definitions and declarations should have the return type moved
3901 // to its own line.
3902 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
3903 verifyFormat("class C {\n"
3904 " int f() { return 1; }\n"
3905 " int g();\n"
3906 "};\n"
3907 "int\n"
3908 "f() {\n"
3909 " return 1;\n"
3910 "}\n"
3911 "int\n"
3912 "g();\n",
3913 Style);
3914
3915 // All definitions should have the return type moved to its own line, but no
3916 // kinds of declarations.
3917 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
3918 verifyFormat("class D {\n"
3919 " int\n"
3920 " f() {\n"
3921 " return 1;\n"
3922 " }\n"
3923 " int g();\n"
3924 "};\n"
3925 "int\n"
3926 "f() {\n"
3927 " return 1;\n"
3928 "}\n"
3929 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003930 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00003931 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003932 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00003933 " return \"\";\n"
3934 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003935 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003936 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00003937 verifyFormat("template <class T>\n"
3938 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003939 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00003940 " return NULL;\n"
3941 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003942 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003943 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00003944 verifyFormat("class C {\n"
3945 " int\n"
3946 " operator+() {\n"
3947 " return 1;\n"
3948 " }\n"
3949 " int\n"
3950 " operator()() {\n"
3951 " return 1;\n"
3952 " }\n"
3953 "};\n",
3954 Style);
3955 verifyFormat("void\n"
3956 "A::operator()() {}\n"
3957 "void\n"
3958 "A::operator>>() {}\n"
3959 "void\n"
3960 "A::operator+() {}\n",
3961 Style);
3962 verifyFormat("void *operator new(std::size_t s);", // No break here.
3963 Style);
3964 verifyFormat("void *\n"
3965 "operator new(std::size_t s) {}",
3966 Style);
3967 verifyFormat("void *\n"
3968 "operator delete[](void *ptr) {}",
3969 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003970 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00003971 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003972 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00003973 "{\n"
3974 " return \"\";\n"
3975 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003976 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003977 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00003978 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003979 "T *\n" // Problem here: no line break
3980 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00003981 "{\n"
3982 " return NULL;\n"
3983 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003984 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003985 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00003986}
3987
Alexander Kornienko58611712013-07-04 12:02:44 +00003988TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
3989 FormatStyle NoBreak = getLLVMStyle();
3990 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
3991 FormatStyle Break = getLLVMStyle();
3992 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00003993 verifyFormat("aaaa = \"bbbb\"\n"
3994 " \"cccc\";",
3995 NoBreak);
3996 verifyFormat("aaaa =\n"
3997 " \"bbbb\"\n"
3998 " \"cccc\";",
3999 Break);
4000 verifyFormat("aaaa(\"bbbb\"\n"
4001 " \"cccc\");",
4002 NoBreak);
4003 verifyFormat("aaaa(\n"
4004 " \"bbbb\"\n"
4005 " \"cccc\");",
4006 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004007 verifyFormat("aaaa(qqq, \"bbbb\"\n"
4008 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004009 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004010 verifyFormat("aaaa(qqq,\n"
4011 " \"bbbb\"\n"
4012 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004013 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004014 verifyFormat("aaaa(qqq,\n"
4015 " L\"bbbb\"\n"
4016 " L\"cccc\");",
4017 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004018 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
4019 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00004020 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00004021 verifyFormat("string s = someFunction(\n"
4022 " \"abc\"\n"
4023 " \"abc\");",
4024 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00004025
Daniel Jasper3251fff2014-06-10 06:27:23 +00004026 // As we break before unary operators, breaking right after them is bad.
4027 verifyFormat("string foo = abc ? \"x\"\n"
4028 " \"blah blah blah blah blah blah\"\n"
4029 " : \"y\";",
4030 Break);
4031
Daniel Jasperc834c702013-07-17 15:38:19 +00004032 // Don't break if there is no column gain.
4033 verifyFormat("f(\"aaaa\"\n"
4034 " \"bbbb\");",
4035 Break);
4036
4037 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004038 EXPECT_EQ("x = \"a\\\n"
4039 "b\\\n"
4040 "c\";",
4041 format("x = \"a\\\n"
4042 "b\\\n"
4043 "c\";",
4044 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004045 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004046 " \"a\\\n"
4047 "b\\\n"
4048 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004049 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004050 "b\\\n"
4051 "c\";",
4052 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00004053
4054 // Exempt ObjC strings for now.
4055 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004056 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004057 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004058 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004059 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00004060
4061 Break.ColumnLimit = 0;
4062 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00004063}
4064
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004065TEST_F(FormatTest, AlignsPipes) {
4066 verifyFormat(
4067 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4068 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4069 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4070 verifyFormat(
4071 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
4072 " << aaaaaaaaaaaaaaaaaaaa;");
4073 verifyFormat(
4074 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4075 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4076 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00004077 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4078 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4079 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004080 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
4081 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
4082 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
4083 verifyFormat(
4084 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4085 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4086 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004087 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4088 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4089 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4090 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00004091 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
4092 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00004093 verifyFormat(
4094 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4095 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00004096
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004097 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
4098 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00004099 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4100 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4101 " aaaaaaaaaaaaaaaaaaaaa)\n"
4102 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00004103 verifyFormat("LOG_IF(aaa == //\n"
4104 " bbb)\n"
4105 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004106
Daniel Jasper467ddb12013-08-12 12:58:05 +00004107 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00004108 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4109 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004110 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
4111 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4112 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00004113 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
4114 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00004115 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4116 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4117 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4118 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4119 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4120 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4121 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004122
Daniel Jasperc238c872013-04-02 14:33:13 +00004123 verifyFormat(
4124 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4125 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00004126
4127 // Incomplete string literal.
4128 EXPECT_EQ("llvm::errs() << \"\n"
4129 " << a;",
4130 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00004131
4132 verifyFormat("void f() {\n"
4133 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
4134 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
4135 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00004136
4137 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00004138 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
4139 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
4140 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00004141
4142 // Handle '\n'.
4143 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
4144 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
4145 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
4146 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
4147 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
4148 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
4149 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004150}
4151
Daniel Jasper7209bb92016-12-13 11:16:42 +00004152TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
4153 verifyFormat("return out << \"somepacket = {\\n\"\n"
4154 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
4155 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
4156 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
4157 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
4158 " << \"}\";");
4159
4160 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4161 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4162 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
4163 verifyFormat(
4164 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
4165 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
4166 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
4167 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
4168 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
4169 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
4170 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
4171 verifyFormat(
4172 "void f() {\n"
4173 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
4174 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4175 "}");
4176
4177 // Breaking before the first "<<" is generally not desirable.
4178 verifyFormat(
4179 "llvm::errs()\n"
4180 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4181 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4182 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4183 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4184 getLLVMStyleWithColumns(70));
4185 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4186 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4187 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4188 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4189 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4190 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4191 getLLVMStyleWithColumns(70));
4192
4193 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4194 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4195 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
4196 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4197 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4198 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00004199 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
4200 " (aaaa + aaaa);",
4201 getLLVMStyleWithColumns(40));
4202 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
4203 " (aaaaaaa + aaaaa));",
4204 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00004205 verifyFormat(
4206 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
4207 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
4208 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00004209}
4210
Daniel Jasperf7935112012-12-03 18:12:45 +00004211TEST_F(FormatTest, UnderstandsEquals) {
4212 verifyFormat(
4213 "aaaaaaaaaaaaaaaaa =\n"
4214 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4215 verifyFormat(
4216 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004217 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004218 verifyFormat(
4219 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004220 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00004221 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004222 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4223 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004224
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004225 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4226 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004227}
4228
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004229TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004230 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4231 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004232
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004233 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4234 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004235
4236 verifyFormat(
4237 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
4238 " Parameter2);");
4239
4240 verifyFormat(
4241 "ShortObject->shortFunction(\n"
4242 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
4243 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
4244
4245 verifyFormat("loooooooooooooongFunction(\n"
4246 " LoooooooooooooongObject->looooooooooooooooongFunction());");
4247
4248 verifyFormat(
4249 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
4250 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
4251
Daniel Jasper687af3b2013-02-14 14:26:07 +00004252 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4253 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00004254 verifyFormat("void f() {\n"
4255 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4256 " .Times(2)\n"
4257 " .WillRepeatedly(Return(SomeValue));\n"
4258 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00004259 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
4260 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00004261 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004262 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4263 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00004264 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004265 verifyFormat("void f() {\n"
4266 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4267 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
4268 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00004269 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4270 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4271 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4272 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4273 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00004274 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4275 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4276 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4277 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
4278 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00004279
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004280 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004281 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004282 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004283 verifyFormat(
4284 "aaaaaaaaaaa->aaaaaaaaa(\n"
4285 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4286 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00004287
4288 verifyFormat(
4289 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4290 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00004291 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
4292 " aaaaaaaaa()->aaaaaa()->aaaaa());");
4293 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
4294 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004295
Daniel Jasper9b334242013-03-15 14:57:30 +00004296 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004297 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4298 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00004299
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004300 FormatStyle NoBinPacking = getLLVMStyle();
4301 NoBinPacking.BinPackParameters = false;
4302 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4303 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4304 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
4305 " aaaaaaaaaaaaaaaaaaa,\n"
4306 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4307 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00004308
4309 // If there is a subsequent call, change to hanging indentation.
4310 verifyFormat(
4311 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4312 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
4313 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4314 verifyFormat(
4315 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4316 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00004317 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4318 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4319 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4320 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4321 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4322 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004323}
4324
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004325TEST_F(FormatTest, WrapsTemplateDeclarations) {
4326 verifyFormat("template <typename T>\n"
4327 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00004328 verifyFormat("template <typename T>\n"
4329 "// T should be one of {A, B}.\n"
4330 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004331 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00004332 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00004333 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004334 verifyFormat("template <typename T>\n"
4335 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
4336 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004337 verifyFormat(
4338 "template <typename T>\n"
4339 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
4340 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00004341 verifyFormat(
4342 "template <typename T>\n"
4343 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
4344 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
4345 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00004346 verifyFormat("template <typename T>\n"
4347 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004348 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00004349 verifyFormat(
4350 "template <typename T1, typename T2 = char, typename T3 = char,\n"
4351 " typename T4 = char>\n"
4352 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00004353 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
4354 " template <typename> class cccccccccccccccccccccc,\n"
4355 " typename ddddddddddddd>\n"
4356 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004357 verifyFormat(
4358 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
4359 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00004360
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004361 verifyFormat("void f() {\n"
4362 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
4363 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
4364 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004365
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00004366 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004367 verifyFormat("template <typename T> void f();");
4368 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00004369 verifyFormat(
4370 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4371 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4372 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
4373 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4374 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4375 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
4376 " bbbbbbbbbbbbbbbbbbbbbbbb);",
4377 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00004378 EXPECT_EQ("static_cast<A< //\n"
4379 " B> *>(\n"
4380 "\n"
4381 " );",
4382 format("static_cast<A<//\n"
4383 " B>*>(\n"
4384 "\n"
4385 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00004386 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4387 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00004388
4389 FormatStyle AlwaysBreak = getLLVMStyle();
4390 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
4391 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
4392 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
4393 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
4394 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4395 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
4396 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
4397 verifyFormat("template <template <typename> class Fooooooo,\n"
4398 " template <typename> class Baaaaaaar>\n"
4399 "struct C {};",
4400 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00004401 verifyFormat("template <typename T> // T can be A, B or C.\n"
4402 "struct C {};",
4403 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00004404 verifyFormat("template <enum E> class A {\n"
4405 "public:\n"
4406 " E *f();\n"
4407 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004408}
4409
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00004410TEST_F(FormatTest, WrapsTemplateParameters) {
4411 FormatStyle Style = getLLVMStyle();
4412 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4413 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4414 verifyFormat(
4415 "template <typename... a> struct q {};\n"
4416 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4417 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4418 " y;",
4419 Style);
4420 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4421 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4422 verifyFormat(
4423 "template <typename... a> struct r {};\n"
4424 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4425 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4426 " y;",
4427 Style);
4428 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4429 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4430 verifyFormat(
4431 "template <typename... a> struct s {};\n"
4432 "extern s<\n"
4433 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4434 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4435 " y;",
4436 Style);
4437 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4438 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4439 verifyFormat(
4440 "template <typename... a> struct t {};\n"
4441 "extern t<\n"
4442 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4443 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4444 " y;",
4445 Style);
4446}
4447
Daniel Jasper45797022013-01-25 10:57:27 +00004448TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
4449 verifyFormat(
4450 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4451 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4452 verifyFormat(
4453 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4454 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4455 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
4456
Daniel Jasper0f0234e2013-05-08 10:00:18 +00004457 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00004458 verifyFormat(
4459 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4460 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00004461 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00004462
Daniel Jasper45797022013-01-25 10:57:27 +00004463 verifyFormat(
4464 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00004465 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00004466
4467 // Breaking at nested name specifiers is generally not desirable.
4468 verifyFormat(
4469 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4470 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004471
4472 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004473 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
4474 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4475 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004476 " aaaaaaaaaaaaaaaaaaaaa);",
4477 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00004478
4479 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4480 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4481 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00004482}
4483
Daniel Jasperf7935112012-12-03 18:12:45 +00004484TEST_F(FormatTest, UnderstandsTemplateParameters) {
4485 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00004486 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004487 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
4488 verifyFormat("bool x = a < 1 || 2 > a;");
4489 verifyFormat("bool x = 5 < f<int>();");
4490 verifyFormat("bool x = f<int>() > 5;");
4491 verifyFormat("bool x = 5 < a<int>::x;");
4492 verifyFormat("bool x = a < 4 ? a > 2 : false;");
4493 verifyFormat("bool x = f() ? a < 2 : a > 2;");
4494
4495 verifyGoogleFormat("A<A<int>> a;");
4496 verifyGoogleFormat("A<A<A<int>>> a;");
4497 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004498 verifyGoogleFormat("A<A<int> > a;");
4499 verifyGoogleFormat("A<A<A<int> > > a;");
4500 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00004501 verifyGoogleFormat("A<::A<int>> a;");
4502 verifyGoogleFormat("A<::A> a;");
4503 verifyGoogleFormat("A< ::A> a;");
4504 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004505 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
4506 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00004507 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
4508 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00004509 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
4510 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00004511
Nico Weber7533b4d2014-09-24 17:17:32 +00004512 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
4513
Daniel Jasperf7935112012-12-03 18:12:45 +00004514 verifyFormat("test >> a >> b;");
4515 verifyFormat("test << a >> b;");
4516
4517 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004518 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00004519 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00004520 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
4521 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00004522 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00004523 verifyFormat("f(a.operator()<A>());");
4524 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4525 " .template operator()<A>());",
4526 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00004527
4528 // Not template parameters.
4529 verifyFormat("return a < b && c > d;");
4530 verifyFormat("void f() {\n"
4531 " while (a < b && c > d) {\n"
4532 " }\n"
4533 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00004534 verifyFormat("template <typename... Types>\n"
4535 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00004536
4537 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4538 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
4539 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00004540 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00004541 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00004542 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00004543}
4544
Malcolm Parsons6af3f142016-11-03 16:57:30 +00004545TEST_F(FormatTest, BitshiftOperatorWidth) {
4546 EXPECT_EQ("int a = 1 << 2; /* foo\n"
4547 " bar */",
4548 format("int a=1<<2; /* foo\n"
4549 " bar */"));
4550
4551 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
4552 " bar */",
4553 format("int b =256>>1 ; /* foo\n"
4554 " bar */"));
4555}
4556
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00004557TEST_F(FormatTest, UnderstandsBinaryOperators) {
4558 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00004559 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00004560}
4561
4562TEST_F(FormatTest, UnderstandsPointersToMembers) {
4563 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00004564 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00004565 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004566 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00004567 verifyFormat("void f() {\n"
4568 " (a->*f)();\n"
4569 " a->*x;\n"
4570 " (a.*f)();\n"
4571 " ((*a).*f)();\n"
4572 " a.*x;\n"
4573 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00004574 verifyFormat("void f() {\n"
4575 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
4576 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
4577 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00004578 verifyFormat(
4579 "(aaaaaaaaaa->*bbbbbbb)(\n"
4580 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004581 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00004582 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004583 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00004584}
4585
Daniel Jasper8dd40472012-12-21 09:41:31 +00004586TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00004587 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00004588 verifyFormat("f(-1, -2, -3);");
4589 verifyFormat("a[-1] = 5;");
4590 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004591 verifyFormat("if (i == -1) {\n}");
4592 verifyFormat("if (i != -1) {\n}");
4593 verifyFormat("if (i > -1) {\n}");
4594 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00004595 verifyFormat("++(a->f());");
4596 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00004597 verifyFormat("(a->f())++;");
4598 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004599 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00004600
4601 verifyFormat("a-- > b;");
4602 verifyFormat("b ? -a : c;");
4603 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00004604 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00004605 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00004606 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00004607
4608 verifyFormat("return -1;");
4609 verifyFormat("switch (a) {\n"
4610 "case -1:\n"
4611 " break;\n"
4612 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00004613 verifyFormat("#define X -1");
4614 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00004615
Chandler Carruthf8b72662014-03-02 12:37:31 +00004616 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
4617 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00004618
4619 verifyFormat("int a = /* confusing comment */ -1;");
4620 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
4621 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004622}
4623
Daniel Jasper0c214fa2014-02-05 13:43:04 +00004624TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00004625 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00004626 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00004627 "}");
4628 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00004629 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00004630 verifyFormat("*aaa = aaaaaaa( // break\n"
4631 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00004632}
4633
Daniel Jasper8863ada2013-08-26 08:10:17 +00004634TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00004635 verifyFormat("bool operator<();");
4636 verifyFormat("bool operator>();");
4637 verifyFormat("bool operator=();");
4638 verifyFormat("bool operator==();");
4639 verifyFormat("bool operator!=();");
4640 verifyFormat("int operator+();");
4641 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00004642 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004643 verifyFormat("bool operator();");
4644 verifyFormat("bool operator()();");
4645 verifyFormat("bool operator[]();");
4646 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004647 verifyFormat("operator int();");
4648 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004649 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004650 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00004651 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004652 verifyFormat("void *operator new(std::size_t size);");
4653 verifyFormat("void *operator new[](std::size_t size);");
4654 verifyFormat("void operator delete(void *ptr);");
4655 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00004656 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
4657 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00004658 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00004659 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004660
Daniel Jasper0af92eb2013-02-15 19:24:08 +00004661 verifyFormat(
4662 "ostream &operator<<(ostream &OutputStream,\n"
4663 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00004664 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
4665 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
4666 " return left.group < right.group;\n"
4667 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00004668 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00004669 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00004670
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004671 verifyGoogleFormat("operator void*();");
4672 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00004673 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00004674
4675 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00004676 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
4677 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004678}
4679
Daniel Jasper1c220482015-02-25 10:30:06 +00004680TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00004681 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
4682 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
4683 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
4684 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
4685 verifyFormat("Deleted &operator=(const Deleted &) &;");
4686 verifyFormat("Deleted &operator=(const Deleted &) &&;");
4687 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
4688 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
4689 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
4690 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
4691 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00004692 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00004693 verifyFormat("template <typename T>\n"
4694 "void F(T) && = delete;",
4695 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00004696
Daniel Jasperaf642c62015-08-25 13:40:51 +00004697 FormatStyle AlignLeft = getLLVMStyle();
4698 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00004699 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00004700 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
4701 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
4702 AlignLeft);
4703 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
4704 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00004705 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
4706 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
4707 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
4708 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00004709 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00004710
4711 FormatStyle Spaces = getLLVMStyle();
4712 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00004713 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
4714 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
4715 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
4716 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00004717
4718 Spaces.SpacesInCStyleCastParentheses = false;
4719 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00004720 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
4721 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
4722 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
4723 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00004724}
4725
Daniel Jasperd6a947f2013-01-11 16:09:04 +00004726TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00004727 verifyFormat("void f() {\n"
4728 " A *a = new A;\n"
4729 " A *a = new (placement) A;\n"
4730 " delete a;\n"
4731 " delete (A *)a;\n"
4732 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00004733 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
4734 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00004735 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4736 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
4737 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00004738 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00004739}
4740
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00004741TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004742 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004743 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00004744 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004745 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004746 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004747 verifyIndependentOfContext("int a = b * 10;");
4748 verifyIndependentOfContext("int a = 10 * b;");
4749 verifyIndependentOfContext("int a = b * c;");
4750 verifyIndependentOfContext("int a += b * c;");
4751 verifyIndependentOfContext("int a -= b * c;");
4752 verifyIndependentOfContext("int a *= b * c;");
4753 verifyIndependentOfContext("int a /= b * c;");
4754 verifyIndependentOfContext("int a = *b;");
4755 verifyIndependentOfContext("int a = *b * c;");
4756 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00004757 verifyIndependentOfContext("int a = b * (10);");
4758 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004759 verifyIndependentOfContext("return 10 * b;");
4760 verifyIndependentOfContext("return *b * *c;");
4761 verifyIndependentOfContext("return a & ~b;");
4762 verifyIndependentOfContext("f(b ? *c : *d);");
4763 verifyIndependentOfContext("int a = b ? *c : *d;");
4764 verifyIndependentOfContext("*b = a;");
4765 verifyIndependentOfContext("a * ~b;");
4766 verifyIndependentOfContext("a * !b;");
4767 verifyIndependentOfContext("a * +b;");
4768 verifyIndependentOfContext("a * -b;");
4769 verifyIndependentOfContext("a * ++b;");
4770 verifyIndependentOfContext("a * --b;");
4771 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00004772 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004773 verifyIndependentOfContext("f() * b;");
4774 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00004775 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004776 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00004777 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004778 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00004779 verifyIndependentOfContext("return sizeof(int **);");
4780 verifyIndependentOfContext("return sizeof(int ******);");
4781 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00004782 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004783 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00004784 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00004785 verifyGoogleFormat("return sizeof(int**);");
4786 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
4787 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00004788 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00004789 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00004790 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00004791 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00004792 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00004793 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00004794 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00004795 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00004796 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00004797 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00004798 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00004799 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00004800 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00004801 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00004802 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00004803 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00004804 verifyFormat("void f(const MyOverride &override);");
4805 verifyFormat("void f(const MyFinal &final);");
4806 verifyIndependentOfContext("bool a = f() && override.f();");
4807 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00004808
Daniel Jasper5b49f472013-01-23 12:10:53 +00004809 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00004810
Daniel Jasper5b49f472013-01-23 12:10:53 +00004811 verifyIndependentOfContext("A<int *> a;");
4812 verifyIndependentOfContext("A<int **> a;");
4813 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00004814 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00004815 verifyIndependentOfContext(
4816 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004817 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00004818 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00004819 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00004820 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00004821 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00004822
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00004823 verifyFormat(
4824 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4825 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4826
Daniel Jasper1f5d6372016-06-13 14:45:12 +00004827 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00004828 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00004829 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004830 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00004831 verifyGoogleFormat("A<int*> a;");
4832 verifyGoogleFormat("A<int**> a;");
4833 verifyGoogleFormat("A<int*, int*> a;");
4834 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00004835 verifyGoogleFormat("f(b ? *c : *d);");
4836 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00004837 verifyGoogleFormat("Type* t = **x;");
4838 verifyGoogleFormat("Type* t = *++*x;");
4839 verifyGoogleFormat("*++*x;");
4840 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
4841 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00004842 verifyGoogleFormat(
4843 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00004844 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00004845 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
4846 verifyGoogleFormat("template <typename T>\n"
4847 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00004848
Daniel Jasper1904e9b2014-08-14 10:53:19 +00004849 FormatStyle Left = getLLVMStyle();
4850 Left.PointerAlignment = FormatStyle::PAS_Left;
4851 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00004852 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00004853 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00004854
Daniel Jasper5b49f472013-01-23 12:10:53 +00004855 verifyIndependentOfContext("a = *(x + y);");
4856 verifyIndependentOfContext("a = &(x + y);");
4857 verifyIndependentOfContext("*(x + y).call();");
4858 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004859 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00004860
Daniel Jasper5b49f472013-01-23 12:10:53 +00004861 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00004862 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00004863 "int *MyValues = {\n"
4864 " *A, // Operator detection might be confused by the '{'\n"
4865 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00004866 "};");
Nico Weber80a82762013-01-17 17:17:19 +00004867
Daniel Jasper5b49f472013-01-23 12:10:53 +00004868 verifyIndependentOfContext("if (int *a = &b)");
4869 verifyIndependentOfContext("if (int &a = *b)");
4870 verifyIndependentOfContext("if (a & b[i])");
4871 verifyIndependentOfContext("if (a::b::c::d & b[i])");
4872 verifyIndependentOfContext("if (*b[i])");
4873 verifyIndependentOfContext("if (int *a = (&b))");
4874 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00004875 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00004876 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00004877 verifyFormat("void f() {\n"
4878 " for (const int &v : Values) {\n"
4879 " }\n"
4880 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00004881 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
4882 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00004883 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00004884
Daniel Jaspera98da3d2013-11-07 19:56:07 +00004885 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00004886 verifyFormat("#define MACRO \\\n"
4887 " int *i = a * b; \\\n"
4888 " void f(a *b);",
4889 getLLVMStyleWithColumns(19));
4890
Daniel Jasper97b89482013-03-13 07:49:51 +00004891 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004892 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00004893 verifyIndependentOfContext("T **t = new T *;");
4894 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00004895 verifyGoogleFormat("A = new SomeType*[Length]();");
4896 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00004897 verifyGoogleFormat("T** t = new T*;");
4898 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00004899
Daniel Jasper990ff972013-05-07 14:17:18 +00004900 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00004901 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00004902 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00004903 verifyFormat("STATIC_ASSERT((a & b) == 0);");
4904 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00004905 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00004906 "typename t::if<x && y>::type f() {}");
4907 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00004908 verifyFormat("vector<int *> v;");
4909 verifyFormat("vector<int *const> v;");
4910 verifyFormat("vector<int *const **const *> v;");
4911 verifyFormat("vector<int *volatile> v;");
4912 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00004913 verifyFormat("foo<b && false>();");
4914 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00004915 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00004916 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004917 "template <class T, class = typename std::enable_if<\n"
4918 " std::is_integral<T>::value &&\n"
4919 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
4920 "void F();",
4921 getLLVMStyleWithColumns(70));
4922 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004923 "template <class T,\n"
4924 " class = typename std::enable_if<\n"
4925 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004926 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
4927 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00004928 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004929 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00004930 verifyFormat(
4931 "template <class T,\n"
4932 " class = typename ::std::enable_if<\n"
4933 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
4934 "void F();",
4935 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00004936
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00004937 verifyIndependentOfContext("MACRO(int *i);");
4938 verifyIndependentOfContext("MACRO(auto *a);");
4939 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00004940 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00004941 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00004942 // FIXME: Is there a way to make this work?
4943 // verifyIndependentOfContext("MACRO(A *a);");
4944
Daniel Jasper32ccb032014-06-23 07:36:18 +00004945 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00004946 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00004947
Daniel Jasper866468a2014-04-14 13:15:29 +00004948 EXPECT_EQ("#define OP(x) \\\n"
4949 " ostream &operator<<(ostream &s, const A &a) { \\\n"
4950 " return s << a.DebugString(); \\\n"
4951 " }",
4952 format("#define OP(x) \\\n"
4953 " ostream &operator<<(ostream &s, const A &a) { \\\n"
4954 " return s << a.DebugString(); \\\n"
4955 " }",
4956 getLLVMStyleWithColumns(50)));
4957
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00004958 // FIXME: We cannot handle this case yet; we might be able to figure out that
4959 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00004960 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00004961
4962 FormatStyle PointerMiddle = getLLVMStyle();
4963 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
4964 verifyFormat("delete *x;", PointerMiddle);
4965 verifyFormat("int * x;", PointerMiddle);
4966 verifyFormat("template <int * y> f() {}", PointerMiddle);
4967 verifyFormat("int * f(int * a) {}", PointerMiddle);
4968 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
4969 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
4970 verifyFormat("A<int *> a;", PointerMiddle);
4971 verifyFormat("A<int **> a;", PointerMiddle);
4972 verifyFormat("A<int *, int *> a;", PointerMiddle);
4973 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00004974 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
4975 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00004976 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00004977
4978 // Member function reference qualifiers aren't binary operators.
4979 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00004980 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00004981 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00004982 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00004983 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00004984 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004985}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004986
Daniel Jasperee6d6502013-07-17 20:25:02 +00004987TEST_F(FormatTest, UnderstandsAttributes) {
4988 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00004989 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
4990 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00004991 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004992 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00004993 verifyFormat("__attribute__((nodebug)) void\n"
4994 "foo() {}\n",
4995 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00004996}
4997
Daniel Jasper10cd5812013-05-06 06:35:44 +00004998TEST_F(FormatTest, UnderstandsEllipsis) {
4999 verifyFormat("int printf(const char *fmt, ...);");
5000 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005001 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5002
5003 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005004 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005005 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005006}
5007
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005008TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005009 EXPECT_EQ("int *a;\n"
5010 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005011 "int *a;",
5012 format("int *a;\n"
5013 "int* a;\n"
5014 "int *a;",
5015 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005016 EXPECT_EQ("int* a;\n"
5017 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005018 "int* a;",
5019 format("int* a;\n"
5020 "int* a;\n"
5021 "int *a;",
5022 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005023 EXPECT_EQ("int *a;\n"
5024 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005025 "int *a;",
5026 format("int *a;\n"
5027 "int * a;\n"
5028 "int * a;",
5029 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005030 EXPECT_EQ("auto x = [] {\n"
5031 " int *a;\n"
5032 " int *a;\n"
5033 " int *a;\n"
5034 "};",
5035 format("auto x=[]{int *a;\n"
5036 "int * a;\n"
5037 "int * a;};",
5038 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005039}
5040
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005041TEST_F(FormatTest, UnderstandsRvalueReferences) {
5042 verifyFormat("int f(int &&a) {}");
5043 verifyFormat("int f(int a, char &&b) {}");
5044 verifyFormat("void f() { int &&a = b; }");
5045 verifyGoogleFormat("int f(int a, char&& b) {}");
5046 verifyGoogleFormat("void f() { int&& a = b; }");
5047
Daniel Jasper1eff9082013-05-27 16:36:33 +00005048 verifyIndependentOfContext("A<int &&> a;");
5049 verifyIndependentOfContext("A<int &&, int &&> a;");
5050 verifyGoogleFormat("A<int&&> a;");
5051 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00005052
5053 // Not rvalue references:
5054 verifyFormat("template <bool B, bool C> class A {\n"
5055 " static_assert(B && C, \"Something is wrong\");\n"
5056 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00005057 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
5058 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00005059 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005060}
5061
Manuel Klimekc1237a82013-01-23 14:08:21 +00005062TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
5063 verifyFormat("void f() {\n"
5064 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005065 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005066 "}",
5067 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00005068}
5069
Daniel Jasperef906a92013-01-13 08:01:36 +00005070TEST_F(FormatTest, FormatsCasts) {
5071 verifyFormat("Type *A = static_cast<Type *>(P);");
5072 verifyFormat("Type *A = (Type *)P;");
5073 verifyFormat("Type *A = (vector<Type *, int *>)P;");
5074 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00005075 verifyFormat("int a = (int)2.0f;");
5076 verifyFormat("x[(int32)y];");
5077 verifyFormat("x = (int32)y;");
5078 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
5079 verifyFormat("int a = (int)*b;");
5080 verifyFormat("int a = (int)2.0f;");
5081 verifyFormat("int a = (int)~0;");
5082 verifyFormat("int a = (int)++a;");
5083 verifyFormat("int a = (int)sizeof(int);");
5084 verifyFormat("int a = (int)+2;");
5085 verifyFormat("my_int a = (my_int)2.0f;");
5086 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00005087 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00005088 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005089 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00005090 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00005091 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00005092
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005093 verifyFormat("void f() { my_int a = (my_int)*b; }");
5094 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
5095 verifyFormat("my_int a = (my_int)~0;");
5096 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005097 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005098 verifyFormat("my_int a = (my_int)1;");
5099 verifyFormat("my_int a = (my_int *)1;");
5100 verifyFormat("my_int a = (const my_int)-1;");
5101 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00005102 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00005103 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00005104 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00005105 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005106
5107 // FIXME: single value wrapped with paren will be treated as cast.
5108 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00005109
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00005110 verifyFormat("{ (void)F; }");
5111
Daniel Jasper998cabc2013-07-18 14:46:07 +00005112 // Don't break after a cast's
5113 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5114 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
5115 " bbbbbbbbbbbbbbbbbbbbbb);");
5116
Daniel Jasperef906a92013-01-13 08:01:36 +00005117 // These are not casts.
5118 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005119 verifyFormat("f(foo)->b;");
5120 verifyFormat("f(foo).b;");
5121 verifyFormat("f(foo)(b);");
5122 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005123 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00005124 verifyFormat("(*funptr)(foo)[4];");
5125 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005126 verifyFormat("void f(int *);");
5127 verifyFormat("void f(int *) = 0;");
5128 verifyFormat("void f(SmallVector<int>) {}");
5129 verifyFormat("void f(SmallVector<int>);");
5130 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00005131 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005132 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005133 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00005134 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
5135 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00005136 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005137
Daniel Jasperba0bda92013-02-23 08:07:18 +00005138 // These are not casts, but at some point were confused with casts.
5139 verifyFormat("virtual void foo(int *) override;");
5140 verifyFormat("virtual void foo(char &) const;");
5141 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00005142 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005143 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00005144 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00005145 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00005146
5147 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
5148 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005149 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005150 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005151 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5152 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
5153 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005154}
5155
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005156TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005157 verifyFormat("A<bool()> a;");
5158 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00005159 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005160 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005161 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005162 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005163 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00005164 verifyFormat("template <class CallbackClass>\n"
5165 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005166
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005167 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
5168 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00005169 verifyGoogleFormat(
5170 "template <class CallbackClass>\n"
5171 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00005172
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005173 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00005174 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005175 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00005176 verifyFormat("some_var = function(*some_pointer_var)[0];");
5177 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00005178 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00005179 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005180}
5181
Daniel Jasperbeaa3222015-02-26 11:30:50 +00005182TEST_F(FormatTest, FormatsPointersToArrayTypes) {
5183 verifyFormat("A (*foo_)[6];");
5184 verifyFormat("vector<int> (*foo_)[6];");
5185}
5186
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005187TEST_F(FormatTest, BreaksLongVariableDeclarations) {
5188 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5189 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
5190 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
5191 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00005192 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5193 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005194
5195 // Different ways of ()-initializiation.
5196 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5197 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
5198 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5199 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
5200 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5201 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00005202 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5203 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00005204
5205 // Lambdas should not confuse the variable declaration heuristic.
5206 verifyFormat("LooooooooooooooooongType\n"
5207 " variable(nullptr, [](A *a) {});",
5208 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005209}
5210
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005211TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00005212 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005213 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005214 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005215 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00005216 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005217 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00005218 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
5219 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00005220 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5221 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00005222 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
5223 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00005224 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5225 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00005226 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5227 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005228 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5229 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
5230 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5231 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00005232 FormatStyle Indented = getLLVMStyle();
5233 Indented.IndentWrappedFunctionNames = true;
5234 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5235 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
5236 Indented);
5237 verifyFormat(
5238 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5239 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5240 Indented);
5241 verifyFormat(
5242 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5243 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5244 Indented);
5245 verifyFormat(
5246 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5247 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5248 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00005249
5250 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00005251 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
5252 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
5253 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00005254
Daniel Jasperd2639ef2013-01-28 15:16:31 +00005255 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005256 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00005257 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00005258 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
5259 " SourceLocation L, IdentifierIn *II,\n"
5260 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005261 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005262 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005263 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005264 " const SomeType<string, SomeOtherTemplateParameter>\n"
5265 " &ReallyReallyLongParameterName,\n"
5266 " const SomeType<string, SomeOtherTemplateParameter>\n"
5267 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00005268 verifyFormat("template <typename A>\n"
5269 "SomeLoooooooooooooooooooooongType<\n"
5270 " typename some_namespace::SomeOtherType<A>::Type>\n"
5271 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005272
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00005273 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00005274 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
5275 " aaaaaaaaaaaaaaaaaaaaaaa;");
5276 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005277 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
5278 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005279 verifyGoogleFormat(
5280 "some_namespace::LongReturnType\n"
5281 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005282 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005283
5284 verifyGoogleFormat("template <typename T>\n"
5285 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005286 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00005287 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5288 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00005289
5290 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005291 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5292 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00005293 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5294 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
5295 " aaaaaaaaaaaaaaaaaaaaaaaa);");
5296 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5297 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5298 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
5299 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00005300}
5301
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005302TEST_F(FormatTest, FormatsArrays) {
5303 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5304 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00005305 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
5306 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00005307 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5308 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005309 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5310 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5311 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5312 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
5313 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5314 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5315 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5316 verifyFormat(
5317 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
5318 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5319 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00005320 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
5321 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00005322
5323 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
5324 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00005325 verifyFormat(
5326 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
5327 " .aaaaaaa[0]\n"
5328 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00005329 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00005330
5331 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00005332
5333 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
5334 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005335}
5336
Daniel Jaspere9de2602012-12-06 09:56:08 +00005337TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
5338 verifyFormat("(a)->b();");
5339 verifyFormat("--a;");
5340}
5341
Daniel Jasper8b529712012-12-04 13:02:32 +00005342TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00005343 verifyFormat("#include <string>\n"
5344 "#include <a/b/c.h>\n"
5345 "#include \"a/b/string\"\n"
5346 "#include \"string.h\"\n"
5347 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00005348 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005349 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00005350 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00005351 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00005352 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005353 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
5354 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00005355 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
5356 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00005357
Daniel Jasper5ef433f2013-01-13 08:12:18 +00005358 verifyFormat("#import <string>");
5359 verifyFormat("#import <a/b/c.h>");
5360 verifyFormat("#import \"a/b/string\"");
5361 verifyFormat("#import \"string.h\"");
5362 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00005363 verifyFormat("#if __has_include(<strstream>)\n"
5364 "#include <strstream>\n"
5365 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005366
Daniel Jasper343643b2014-08-13 08:29:18 +00005367 verifyFormat("#define MY_IMPORT <a/b>");
5368
Nico Weber21088802017-02-10 19:36:52 +00005369 verifyFormat("#if __has_include(<a/b>)");
5370 verifyFormat("#if __has_include_next(<a/b>)");
5371 verifyFormat("#define F __has_include(<a/b>)");
5372 verifyFormat("#define F __has_include_next(<a/b>)");
5373
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005374 // Protocol buffer definition or missing "#".
5375 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
5376 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00005377
5378 FormatStyle Style = getLLVMStyle();
5379 Style.AlwaysBreakBeforeMultilineStrings = true;
5380 Style.ColumnLimit = 0;
5381 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00005382
5383 // But 'import' might also be a regular C++ namespace.
5384 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5385 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00005386}
5387
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005388//===----------------------------------------------------------------------===//
5389// Error recovery tests.
5390//===----------------------------------------------------------------------===//
5391
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005392TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005393 FormatStyle NoBinPacking = getLLVMStyle();
5394 NoBinPacking.BinPackParameters = false;
5395 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
5396 " double *min_x,\n"
5397 " double *max_x,\n"
5398 " double *min_y,\n"
5399 " double *max_y,\n"
5400 " double *min_z,\n"
5401 " double *max_z, ) {}",
5402 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005403}
5404
Daniel Jasper83a54d22013-01-10 09:26:47 +00005405TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00005406 verifyFormat("void f() { return; }\n42");
5407 verifyFormat("void f() {\n"
5408 " if (0)\n"
5409 " return;\n"
5410 "}\n"
5411 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00005412 verifyFormat("void f() { return }\n42");
5413 verifyFormat("void f() {\n"
5414 " if (0)\n"
5415 " return\n"
5416 "}\n"
5417 "42");
5418}
5419
5420TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
5421 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
5422 EXPECT_EQ("void f() {\n"
5423 " if (a)\n"
5424 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005425 "}",
5426 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00005427 EXPECT_EQ("namespace N {\n"
5428 "void f()\n"
5429 "}",
5430 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00005431 EXPECT_EQ("namespace N {\n"
5432 "void f() {}\n"
5433 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005434 "}",
5435 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00005436}
5437
Daniel Jasper2df93312013-01-09 10:16:05 +00005438TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
5439 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00005440 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005441 " b;",
5442 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00005443 verifyFormat("function(\n"
5444 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005445 " LoooooooooooongArgument);\n",
5446 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00005447}
5448
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005449TEST_F(FormatTest, IncorrectAccessSpecifier) {
5450 verifyFormat("public:");
5451 verifyFormat("class A {\n"
5452 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005453 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005454 "};");
5455 verifyFormat("public\n"
5456 "int qwerty;");
5457 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005458 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005459 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005460 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005461 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005462 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005463}
Daniel Jasperf7935112012-12-03 18:12:45 +00005464
Daniel Jasper291f9362013-03-20 15:58:10 +00005465TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
5466 verifyFormat("{");
5467 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00005468 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00005469}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005470
5471TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005472 verifyFormat("do {\n}");
5473 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005474 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005475 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005476 "wheeee(fun);");
5477 verifyFormat("do {\n"
5478 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00005479 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005480}
5481
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005482TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00005483 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005484 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00005485 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005486 verifyFormat("while {\n foo;\n foo();\n}");
5487 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00005488}
5489
Daniel Jasperc0880a92013-01-04 18:52:56 +00005490TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00005491 verifyIncompleteFormat("namespace {\n"
5492 "class Foo { Foo (\n"
5493 "};\n"
5494 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00005495}
5496
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005497TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005498 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005499 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
5500 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005501 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005502
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005503 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005504 " {\n"
5505 " breakme(\n"
5506 " qwe);\n"
5507 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005508 format("{\n"
5509 " {\n"
5510 " breakme(qwe);\n"
5511 "}\n",
5512 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005513}
5514
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00005515TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005516 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005517 " avariable,\n"
5518 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005519 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00005520}
5521
Manuel Klimek762dd182013-01-21 10:07:49 +00005522TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005523 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00005524}
5525
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005526TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00005527 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00005528 verifyFormat("vector<int> x{\n"
5529 " 1, 2, 3, 4,\n"
5530 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005531 verifyFormat("vector<T> x{{}, {}, {}, {}};");
5532 verifyFormat("f({1, 2});");
5533 verifyFormat("auto v = Foo{-1};");
5534 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
5535 verifyFormat("Class::Class : member{1, 2, 3} {}");
5536 verifyFormat("new vector<int>{1, 2, 3};");
5537 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00005538 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005539 verifyFormat("return {arg1, arg2};");
5540 verifyFormat("return {arg1, SomeType{parameter}};");
5541 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
5542 verifyFormat("new T{arg1, arg2};");
5543 verifyFormat("f(MyMap[{composite, key}]);");
5544 verifyFormat("class Class {\n"
5545 " T member = {arg1, arg2};\n"
5546 "};");
5547 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00005548 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
5549 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00005550
Daniel Jasper438059e2014-05-22 12:11:13 +00005551 verifyFormat("int foo(int i) { return fo1{}(i); }");
5552 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005553 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00005554 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00005555 verifyFormat("Node n{1, Node{1000}, //\n"
5556 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00005557 verifyFormat("Aaaa aaaaaaa{\n"
5558 " {\n"
5559 " aaaa,\n"
5560 " },\n"
5561 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00005562 verifyFormat("class C : public D {\n"
5563 " SomeClass SC{2};\n"
5564 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00005565 verifyFormat("class C : public A {\n"
5566 " class D : public B {\n"
5567 " void f() { int i{2}; }\n"
5568 " };\n"
5569 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00005570 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00005571
Daniel Jaspere4ada022016-12-13 10:05:03 +00005572 // Cases where distinguising braced lists and blocks is hard.
5573 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
5574 verifyFormat("void f() {\n"
5575 " return; // comment\n"
5576 "}\n"
5577 "SomeType t;");
5578 verifyFormat("void f() {\n"
5579 " if (a) {\n"
5580 " f();\n"
5581 " }\n"
5582 "}\n"
5583 "SomeType t;");
5584
Daniel Jasper08434342015-05-26 07:26:26 +00005585 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005586 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00005587 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005588 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
5589 " bbbbb,\n"
5590 " ccccc,\n"
5591 " ddddd,\n"
5592 " eeeee,\n"
5593 " ffffff,\n"
5594 " ggggg,\n"
5595 " hhhhhh,\n"
5596 " iiiiii,\n"
5597 " jjjjjj,\n"
5598 " kkkkkk};",
5599 NoBinPacking);
5600 verifyFormat("const Aaaaaa aaaaa = {\n"
5601 " aaaaa,\n"
5602 " bbbbb,\n"
5603 " ccccc,\n"
5604 " ddddd,\n"
5605 " eeeee,\n"
5606 " ffffff,\n"
5607 " ggggg,\n"
5608 " hhhhhh,\n"
5609 " iiiiii,\n"
5610 " jjjjjj,\n"
5611 " kkkkkk,\n"
5612 "};",
5613 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00005614 verifyFormat(
5615 "const Aaaaaa aaaaa = {\n"
5616 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
5617 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
5618 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
5619 "};",
5620 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005621
Chandler Carruthf8b72662014-03-02 12:37:31 +00005622 // FIXME: The alignment of these trailing comments might be bad. Then again,
5623 // this might be utterly useless in real code.
5624 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00005625 " : some_value{ //\n"
5626 " aaaaaaa, //\n"
5627 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00005628
Chandler Carruthf8b72662014-03-02 12:37:31 +00005629 // In braced lists, the first comment is always assumed to belong to the
5630 // first element. Thus, it can be moved to the next or previous line as
5631 // appropriate.
5632 EXPECT_EQ("function({// First element:\n"
5633 " 1,\n"
5634 " // Second element:\n"
5635 " 2});",
5636 format("function({\n"
5637 " // First element:\n"
5638 " 1,\n"
5639 " // Second element:\n"
5640 " 2});"));
5641 EXPECT_EQ("std::vector<int> MyNumbers{\n"
5642 " // First element:\n"
5643 " 1,\n"
5644 " // Second element:\n"
5645 " 2};",
5646 format("std::vector<int> MyNumbers{// First element:\n"
5647 " 1,\n"
5648 " // Second element:\n"
5649 " 2};",
5650 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00005651 // A trailing comma should still lead to an enforced line break.
5652 EXPECT_EQ("vector<int> SomeVector = {\n"
5653 " // aaa\n"
5654 " 1, 2,\n"
5655 "};",
5656 format("vector<int> SomeVector = { // aaa\n"
5657 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00005658
Chandler Carruthf8b72662014-03-02 12:37:31 +00005659 FormatStyle ExtraSpaces = getLLVMStyle();
5660 ExtraSpaces.Cpp11BracedListStyle = false;
5661 ExtraSpaces.ColumnLimit = 75;
5662 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
5663 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
5664 verifyFormat("f({ 1, 2 });", ExtraSpaces);
5665 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
5666 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
5667 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
5668 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
5669 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
5670 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
5671 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
5672 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
5673 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
5674 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
5675 verifyFormat("class Class {\n"
5676 " T member = { arg1, arg2 };\n"
5677 "};",
5678 ExtraSpaces);
5679 verifyFormat(
5680 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5681 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
5682 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
5683 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
5684 ExtraSpaces);
5685 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00005686 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00005687 ExtraSpaces);
5688 verifyFormat(
5689 "someFunction(OtherParam,\n"
5690 " BracedList{ // comment 1 (Forcing interesting break)\n"
5691 " param1, param2,\n"
5692 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00005693 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00005694 ExtraSpaces);
5695 verifyFormat(
5696 "std::this_thread::sleep_for(\n"
5697 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
5698 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00005699 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00005700 " aaaaaaa,\n"
5701 " aaaaaaaaaa,\n"
5702 " aaaaa,\n"
5703 " aaaaaaaaaaaaaaa,\n"
5704 " aaa,\n"
5705 " aaaaaaaaaa,\n"
5706 " a,\n"
5707 " aaaaaaaaaaaaaaaaaaaaa,\n"
5708 " aaaaaaaaaaaa,\n"
5709 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
5710 " aaaaaaa,\n"
5711 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005712 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00005713}
5714
Daniel Jasper33b909c2013-10-25 14:29:37 +00005715TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00005716 verifyFormat("vector<int> x = {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,\n"
5720 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5721 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00005722 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005723 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00005724 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005725 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5726 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005727 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00005728 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5729 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5730 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
5731 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5732 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5733 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5734 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005735 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005736 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5737 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00005738 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
5739 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5740 " // Separating comment.\n"
5741 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
5742 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
5743 " // Leading comment\n"
5744 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5745 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005746 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5747 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005748 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00005749 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5750 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005751 getLLVMStyleWithColumns(38));
5752 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005753 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
5754 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005755 verifyFormat(
5756 "static unsigned SomeValues[10][3] = {\n"
5757 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
5758 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
5759 verifyFormat("static auto fields = new vector<string>{\n"
5760 " \"aaaaaaaaaaaaa\",\n"
5761 " \"aaaaaaaaaaaaa\",\n"
5762 " \"aaaaaaaaaaaa\",\n"
5763 " \"aaaaaaaaaaaaaa\",\n"
5764 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
5765 " \"aaaaaaaaaaaa\",\n"
5766 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
5767 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00005768 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
5769 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
5770 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
5771 " 3, cccccccccccccccccccccc};",
5772 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00005773
5774 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00005775 verifyFormat("vector<int> x = {\n"
5776 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
5777 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00005778 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00005779 verifyFormat("vector<int> x = {\n"
5780 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00005781 "};",
5782 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00005783 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5784 " 1, 1, 1, 1,\n"
5785 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00005786 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005787
Daniel Jasper60c27072015-05-13 08:16:00 +00005788 // Trailing comment in the first line.
5789 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
5790 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
5791 " 111111111, 222222222, 3333333333, 444444444, //\n"
5792 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00005793 // Trailing comment in the last line.
5794 verifyFormat("int aaaaa[] = {\n"
5795 " 1, 2, 3, // comment\n"
5796 " 4, 5, 6 // comment\n"
5797 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00005798
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005799 // With nested lists, we should either format one item per line or all nested
5800 // lists one on line.
5801 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00005802 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
5803 " {aaaaaaaaaaaaaaaaaaa},\n"
5804 " {aaaaaaaaaaaaaaaaaaaaa},\n"
5805 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00005806 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00005807 verifyFormat(
5808 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005809 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
5810 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
5811 " {aaa, aaa},\n"
5812 " {aaa, aaa},\n"
5813 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
5814 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
5815 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00005816
5817 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00005818 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
5819 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00005820
5821 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00005822
Daniel Jaspereb65e912015-12-21 18:31:15 +00005823 // No braced initializer here.
5824 verifyFormat("void f() {\n"
5825 " struct Dummy {};\n"
5826 " f(v);\n"
5827 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00005828
5829 // Long lists should be formatted in columns even if they are nested.
5830 verifyFormat(
5831 "vector<int> x = function({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,\n"
5835 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5836 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00005837
5838 // Allow "single-column" layout even if that violates the column limit. There
5839 // isn't going to be a better way.
5840 verifyFormat("std::vector<int> a = {\n"
5841 " aaaaaaaa,\n"
5842 " aaaaaaaa,\n"
5843 " aaaaaaaa,\n"
5844 " aaaaaaaa,\n"
5845 " aaaaaaaaaa,\n"
5846 " aaaaaaaa,\n"
5847 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
5848 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00005849 verifyFormat("vector<int> aaaa = {\n"
5850 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5851 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5852 " aaaaaa.aaaaaaa,\n"
5853 " aaaaaa.aaaaaaa,\n"
5854 " aaaaaa.aaaaaaa,\n"
5855 " aaaaaa.aaaaaaa,\n"
5856 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00005857
5858 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005859 verifyFormat("someFunction(Param, {List1, List2,\n"
5860 " List3});",
5861 getLLVMStyleWithColumns(35));
5862 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00005863 " {List1, List2,\n"
5864 " List3});",
5865 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00005866 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
5867 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005868}
5869
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005870TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005871 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00005872 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005873
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005874 verifyFormat("void f() { return 42; }");
5875 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005876 " return 42;\n"
5877 "}",
5878 DoNotMerge);
5879 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005880 " // Comment\n"
5881 "}");
5882 verifyFormat("{\n"
5883 "#error {\n"
5884 " int a;\n"
5885 "}");
5886 verifyFormat("{\n"
5887 " int a;\n"
5888 "#error {\n"
5889 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00005890 verifyFormat("void f() {} // comment");
5891 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00005892 verifyFormat("void f() {\n"
5893 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005894 DoNotMerge);
5895 verifyFormat("void f() {\n"
5896 " int a;\n"
5897 "} // comment",
5898 DoNotMerge);
5899 verifyFormat("void f() {\n"
5900 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00005901 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005902
5903 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
5904 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
5905
5906 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
5907 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00005908 verifyFormat("class C {\n"
5909 " C()\n"
5910 " : iiiiiiii(nullptr),\n"
5911 " kkkkkkk(nullptr),\n"
5912 " mmmmmmm(nullptr),\n"
5913 " nnnnnnn(nullptr) {}\n"
5914 "};",
5915 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00005916
5917 FormatStyle NoColumnLimit = getLLVMStyle();
5918 NoColumnLimit.ColumnLimit = 0;
5919 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
5920 EXPECT_EQ("class C {\n"
5921 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005922 "};",
5923 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00005924 EXPECT_EQ("A()\n"
5925 " : b(0) {\n"
5926 "}",
5927 format("A()\n:b(0)\n{\n}", NoColumnLimit));
5928
5929 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00005930 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
5931 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00005932 EXPECT_EQ("A()\n"
5933 " : b(0) {\n"
5934 "}",
5935 format("A():b(0){}", DoNotMergeNoColumnLimit));
5936 EXPECT_EQ("A()\n"
5937 " : b(0) {\n"
5938 "}",
5939 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00005940
5941 verifyFormat("#define A \\\n"
5942 " void f() { \\\n"
5943 " int i; \\\n"
5944 " }",
5945 getLLVMStyleWithColumns(20));
5946 verifyFormat("#define A \\\n"
5947 " void f() { int i; }",
5948 getLLVMStyleWithColumns(21));
5949 verifyFormat("#define A \\\n"
5950 " void f() { \\\n"
5951 " int i; \\\n"
5952 " } \\\n"
5953 " int j;",
5954 getLLVMStyleWithColumns(22));
5955 verifyFormat("#define A \\\n"
5956 " void f() { int i; } \\\n"
5957 " int j;",
5958 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005959}
5960
Daniel Jasperd74cf402014-04-08 12:46:38 +00005961TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
5962 FormatStyle MergeInlineOnly = getLLVMStyle();
5963 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
5964 verifyFormat("class C {\n"
5965 " int f() { return 42; }\n"
5966 "};",
5967 MergeInlineOnly);
5968 verifyFormat("int f() {\n"
5969 " return 42;\n"
5970 "}",
5971 MergeInlineOnly);
5972}
5973
Manuel Klimeke01bab52013-01-15 13:38:33 +00005974TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
5975 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00005976 verifyFormat("struct foo a = {bar};\nint n;");
5977 verifyFormat("class foo a = {bar};\nint n;");
5978 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00005979
5980 // Elaborate types inside function definitions.
5981 verifyFormat("struct foo f() {}\nint n;");
5982 verifyFormat("class foo f() {}\nint n;");
5983 verifyFormat("union foo f() {}\nint n;");
5984
5985 // Templates.
5986 verifyFormat("template <class X> void f() {}\nint n;");
5987 verifyFormat("template <struct X> void f() {}\nint n;");
5988 verifyFormat("template <union X> void f() {}\nint n;");
5989
5990 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005991 verifyFormat("struct {\n} n;");
5992 verifyFormat(
5993 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00005994 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005995 verifyFormat("class MACRO Z {\n} n;");
5996 verifyFormat("class MACRO(X) Z {\n} n;");
5997 verifyFormat("class __attribute__(X) Z {\n} n;");
5998 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00005999 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006000 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006001 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6002 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006003
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006004 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006005 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006006
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006007 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006008 verifyFormat(
6009 "template <typename F>\n"
6010 "Matcher(const Matcher<F> &Other,\n"
6011 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6012 " !is_same<F, T>::value>::type * = 0)\n"
6013 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6014
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006015 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006016 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006017 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006018
6019 // FIXME:
6020 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006021 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006022
Manuel Klimeke01bab52013-01-15 13:38:33 +00006023 // Elaborate types where incorrectly parsing the structural element would
6024 // break the indent.
6025 verifyFormat("if (true)\n"
6026 " class X x;\n"
6027 "else\n"
6028 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006029
6030 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006031 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006032}
6033
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006034TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00006035 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
6036 format("#error Leave all white!!!!! space* alone!\n"));
6037 EXPECT_EQ(
6038 "#warning Leave all white!!!!! space* alone!\n",
6039 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006040 EXPECT_EQ("#error 1", format(" # error 1"));
6041 EXPECT_EQ("#warning 1", format(" # warning 1"));
6042}
6043
Daniel Jasper4431aa92013-04-23 13:54:04 +00006044TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00006045 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00006046 verifyFormat("#if (AAAA && BBBB)");
6047 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00006048 // FIXME: Come up with a better indentation for #elif.
6049 verifyFormat(
6050 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
6051 " defined(BBBBBBBB)\n"
6052 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
6053 " defined(BBBBBBBB)\n"
6054 "#endif",
6055 getLLVMStyleWithColumns(65));
6056}
6057
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006058TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
6059 FormatStyle AllowsMergedIf = getGoogleStyle();
6060 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
6061 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
6062 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00006063 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
6064 EXPECT_EQ("if (true) return 42;",
6065 format("if (true)\nreturn 42;", AllowsMergedIf));
6066 FormatStyle ShortMergedIf = AllowsMergedIf;
6067 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006068 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006069 " if (true) return 42;",
6070 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006071 verifyFormat("#define A \\\n"
6072 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006073 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006074 "#define B",
6075 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006076 verifyFormat("#define A \\\n"
6077 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006078 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006079 "g();",
6080 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00006081 verifyFormat("{\n"
6082 "#ifdef A\n"
6083 " // Comment\n"
6084 " if (true) continue;\n"
6085 "#endif\n"
6086 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00006087 " if (true) continue;\n"
6088 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006089 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00006090 ShortMergedIf.ColumnLimit = 29;
6091 verifyFormat("#define A \\\n"
6092 " if (aaaaaaaaaa) return 1; \\\n"
6093 " return 2;",
6094 ShortMergedIf);
6095 ShortMergedIf.ColumnLimit = 28;
6096 verifyFormat("#define A \\\n"
6097 " if (aaaaaaaaaa) \\\n"
6098 " return 1; \\\n"
6099 " return 2;",
6100 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006101}
6102
Manuel Klimekd33516e2013-01-23 10:09:28 +00006103TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006104 verifyFormat("void f(int *a);");
6105 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00006106 verifyFormat("class A {\n void f(int *a);\n};");
6107 verifyFormat("class A {\n int *a;\n};");
6108 verifyFormat("namespace a {\n"
6109 "namespace b {\n"
6110 "class A {\n"
6111 " void f() {}\n"
6112 " int *a;\n"
6113 "};\n"
6114 "}\n"
6115 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006116}
6117
Manuel Klimekd33516e2013-01-23 10:09:28 +00006118TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
6119 verifyFormat("while");
6120 verifyFormat("operator");
6121}
6122
Daniel Jasperfda47cd2016-10-31 13:23:00 +00006123TEST_F(FormatTest, SkipsDeeplyNestedLines) {
6124 // This code would be painfully slow to format if we didn't skip it.
6125 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
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(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6129 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6130 "A(1, 1)\n"
6131 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
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 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6140 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
6141 // Deeply nested part is untouched, rest is formatted.
6142 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
6143 format(std::string("int i;\n") + Code + "int j;\n",
6144 getLLVMStyle(), IC_ExpectIncomplete));
6145}
6146
Nico Weber7e6a7a12013-01-08 17:56:31 +00006147//===----------------------------------------------------------------------===//
6148// Objective-C tests.
6149//===----------------------------------------------------------------------===//
6150
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006151TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
6152 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
6153 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
6154 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00006155 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006156 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
6157 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
6158 format("-(NSInteger)Method3:(id)anObject;"));
6159 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
6160 format("-(NSInteger)Method4:(id)anObject;"));
6161 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
6162 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
6163 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
6164 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00006165 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6166 "forAllCells:(BOOL)flag;",
6167 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6168 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00006169
6170 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00006171 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
6172 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00006173 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
6174 " inRange:(NSRange)range\n"
6175 " outRange:(NSRange)out_range\n"
6176 " outRange1:(NSRange)out_range1\n"
6177 " outRange2:(NSRange)out_range2\n"
6178 " outRange3:(NSRange)out_range3\n"
6179 " outRange4:(NSRange)out_range4\n"
6180 " outRange5:(NSRange)out_range5\n"
6181 " outRange6:(NSRange)out_range6\n"
6182 " outRange7:(NSRange)out_range7\n"
6183 " outRange8:(NSRange)out_range8\n"
6184 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006185
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00006186 // When the function name has to be wrapped.
6187 FormatStyle Style = getLLVMStyle();
6188 Style.IndentWrappedFunctionNames = false;
6189 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6190 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6191 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6192 "}",
6193 Style);
6194 Style.IndentWrappedFunctionNames = true;
6195 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6196 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6197 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6198 "}",
6199 Style);
6200
Nico Weberd6f962f2013-01-10 20:18:33 +00006201 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00006202 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006203 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
6204 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00006205 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00006206
Daniel Jasper37194282013-05-28 08:33:00 +00006207 verifyFormat("- (int (*)())foo:(int (*)())f;");
6208 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006209
6210 // If there's no return type (very rare in practice!), LLVM and Google style
6211 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00006212 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006213 verifyFormat("- foo:(int)f;");
6214 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006215}
6216
Nico Weber0588b502013-02-07 00:19:29 +00006217
Alexander Kornienko64a42b82014-04-15 14:52:43 +00006218TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00006219 EXPECT_EQ("\"some text \"\n"
6220 "\"other\";",
6221 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00006222 EXPECT_EQ("\"some text \"\n"
6223 "\"other\";",
6224 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006225 EXPECT_EQ(
6226 "#define A \\\n"
6227 " \"some \" \\\n"
6228 " \"text \" \\\n"
6229 " \"other\";",
6230 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
6231 EXPECT_EQ(
6232 "#define A \\\n"
6233 " \"so \" \\\n"
6234 " \"text \" \\\n"
6235 " \"other\";",
6236 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
6237
6238 EXPECT_EQ("\"some text\"",
6239 format("\"some text\"", getLLVMStyleWithColumns(1)));
6240 EXPECT_EQ("\"some text\"",
6241 format("\"some text\"", getLLVMStyleWithColumns(11)));
6242 EXPECT_EQ("\"some \"\n"
6243 "\"text\"",
6244 format("\"some text\"", getLLVMStyleWithColumns(10)));
6245 EXPECT_EQ("\"some \"\n"
6246 "\"text\"",
6247 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00006248 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00006249 "\" tex\"\n"
6250 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006251 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00006252 EXPECT_EQ("\"some\"\n"
6253 "\" tex\"\n"
6254 "\" and\"",
6255 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
6256 EXPECT_EQ("\"some\"\n"
6257 "\"/tex\"\n"
6258 "\"/and\"",
6259 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006260
6261 EXPECT_EQ("variable =\n"
6262 " \"long string \"\n"
6263 " \"literal\";",
6264 format("variable = \"long string literal\";",
6265 getLLVMStyleWithColumns(20)));
6266
6267 EXPECT_EQ("variable = f(\n"
6268 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006269 " \"literal\",\n"
6270 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00006271 " loooooooooooooooooooong);",
6272 format("variable = f(\"long string literal\", short, "
6273 "loooooooooooooooooooong);",
6274 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006275
Daniel Jaspera44991332015-04-29 13:06:49 +00006276 EXPECT_EQ(
6277 "f(g(\"long string \"\n"
6278 " \"literal\"),\n"
6279 " b);",
6280 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006281 EXPECT_EQ("f(g(\"long string \"\n"
6282 " \"literal\",\n"
6283 " a),\n"
6284 " b);",
6285 format("f(g(\"long string literal\", a), b);",
6286 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006287 EXPECT_EQ(
6288 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00006289 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006290 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
6291 EXPECT_EQ("f(\"one two three four five six \"\n"
6292 " \"seven\".split(\n"
6293 " really_looooong_variable));",
6294 format("f(\"one two three four five six seven\"."
6295 "split(really_looooong_variable));",
6296 getLLVMStyleWithColumns(33)));
6297
6298 EXPECT_EQ("f(\"some \"\n"
6299 " \"text\",\n"
6300 " other);",
6301 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00006302
6303 // Only break as a last resort.
6304 verifyFormat(
6305 "aaaaaaaaaaaaaaaaaaaa(\n"
6306 " aaaaaaaaaaaaaaaaaaaa,\n"
6307 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00006308
Daniel Jaspera44991332015-04-29 13:06:49 +00006309 EXPECT_EQ("\"splitmea\"\n"
6310 "\"trandomp\"\n"
6311 "\"oint\"",
6312 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00006313
Daniel Jaspera44991332015-04-29 13:06:49 +00006314 EXPECT_EQ("\"split/\"\n"
6315 "\"pathat/\"\n"
6316 "\"slashes\"",
6317 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006318
Daniel Jaspera44991332015-04-29 13:06:49 +00006319 EXPECT_EQ("\"split/\"\n"
6320 "\"pathat/\"\n"
6321 "\"slashes\"",
6322 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00006323 EXPECT_EQ("\"split at \"\n"
6324 "\"spaces/at/\"\n"
6325 "\"slashes.at.any$\"\n"
6326 "\"non-alphanumeric%\"\n"
6327 "\"1111111111characte\"\n"
6328 "\"rs\"",
6329 format("\"split at "
6330 "spaces/at/"
6331 "slashes.at."
6332 "any$non-"
6333 "alphanumeric%"
6334 "1111111111characte"
6335 "rs\"",
6336 getLLVMStyleWithColumns(20)));
6337
Daniel Jasper5aad4e52013-07-12 11:37:05 +00006338 // Verify that splitting the strings understands
6339 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00006340 EXPECT_EQ(
6341 "aaaaaaaaaaaa(\n"
6342 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
6343 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
6344 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
6345 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
6346 "aaaaaaaaaaaaaaaaaaaaaa\");",
6347 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00006348 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6349 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
6350 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
6351 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
6352 "aaaaaaaaaaaaaaaaaaaaaa\";",
6353 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00006354 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6355 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
6356 format("llvm::outs() << "
6357 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
6358 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00006359 EXPECT_EQ("ffff(\n"
6360 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6361 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
6362 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
6363 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
6364 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00006365
Daniel Jaspere1a7b762016-02-01 11:21:02 +00006366 FormatStyle Style = getLLVMStyleWithColumns(12);
6367 Style.BreakStringLiterals = false;
6368 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
6369
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006370 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
6371 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00006372 EXPECT_EQ("#define A \\\n"
6373 " \"some \" \\\n"
6374 " \"text \" \\\n"
6375 " \"other\";",
6376 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006377}
6378
Manuel Klimek9e321992015-07-28 15:50:24 +00006379TEST_F(FormatTest, FullyRemoveEmptyLines) {
6380 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
6381 NoEmptyLines.MaxEmptyLinesToKeep = 0;
6382 EXPECT_EQ("int i = a(b());",
6383 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
6384}
6385
Alexander Kornienko64a42b82014-04-15 14:52:43 +00006386TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
6387 EXPECT_EQ(
6388 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
6389 "(\n"
6390 " \"x\t\");",
6391 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
6392 "aaaaaaa("
6393 "\"x\t\");"));
6394}
6395
Daniel Jasper174b0122014-01-09 14:18:12 +00006396TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00006397 EXPECT_EQ(
6398 "u8\"utf8 string \"\n"
6399 "u8\"literal\";",
6400 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
6401 EXPECT_EQ(
6402 "u\"utf16 string \"\n"
6403 "u\"literal\";",
6404 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
6405 EXPECT_EQ(
6406 "U\"utf32 string \"\n"
6407 "U\"literal\";",
6408 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
6409 EXPECT_EQ("L\"wide string \"\n"
6410 "L\"literal\";",
6411 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00006412 EXPECT_EQ("@\"NSString \"\n"
6413 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00006414 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00006415
6416 // This input makes clang-format try to split the incomplete unicode escape
6417 // sequence, which used to lead to a crasher.
6418 verifyNoCrash(
6419 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
6420 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006421}
6422
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00006423TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
6424 FormatStyle Style = getGoogleStyleWithColumns(15);
6425 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
6426 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
6427 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
6428 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
6429 EXPECT_EQ("u8R\"x(raw literal)x\";",
6430 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006431}
6432
6433TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
6434 FormatStyle Style = getLLVMStyleWithColumns(20);
6435 EXPECT_EQ(
6436 "_T(\"aaaaaaaaaaaaaa\")\n"
6437 "_T(\"aaaaaaaaaaaaaa\")\n"
6438 "_T(\"aaaaaaaaaaaa\")",
6439 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
6440 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
6441 " _T(\"aaaaaa\"),\n"
6442 " z);",
6443 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
6444
6445 // FIXME: Handle embedded spaces in one iteration.
6446 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
6447 // "_T(\"aaaaaaaaaaaaa\")\n"
6448 // "_T(\"aaaaaaaaaaaaa\")\n"
6449 // "_T(\"a\")",
6450 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
6451 // getLLVMStyleWithColumns(20)));
6452 EXPECT_EQ(
6453 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
6454 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00006455 EXPECT_EQ("f(\n"
6456 "#if !TEST\n"
6457 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
6458 "#endif\n"
6459 " );",
6460 format("f(\n"
6461 "#if !TEST\n"
6462 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
6463 "#endif\n"
6464 ");"));
6465 EXPECT_EQ("f(\n"
6466 "\n"
6467 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
6468 format("f(\n"
6469 "\n"
6470 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006471}
6472
Alexander Kornienko657c67b2013-07-16 21:06:13 +00006473TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006474 EXPECT_EQ(
6475 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6476 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6477 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
6478 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6479 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6480 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
6481}
6482
6483TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
6484 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00006485 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006486 EXPECT_EQ("fffffffffff(g(R\"x(\n"
6487 "multiline raw string literal xxxxxxxxxxxxxx\n"
6488 ")x\",\n"
6489 " a),\n"
6490 " b);",
6491 format("fffffffffff(g(R\"x(\n"
6492 "multiline raw string literal xxxxxxxxxxxxxx\n"
6493 ")x\", a), b);",
6494 getGoogleStyleWithColumns(20)));
6495 EXPECT_EQ("fffffffffff(\n"
6496 " g(R\"x(qqq\n"
6497 "multiline raw string literal xxxxxxxxxxxxxx\n"
6498 ")x\",\n"
6499 " a),\n"
6500 " b);",
6501 format("fffffffffff(g(R\"x(qqq\n"
6502 "multiline raw string literal xxxxxxxxxxxxxx\n"
6503 ")x\", a), b);",
6504 getGoogleStyleWithColumns(20)));
6505
6506 EXPECT_EQ("fffffffffff(R\"x(\n"
6507 "multiline raw string literal xxxxxxxxxxxxxx\n"
6508 ")x\");",
6509 format("fffffffffff(R\"x(\n"
6510 "multiline raw string literal xxxxxxxxxxxxxx\n"
6511 ")x\");",
6512 getGoogleStyleWithColumns(20)));
6513 EXPECT_EQ("fffffffffff(R\"x(\n"
6514 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00006515 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006516 format("fffffffffff(R\"x(\n"
6517 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00006518 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006519 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00006520 EXPECT_EQ("fffffffffff(\n"
6521 " R\"x(\n"
6522 "multiline raw string literal xxxxxxxxxxxxxx\n"
6523 ")x\" +\n"
6524 " bbbbbb);",
6525 format("fffffffffff(\n"
6526 " R\"x(\n"
6527 "multiline raw string literal xxxxxxxxxxxxxx\n"
6528 ")x\" + bbbbbb);",
6529 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00006530}
6531
Alexander Kornienkobe633902013-06-14 11:46:10 +00006532TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00006533 verifyFormat("string a = \"unterminated;");
6534 EXPECT_EQ("function(\"unterminated,\n"
6535 " OtherParameter);",
6536 format("function( \"unterminated,\n"
6537 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00006538}
6539
6540TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006541 FormatStyle Style = getLLVMStyle();
6542 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00006543 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006544 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00006545}
6546
Daniel Jaspera44991332015-04-29 13:06:49 +00006547TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00006548
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006549TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
6550 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
6551 " \"ddeeefff\");",
6552 format("someFunction(\"aaabbbcccdddeeefff\");",
6553 getLLVMStyleWithColumns(25)));
6554 EXPECT_EQ("someFunction1234567890(\n"
6555 " \"aaabbbcccdddeeefff\");",
6556 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6557 getLLVMStyleWithColumns(26)));
6558 EXPECT_EQ("someFunction1234567890(\n"
6559 " \"aaabbbcccdddeeeff\"\n"
6560 " \"f\");",
6561 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6562 getLLVMStyleWithColumns(25)));
6563 EXPECT_EQ("someFunction1234567890(\n"
6564 " \"aaabbbcccdddeeeff\"\n"
6565 " \"f\");",
6566 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6567 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00006568 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
6569 " \"ddde \"\n"
6570 " \"efff\");",
6571 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006572 getLLVMStyleWithColumns(25)));
6573 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
6574 " \"ddeeefff\");",
6575 format("someFunction(\"aaabbbccc ddeeefff\");",
6576 getLLVMStyleWithColumns(25)));
6577 EXPECT_EQ("someFunction1234567890(\n"
6578 " \"aaabb \"\n"
6579 " \"cccdddeeefff\");",
6580 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
6581 getLLVMStyleWithColumns(25)));
6582 EXPECT_EQ("#define A \\\n"
6583 " string s = \\\n"
6584 " \"123456789\" \\\n"
6585 " \"0\"; \\\n"
6586 " int i;",
6587 format("#define A string s = \"1234567890\"; int i;",
6588 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00006589 // FIXME: Put additional penalties on breaking at non-whitespace locations.
6590 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
6591 " \"dddeeeff\"\n"
6592 " \"f\");",
6593 format("someFunction(\"aaabbbcc dddeeefff\");",
6594 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006595}
6596
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006597TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00006598 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
6599 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006600 EXPECT_EQ("\"test\"\n"
6601 "\"\\n\"",
6602 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
6603 EXPECT_EQ("\"tes\\\\\"\n"
6604 "\"n\"",
6605 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
6606 EXPECT_EQ("\"\\\\\\\\\"\n"
6607 "\"\\n\"",
6608 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00006609 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006610 EXPECT_EQ("\"\\uff01\"\n"
6611 "\"test\"",
6612 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
6613 EXPECT_EQ("\"\\Uff01ff02\"",
6614 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
6615 EXPECT_EQ("\"\\x000000000001\"\n"
6616 "\"next\"",
6617 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
6618 EXPECT_EQ("\"\\x000000000001next\"",
6619 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
6620 EXPECT_EQ("\"\\x000000000001\"",
6621 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
6622 EXPECT_EQ("\"test\"\n"
6623 "\"\\000000\"\n"
6624 "\"000001\"",
6625 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
6626 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00006627 "\"00000000\"\n"
6628 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006629 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006630}
6631
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00006632TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
6633 verifyFormat("void f() {\n"
6634 " return g() {}\n"
6635 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006636 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00006637 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00006638 "}");
6639}
6640
Manuel Klimek421147e2014-01-24 09:25:23 +00006641TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
6642 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00006643 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00006644}
6645
Manuel Klimek13b97d82013-05-13 08:42:42 +00006646TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
6647 verifyFormat("class X {\n"
6648 " void f() {\n"
6649 " }\n"
6650 "};",
6651 getLLVMStyleWithColumns(12));
6652}
6653
6654TEST_F(FormatTest, ConfigurableIndentWidth) {
6655 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
6656 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00006657 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00006658 verifyFormat("void f() {\n"
6659 " someFunction();\n"
6660 " if (true) {\n"
6661 " f();\n"
6662 " }\n"
6663 "}",
6664 EightIndent);
6665 verifyFormat("class X {\n"
6666 " void f() {\n"
6667 " }\n"
6668 "};",
6669 EightIndent);
6670 verifyFormat("int x[] = {\n"
6671 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006672 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00006673 EightIndent);
6674}
6675
Alexander Kornienko34a87e82013-06-22 01:35:36 +00006676TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00006677 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00006678 "f();",
6679 getLLVMStyleWithColumns(8));
6680}
6681
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006682TEST_F(FormatTest, ConfigurableUseOfTab) {
6683 FormatStyle Tab = getLLVMStyleWithColumns(42);
6684 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006685 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006686 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00006687
6688 EXPECT_EQ("if (aaaaaaaa && // q\n"
6689 " bb)\t\t// w\n"
6690 "\t;",
6691 format("if (aaaaaaaa &&// q\n"
6692 "bb)// w\n"
6693 ";",
6694 Tab));
6695 EXPECT_EQ("if (aaa && bbb) // w\n"
6696 "\t;",
6697 format("if(aaa&&bbb)// w\n"
6698 ";",
6699 Tab));
6700
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006701 verifyFormat("class X {\n"
6702 "\tvoid f() {\n"
6703 "\t\tsomeFunction(parameter1,\n"
6704 "\t\t\t parameter2);\n"
6705 "\t}\n"
6706 "};",
6707 Tab);
6708 verifyFormat("#define A \\\n"
6709 "\tvoid f() { \\\n"
6710 "\t\tsomeFunction( \\\n"
6711 "\t\t parameter1, \\\n"
6712 "\t\t parameter2); \\\n"
6713 "\t}",
6714 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00006715
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00006716 Tab.TabWidth = 4;
6717 Tab.IndentWidth = 8;
6718 verifyFormat("class TabWidth4Indent8 {\n"
6719 "\t\tvoid f() {\n"
6720 "\t\t\t\tsomeFunction(parameter1,\n"
6721 "\t\t\t\t\t\t\t parameter2);\n"
6722 "\t\t}\n"
6723 "};",
6724 Tab);
6725
6726 Tab.TabWidth = 4;
6727 Tab.IndentWidth = 4;
6728 verifyFormat("class TabWidth4Indent4 {\n"
6729 "\tvoid f() {\n"
6730 "\t\tsomeFunction(parameter1,\n"
6731 "\t\t\t\t\t parameter2);\n"
6732 "\t}\n"
6733 "};",
6734 Tab);
6735
6736 Tab.TabWidth = 8;
6737 Tab.IndentWidth = 4;
6738 verifyFormat("class TabWidth8Indent4 {\n"
6739 " void f() {\n"
6740 "\tsomeFunction(parameter1,\n"
6741 "\t\t parameter2);\n"
6742 " }\n"
6743 "};",
6744 Tab);
6745
Alexander Kornienko39856b72013-09-10 09:38:25 +00006746 Tab.TabWidth = 8;
6747 Tab.IndentWidth = 8;
6748 EXPECT_EQ("/*\n"
6749 "\t a\t\tcomment\n"
6750 "\t in multiple lines\n"
6751 " */",
6752 format(" /*\t \t \n"
6753 " \t \t a\t\tcomment\t \t\n"
6754 " \t \t in multiple lines\t\n"
6755 " \t */",
6756 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00006757
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006758 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00006759 verifyFormat("{\n"
6760 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6761 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6762 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6763 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6764 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6765 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00006766 "};",
6767 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00006768 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00006769 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00006770 "\ta2,\n"
6771 "\ta3\n"
6772 "};",
6773 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006774 EXPECT_EQ("if (aaaaaaaa && // q\n"
6775 " bb) // w\n"
6776 "\t;",
6777 format("if (aaaaaaaa &&// q\n"
6778 "bb)// w\n"
6779 ";",
6780 Tab));
6781 verifyFormat("class X {\n"
6782 "\tvoid f() {\n"
6783 "\t\tsomeFunction(parameter1,\n"
6784 "\t\t parameter2);\n"
6785 "\t}\n"
6786 "};",
6787 Tab);
6788 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00006789 "\tQ(\n"
6790 "\t {\n"
6791 "\t\t int a;\n"
6792 "\t\t someFunction(aaaaaaaa,\n"
6793 "\t\t bbbbbbb);\n"
6794 "\t },\n"
6795 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006796 "}",
6797 Tab);
6798 EXPECT_EQ("{\n"
6799 "\t/* aaaa\n"
6800 "\t bbbb */\n"
6801 "}",
6802 format("{\n"
6803 "/* aaaa\n"
6804 " bbbb */\n"
6805 "}",
6806 Tab));
6807 EXPECT_EQ("{\n"
6808 "\t/*\n"
6809 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6810 "\t bbbbbbbbbbbbb\n"
6811 "\t*/\n"
6812 "}",
6813 format("{\n"
6814 "/*\n"
6815 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6816 "*/\n"
6817 "}",
6818 Tab));
6819 EXPECT_EQ("{\n"
6820 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6821 "\t// bbbbbbbbbbbbb\n"
6822 "}",
6823 format("{\n"
6824 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6825 "}",
6826 Tab));
6827 EXPECT_EQ("{\n"
6828 "\t/*\n"
6829 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6830 "\t bbbbbbbbbbbbb\n"
6831 "\t*/\n"
6832 "}",
6833 format("{\n"
6834 "\t/*\n"
6835 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6836 "\t*/\n"
6837 "}",
6838 Tab));
6839 EXPECT_EQ("{\n"
6840 "\t/*\n"
6841 "\n"
6842 "\t*/\n"
6843 "}",
6844 format("{\n"
6845 "\t/*\n"
6846 "\n"
6847 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00006848 "}",
6849 Tab));
6850 EXPECT_EQ("{\n"
6851 "\t/*\n"
6852 " asdf\n"
6853 "\t*/\n"
6854 "}",
6855 format("{\n"
6856 "\t/*\n"
6857 " asdf\n"
6858 "\t*/\n"
6859 "}",
6860 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006861
6862 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00006863 EXPECT_EQ("/*\n"
6864 " a\t\tcomment\n"
6865 " in multiple lines\n"
6866 " */",
6867 format(" /*\t \t \n"
6868 " \t \t a\t\tcomment\t \t\n"
6869 " \t \t in multiple lines\t\n"
6870 " \t */",
6871 Tab));
6872 EXPECT_EQ("/* some\n"
6873 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00006874 format(" \t \t /* some\n"
6875 " \t \t comment */",
6876 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00006877 EXPECT_EQ("int a; /* some\n"
6878 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00006879 format(" \t \t int a; /* some\n"
6880 " \t \t comment */",
6881 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00006882
Alexander Kornienko39856b72013-09-10 09:38:25 +00006883 EXPECT_EQ("int a; /* some\n"
6884 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00006885 format(" \t \t int\ta; /* some\n"
6886 " \t \t comment */",
6887 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00006888 EXPECT_EQ("f(\"\t\t\"); /* some\n"
6889 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00006890 format(" \t \t f(\"\t\t\"); /* some\n"
6891 " \t \t comment */",
6892 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00006893 EXPECT_EQ("{\n"
6894 " /*\n"
6895 " * Comment\n"
6896 " */\n"
6897 " int i;\n"
6898 "}",
6899 format("{\n"
6900 "\t/*\n"
6901 "\t * Comment\n"
6902 "\t */\n"
6903 "\t int i;\n"
6904 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00006905
6906 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
6907 Tab.TabWidth = 8;
6908 Tab.IndentWidth = 8;
6909 EXPECT_EQ("if (aaaaaaaa && // q\n"
6910 " bb) // w\n"
6911 "\t;",
6912 format("if (aaaaaaaa &&// q\n"
6913 "bb)// w\n"
6914 ";",
6915 Tab));
6916 EXPECT_EQ("if (aaa && bbb) // w\n"
6917 "\t;",
6918 format("if(aaa&&bbb)// w\n"
6919 ";",
6920 Tab));
6921 verifyFormat("class X {\n"
6922 "\tvoid f() {\n"
6923 "\t\tsomeFunction(parameter1,\n"
6924 "\t\t\t parameter2);\n"
6925 "\t}\n"
6926 "};",
6927 Tab);
6928 verifyFormat("#define A \\\n"
6929 "\tvoid f() { \\\n"
6930 "\t\tsomeFunction( \\\n"
6931 "\t\t parameter1, \\\n"
6932 "\t\t parameter2); \\\n"
6933 "\t}",
6934 Tab);
6935 Tab.TabWidth = 4;
6936 Tab.IndentWidth = 8;
6937 verifyFormat("class TabWidth4Indent8 {\n"
6938 "\t\tvoid f() {\n"
6939 "\t\t\t\tsomeFunction(parameter1,\n"
6940 "\t\t\t\t\t\t\t parameter2);\n"
6941 "\t\t}\n"
6942 "};",
6943 Tab);
6944 Tab.TabWidth = 4;
6945 Tab.IndentWidth = 4;
6946 verifyFormat("class TabWidth4Indent4 {\n"
6947 "\tvoid f() {\n"
6948 "\t\tsomeFunction(parameter1,\n"
6949 "\t\t\t\t\t parameter2);\n"
6950 "\t}\n"
6951 "};",
6952 Tab);
6953 Tab.TabWidth = 8;
6954 Tab.IndentWidth = 4;
6955 verifyFormat("class TabWidth8Indent4 {\n"
6956 " void f() {\n"
6957 "\tsomeFunction(parameter1,\n"
6958 "\t\t parameter2);\n"
6959 " }\n"
6960 "};",
6961 Tab);
6962 Tab.TabWidth = 8;
6963 Tab.IndentWidth = 8;
6964 EXPECT_EQ("/*\n"
6965 "\t a\t\tcomment\n"
6966 "\t in multiple lines\n"
6967 " */",
6968 format(" /*\t \t \n"
6969 " \t \t a\t\tcomment\t \t\n"
6970 " \t \t in multiple lines\t\n"
6971 " \t */",
6972 Tab));
6973 verifyFormat("{\n"
6974 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6975 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6976 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6977 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6978 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6979 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6980 "};",
6981 Tab);
6982 verifyFormat("enum AA {\n"
6983 "\ta1, // Force multiple lines\n"
6984 "\ta2,\n"
6985 "\ta3\n"
6986 "};",
6987 Tab);
6988 EXPECT_EQ("if (aaaaaaaa && // q\n"
6989 " bb) // w\n"
6990 "\t;",
6991 format("if (aaaaaaaa &&// q\n"
6992 "bb)// w\n"
6993 ";",
6994 Tab));
6995 verifyFormat("class X {\n"
6996 "\tvoid f() {\n"
6997 "\t\tsomeFunction(parameter1,\n"
6998 "\t\t\t parameter2);\n"
6999 "\t}\n"
7000 "};",
7001 Tab);
7002 verifyFormat("{\n"
7003 "\tQ(\n"
7004 "\t {\n"
7005 "\t\t int a;\n"
7006 "\t\t someFunction(aaaaaaaa,\n"
7007 "\t\t\t\t bbbbbbb);\n"
7008 "\t },\n"
7009 "\t p);\n"
7010 "}",
7011 Tab);
7012 EXPECT_EQ("{\n"
7013 "\t/* aaaa\n"
7014 "\t bbbb */\n"
7015 "}",
7016 format("{\n"
7017 "/* aaaa\n"
7018 " bbbb */\n"
7019 "}",
7020 Tab));
7021 EXPECT_EQ("{\n"
7022 "\t/*\n"
7023 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7024 "\t bbbbbbbbbbbbb\n"
7025 "\t*/\n"
7026 "}",
7027 format("{\n"
7028 "/*\n"
7029 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7030 "*/\n"
7031 "}",
7032 Tab));
7033 EXPECT_EQ("{\n"
7034 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7035 "\t// bbbbbbbbbbbbb\n"
7036 "}",
7037 format("{\n"
7038 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7039 "}",
7040 Tab));
7041 EXPECT_EQ("{\n"
7042 "\t/*\n"
7043 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7044 "\t bbbbbbbbbbbbb\n"
7045 "\t*/\n"
7046 "}",
7047 format("{\n"
7048 "\t/*\n"
7049 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7050 "\t*/\n"
7051 "}",
7052 Tab));
7053 EXPECT_EQ("{\n"
7054 "\t/*\n"
7055 "\n"
7056 "\t*/\n"
7057 "}",
7058 format("{\n"
7059 "\t/*\n"
7060 "\n"
7061 "\t*/\n"
7062 "}",
7063 Tab));
7064 EXPECT_EQ("{\n"
7065 "\t/*\n"
7066 " asdf\n"
7067 "\t*/\n"
7068 "}",
7069 format("{\n"
7070 "\t/*\n"
7071 " asdf\n"
7072 "\t*/\n"
7073 "}",
7074 Tab));
7075 EXPECT_EQ("/*\n"
7076 "\t a\t\tcomment\n"
7077 "\t in multiple lines\n"
7078 " */",
7079 format(" /*\t \t \n"
7080 " \t \t a\t\tcomment\t \t\n"
7081 " \t \t in multiple lines\t\n"
7082 " \t */",
7083 Tab));
7084 EXPECT_EQ("/* some\n"
7085 " comment */",
7086 format(" \t \t /* some\n"
7087 " \t \t comment */",
7088 Tab));
7089 EXPECT_EQ("int a; /* some\n"
7090 " comment */",
7091 format(" \t \t int a; /* some\n"
7092 " \t \t comment */",
7093 Tab));
7094 EXPECT_EQ("int a; /* some\n"
7095 "comment */",
7096 format(" \t \t int\ta; /* some\n"
7097 " \t \t comment */",
7098 Tab));
7099 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7100 " comment */",
7101 format(" \t \t f(\"\t\t\"); /* some\n"
7102 " \t \t comment */",
7103 Tab));
7104 EXPECT_EQ("{\n"
7105 " /*\n"
7106 " * Comment\n"
7107 " */\n"
7108 " int i;\n"
7109 "}",
7110 format("{\n"
7111 "\t/*\n"
7112 "\t * Comment\n"
7113 "\t */\n"
7114 "\t int i;\n"
7115 "}"));
7116 Tab.AlignConsecutiveAssignments = true;
7117 Tab.AlignConsecutiveDeclarations = true;
7118 Tab.TabWidth = 4;
7119 Tab.IndentWidth = 4;
7120 verifyFormat("class Assign {\n"
7121 "\tvoid f() {\n"
7122 "\t\tint x = 123;\n"
7123 "\t\tint random = 4;\n"
7124 "\t\tstd::string alphabet =\n"
7125 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
7126 "\t}\n"
7127 "};",
7128 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007129}
7130
Alexander Kornienko917f9e02013-09-10 12:29:48 +00007131TEST_F(FormatTest, CalculatesOriginalColumn) {
7132 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7133 "q\"; /* some\n"
7134 " comment */",
7135 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7136 "q\"; /* some\n"
7137 " comment */",
7138 getLLVMStyle()));
7139 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7140 "/* some\n"
7141 " comment */",
7142 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7143 " /* some\n"
7144 " comment */",
7145 getLLVMStyle()));
7146 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7147 "qqq\n"
7148 "/* some\n"
7149 " comment */",
7150 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7151 "qqq\n"
7152 " /* some\n"
7153 " comment */",
7154 getLLVMStyle()));
7155 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7156 "wwww; /* some\n"
7157 " comment */",
7158 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7159 "wwww; /* some\n"
7160 " comment */",
7161 getLLVMStyle()));
7162}
7163
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007164TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00007165 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007166 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00007167
7168 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007169 " continue;",
7170 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007171 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007172 " continue;",
7173 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007174 verifyFormat("if(true)\n"
7175 " f();\n"
7176 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007177 " f();",
7178 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007179 verifyFormat("do {\n"
7180 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007181 "} while(something());",
7182 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007183 verifyFormat("switch(x) {\n"
7184 "default:\n"
7185 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007186 "}",
7187 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00007188 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00007189 verifyFormat("size_t x = sizeof(x);", NoSpace);
7190 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
7191 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
7192 verifyFormat("alignas(128) char a[128];", NoSpace);
7193 verifyFormat("size_t x = alignof(MyType);", NoSpace);
7194 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
7195 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007196 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007197 verifyFormat("T A::operator()();", NoSpace);
7198 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007199
7200 FormatStyle Space = getLLVMStyle();
7201 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
7202
7203 verifyFormat("int f ();", Space);
7204 verifyFormat("void f (int a, T b) {\n"
7205 " while (true)\n"
7206 " continue;\n"
7207 "}",
7208 Space);
7209 verifyFormat("if (true)\n"
7210 " f ();\n"
7211 "else if (true)\n"
7212 " f ();",
7213 Space);
7214 verifyFormat("do {\n"
7215 " do_something ();\n"
7216 "} while (something ());",
7217 Space);
7218 verifyFormat("switch (x) {\n"
7219 "default:\n"
7220 " break;\n"
7221 "}",
7222 Space);
7223 verifyFormat("A::A () : a (1) {}", Space);
7224 verifyFormat("void f () __attribute__ ((asdf));", Space);
7225 verifyFormat("*(&a + 1);\n"
7226 "&((&a)[1]);\n"
7227 "a[(b + c) * d];\n"
7228 "(((a + 1) * 2) + 3) * 4;",
7229 Space);
7230 verifyFormat("#define A(x) x", Space);
7231 verifyFormat("#define A (x) x", Space);
7232 verifyFormat("#if defined(x)\n"
7233 "#endif",
7234 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00007235 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00007236 verifyFormat("size_t x = sizeof (x);", Space);
7237 verifyFormat("auto f (int x) -> decltype (x);", Space);
7238 verifyFormat("int f (T x) noexcept (x.create ());", Space);
7239 verifyFormat("alignas (128) char a[128];", Space);
7240 verifyFormat("size_t x = alignof (MyType);", Space);
7241 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
7242 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007243 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007244 verifyFormat("T A::operator() ();", Space);
7245 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007246}
7247
7248TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
7249 FormatStyle Spaces = getLLVMStyle();
7250
7251 Spaces.SpacesInParentheses = true;
7252 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007253 verifyFormat("call();", Spaces);
7254 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00007255 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
7256 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007257 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007258 " continue;",
7259 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007260 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007261 " continue;",
7262 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007263 verifyFormat("if ( true )\n"
7264 " f();\n"
7265 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007266 " f();",
7267 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007268 verifyFormat("do {\n"
7269 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007270 "} while ( something() );",
7271 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007272 verifyFormat("switch ( x ) {\n"
7273 "default:\n"
7274 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007275 "}",
7276 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007277
7278 Spaces.SpacesInParentheses = false;
7279 Spaces.SpacesInCStyleCastParentheses = true;
7280 verifyFormat("Type *A = ( Type * )P;", Spaces);
7281 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
7282 verifyFormat("x = ( int32 )y;", Spaces);
7283 verifyFormat("int a = ( int )(2.0f);", Spaces);
7284 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
7285 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
7286 verifyFormat("#define x (( int )-1)", Spaces);
7287
Daniel Jasper92e09822015-03-18 12:59:19 +00007288 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00007289 Spaces.SpacesInParentheses = false;
7290 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00007291 Spaces.SpacesInCStyleCastParentheses = true;
7292 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007293 verifyFormat("call( );", Spaces);
7294 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007295 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007296 " continue;",
7297 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007298 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007299 " continue;",
7300 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007301 verifyFormat("if (true)\n"
7302 " f( );\n"
7303 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007304 " f( );",
7305 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007306 verifyFormat("do {\n"
7307 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007308 "} while (something( ));",
7309 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007310 verifyFormat("switch (x) {\n"
7311 "default:\n"
7312 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007313 "}",
7314 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007315
Daniel Jasper92e09822015-03-18 12:59:19 +00007316 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007317 Spaces.SpaceAfterCStyleCast = true;
7318 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007319 verifyFormat("call( );", Spaces);
7320 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007321 verifyFormat("while (( bool ) 1)\n"
7322 " continue;",
7323 Spaces);
7324 verifyFormat("for (;;)\n"
7325 " continue;",
7326 Spaces);
7327 verifyFormat("if (true)\n"
7328 " f( );\n"
7329 "else if (true)\n"
7330 " f( );",
7331 Spaces);
7332 verifyFormat("do {\n"
7333 " do_something(( int ) i);\n"
7334 "} while (something( ));",
7335 Spaces);
7336 verifyFormat("switch (x) {\n"
7337 "default:\n"
7338 " break;\n"
7339 "}",
7340 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007341
7342 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007343 Spaces.SpacesInCStyleCastParentheses = false;
7344 Spaces.SpaceAfterCStyleCast = true;
7345 verifyFormat("while ((bool) 1)\n"
7346 " continue;",
7347 Spaces);
7348 verifyFormat("do {\n"
7349 " do_something((int) i);\n"
7350 "} while (something( ));",
7351 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007352}
7353
Daniel Jasperad981f82014-08-26 11:41:14 +00007354TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
7355 verifyFormat("int a[5];");
7356 verifyFormat("a[3] += 42;");
7357
7358 FormatStyle Spaces = getLLVMStyle();
7359 Spaces.SpacesInSquareBrackets = true;
7360 // Lambdas unchanged.
7361 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
7362 verifyFormat("return [i, args...] {};", Spaces);
7363
7364 // Not lambdas.
7365 verifyFormat("int a[ 5 ];", Spaces);
7366 verifyFormat("a[ 3 ] += 42;", Spaces);
7367 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
7368 verifyFormat("double &operator[](int i) { return 0; }\n"
7369 "int i;",
7370 Spaces);
7371 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
7372 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
7373 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
7374}
7375
Daniel Jasperd94bff32013-09-25 15:15:02 +00007376TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
7377 verifyFormat("int a = 5;");
7378 verifyFormat("a += 42;");
7379 verifyFormat("a or_eq 8;");
7380
7381 FormatStyle Spaces = getLLVMStyle();
7382 Spaces.SpaceBeforeAssignmentOperators = false;
7383 verifyFormat("int a= 5;", Spaces);
7384 verifyFormat("a+= 42;", Spaces);
7385 verifyFormat("a or_eq 8;", Spaces);
7386}
7387
Daniel Jaspera44991332015-04-29 13:06:49 +00007388TEST_F(FormatTest, AlignConsecutiveAssignments) {
7389 FormatStyle Alignment = getLLVMStyle();
7390 Alignment.AlignConsecutiveAssignments = false;
7391 verifyFormat("int a = 5;\n"
7392 "int oneTwoThree = 123;",
7393 Alignment);
7394 verifyFormat("int a = 5;\n"
7395 "int oneTwoThree = 123;",
7396 Alignment);
7397
7398 Alignment.AlignConsecutiveAssignments = true;
7399 verifyFormat("int a = 5;\n"
7400 "int oneTwoThree = 123;",
7401 Alignment);
7402 verifyFormat("int a = method();\n"
7403 "int oneTwoThree = 133;",
7404 Alignment);
7405 verifyFormat("a &= 5;\n"
7406 "bcd *= 5;\n"
7407 "ghtyf += 5;\n"
7408 "dvfvdb -= 5;\n"
7409 "a /= 5;\n"
7410 "vdsvsv %= 5;\n"
7411 "sfdbddfbdfbb ^= 5;\n"
7412 "dvsdsv |= 5;\n"
7413 "int dsvvdvsdvvv = 123;",
7414 Alignment);
7415 verifyFormat("int i = 1, j = 10;\n"
7416 "something = 2000;",
7417 Alignment);
7418 verifyFormat("something = 2000;\n"
7419 "int i = 1, j = 10;\n",
7420 Alignment);
7421 verifyFormat("something = 2000;\n"
7422 "another = 911;\n"
7423 "int i = 1, j = 10;\n"
7424 "oneMore = 1;\n"
7425 "i = 2;",
7426 Alignment);
7427 verifyFormat("int a = 5;\n"
7428 "int one = 1;\n"
7429 "method();\n"
7430 "int oneTwoThree = 123;\n"
7431 "int oneTwo = 12;",
7432 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00007433 verifyFormat("int oneTwoThree = 123;\n"
7434 "int oneTwo = 12;\n"
7435 "method();\n",
7436 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00007437 verifyFormat("int oneTwoThree = 123; // comment\n"
7438 "int oneTwo = 12; // comment",
7439 Alignment);
7440 EXPECT_EQ("int a = 5;\n"
7441 "\n"
7442 "int oneTwoThree = 123;",
7443 format("int a = 5;\n"
7444 "\n"
7445 "int oneTwoThree= 123;",
7446 Alignment));
7447 EXPECT_EQ("int a = 5;\n"
7448 "int one = 1;\n"
7449 "\n"
7450 "int oneTwoThree = 123;",
7451 format("int a = 5;\n"
7452 "int one = 1;\n"
7453 "\n"
7454 "int oneTwoThree = 123;",
7455 Alignment));
7456 EXPECT_EQ("int a = 5;\n"
7457 "int one = 1;\n"
7458 "\n"
7459 "int oneTwoThree = 123;\n"
7460 "int oneTwo = 12;",
7461 format("int a = 5;\n"
7462 "int one = 1;\n"
7463 "\n"
7464 "int oneTwoThree = 123;\n"
7465 "int oneTwo = 12;",
7466 Alignment));
7467 Alignment.AlignEscapedNewlinesLeft = true;
7468 verifyFormat("#define A \\\n"
7469 " int aaaa = 12; \\\n"
7470 " int b = 23; \\\n"
7471 " int ccc = 234; \\\n"
7472 " int dddddddddd = 2345;",
7473 Alignment);
7474 Alignment.AlignEscapedNewlinesLeft = false;
7475 verifyFormat("#define A "
7476 " \\\n"
7477 " int aaaa = 12; "
7478 " \\\n"
7479 " int b = 23; "
7480 " \\\n"
7481 " int ccc = 234; "
7482 " \\\n"
7483 " int dddddddddd = 2345;",
7484 Alignment);
7485 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
7486 "k = 4, int l = 5,\n"
7487 " int m = 6) {\n"
7488 " int j = 10;\n"
7489 " otherThing = 1;\n"
7490 "}",
7491 Alignment);
7492 verifyFormat("void SomeFunction(int parameter = 0) {\n"
7493 " int i = 1;\n"
7494 " int j = 2;\n"
7495 " int big = 10000;\n"
7496 "}",
7497 Alignment);
7498 verifyFormat("class C {\n"
7499 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00007500 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007501 " virtual void f() = 0;\n"
7502 "};",
7503 Alignment);
7504 verifyFormat("int i = 1;\n"
7505 "if (SomeType t = getSomething()) {\n"
7506 "}\n"
7507 "int j = 2;\n"
7508 "int big = 10000;",
7509 Alignment);
7510 verifyFormat("int j = 7;\n"
7511 "for (int k = 0; k < N; ++k) {\n"
7512 "}\n"
7513 "int j = 2;\n"
7514 "int big = 10000;\n"
7515 "}",
7516 Alignment);
7517 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7518 verifyFormat("int i = 1;\n"
7519 "LooooooooooongType loooooooooooooooooooooongVariable\n"
7520 " = someLooooooooooooooooongFunction();\n"
7521 "int j = 2;",
7522 Alignment);
7523 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7524 verifyFormat("int i = 1;\n"
7525 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
7526 " someLooooooooooooooooongFunction();\n"
7527 "int j = 2;",
7528 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00007529
7530 verifyFormat("auto lambda = []() {\n"
7531 " auto i = 0;\n"
7532 " return 0;\n"
7533 "};\n"
7534 "int i = 0;\n"
7535 "auto v = type{\n"
7536 " i = 1, //\n"
7537 " (i = 2), //\n"
7538 " i = 3 //\n"
7539 "};",
7540 Alignment);
7541
Daniel Jaspera44991332015-04-29 13:06:49 +00007542 // FIXME: Should align all three assignments
7543 verifyFormat(
7544 "int i = 1;\n"
7545 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
7546 " loooooooooooooooooooooongParameterB);\n"
7547 "int j = 2;",
7548 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00007549
7550 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
7551 " typename B = very_long_type_name_1,\n"
7552 " typename T_2 = very_long_type_name_2>\n"
7553 "auto foo() {}\n",
7554 Alignment);
7555 verifyFormat("int a, b = 1;\n"
7556 "int c = 2;\n"
7557 "int dd = 3;\n",
7558 Alignment);
7559 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
7560 "float b[1][] = {{3.f}};\n",
7561 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00007562}
7563
Daniel Jaspere12597c2015-10-01 10:06:54 +00007564TEST_F(FormatTest, AlignConsecutiveDeclarations) {
7565 FormatStyle Alignment = getLLVMStyle();
7566 Alignment.AlignConsecutiveDeclarations = false;
7567 verifyFormat("float const a = 5;\n"
7568 "int oneTwoThree = 123;",
7569 Alignment);
7570 verifyFormat("int a = 5;\n"
7571 "float const oneTwoThree = 123;",
7572 Alignment);
7573
7574 Alignment.AlignConsecutiveDeclarations = true;
7575 verifyFormat("float const a = 5;\n"
7576 "int oneTwoThree = 123;",
7577 Alignment);
7578 verifyFormat("int a = method();\n"
7579 "float const oneTwoThree = 133;",
7580 Alignment);
7581 verifyFormat("int i = 1, j = 10;\n"
7582 "something = 2000;",
7583 Alignment);
7584 verifyFormat("something = 2000;\n"
7585 "int i = 1, j = 10;\n",
7586 Alignment);
7587 verifyFormat("float something = 2000;\n"
7588 "double another = 911;\n"
7589 "int i = 1, j = 10;\n"
7590 "const int *oneMore = 1;\n"
7591 "unsigned i = 2;",
7592 Alignment);
7593 verifyFormat("float a = 5;\n"
7594 "int one = 1;\n"
7595 "method();\n"
7596 "const double oneTwoThree = 123;\n"
7597 "const unsigned int oneTwo = 12;",
7598 Alignment);
7599 verifyFormat("int oneTwoThree{0}; // comment\n"
7600 "unsigned oneTwo; // comment",
7601 Alignment);
7602 EXPECT_EQ("float const a = 5;\n"
7603 "\n"
7604 "int oneTwoThree = 123;",
7605 format("float const a = 5;\n"
7606 "\n"
7607 "int oneTwoThree= 123;",
7608 Alignment));
7609 EXPECT_EQ("float a = 5;\n"
7610 "int one = 1;\n"
7611 "\n"
7612 "unsigned oneTwoThree = 123;",
7613 format("float a = 5;\n"
7614 "int one = 1;\n"
7615 "\n"
7616 "unsigned oneTwoThree = 123;",
7617 Alignment));
7618 EXPECT_EQ("float a = 5;\n"
7619 "int one = 1;\n"
7620 "\n"
7621 "unsigned oneTwoThree = 123;\n"
7622 "int oneTwo = 12;",
7623 format("float a = 5;\n"
7624 "int one = 1;\n"
7625 "\n"
7626 "unsigned oneTwoThree = 123;\n"
7627 "int oneTwo = 12;",
7628 Alignment));
7629 Alignment.AlignConsecutiveAssignments = true;
7630 verifyFormat("float something = 2000;\n"
7631 "double another = 911;\n"
7632 "int i = 1, j = 10;\n"
7633 "const int *oneMore = 1;\n"
7634 "unsigned i = 2;",
7635 Alignment);
7636 verifyFormat("int oneTwoThree = {0}; // comment\n"
7637 "unsigned oneTwo = 0; // comment",
7638 Alignment);
7639 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
7640 " int const i = 1;\n"
7641 " int * j = 2;\n"
7642 " int big = 10000;\n"
7643 "\n"
7644 " unsigned oneTwoThree = 123;\n"
7645 " int oneTwo = 12;\n"
7646 " method();\n"
7647 " float k = 2;\n"
7648 " int ll = 10000;\n"
7649 "}",
7650 format("void SomeFunction(int parameter= 0) {\n"
7651 " int const i= 1;\n"
7652 " int *j=2;\n"
7653 " int big = 10000;\n"
7654 "\n"
7655 "unsigned oneTwoThree =123;\n"
7656 "int oneTwo = 12;\n"
7657 " method();\n"
7658 "float k= 2;\n"
7659 "int ll=10000;\n"
7660 "}",
7661 Alignment));
7662 Alignment.AlignConsecutiveAssignments = false;
7663 Alignment.AlignEscapedNewlinesLeft = true;
7664 verifyFormat("#define A \\\n"
7665 " int aaaa = 12; \\\n"
7666 " float b = 23; \\\n"
7667 " const int ccc = 234; \\\n"
7668 " unsigned dddddddddd = 2345;",
7669 Alignment);
7670 Alignment.AlignEscapedNewlinesLeft = false;
7671 Alignment.ColumnLimit = 30;
7672 verifyFormat("#define A \\\n"
7673 " int aaaa = 12; \\\n"
7674 " float b = 23; \\\n"
7675 " const int ccc = 234; \\\n"
7676 " int dddddddddd = 2345;",
7677 Alignment);
7678 Alignment.ColumnLimit = 80;
7679 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
7680 "k = 4, int l = 5,\n"
7681 " int m = 6) {\n"
7682 " const int j = 10;\n"
7683 " otherThing = 1;\n"
7684 "}",
7685 Alignment);
7686 verifyFormat("void SomeFunction(int parameter = 0) {\n"
7687 " int const i = 1;\n"
7688 " int * j = 2;\n"
7689 " int big = 10000;\n"
7690 "}",
7691 Alignment);
7692 verifyFormat("class C {\n"
7693 "public:\n"
7694 " int i = 1;\n"
7695 " virtual void f() = 0;\n"
7696 "};",
7697 Alignment);
7698 verifyFormat("float i = 1;\n"
7699 "if (SomeType t = getSomething()) {\n"
7700 "}\n"
7701 "const unsigned j = 2;\n"
7702 "int big = 10000;",
7703 Alignment);
7704 verifyFormat("float j = 7;\n"
7705 "for (int k = 0; k < N; ++k) {\n"
7706 "}\n"
7707 "unsigned j = 2;\n"
7708 "int big = 10000;\n"
7709 "}",
7710 Alignment);
7711 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7712 verifyFormat("float i = 1;\n"
7713 "LooooooooooongType loooooooooooooooooooooongVariable\n"
7714 " = someLooooooooooooooooongFunction();\n"
7715 "int j = 2;",
7716 Alignment);
7717 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7718 verifyFormat("int i = 1;\n"
7719 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
7720 " someLooooooooooooooooongFunction();\n"
7721 "int j = 2;",
7722 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00007723
7724 Alignment.AlignConsecutiveAssignments = true;
7725 verifyFormat("auto lambda = []() {\n"
7726 " auto ii = 0;\n"
7727 " float j = 0;\n"
7728 " return 0;\n"
7729 "};\n"
7730 "int i = 0;\n"
7731 "float i2 = 0;\n"
7732 "auto v = type{\n"
7733 " i = 1, //\n"
7734 " (i = 2), //\n"
7735 " i = 3 //\n"
7736 "};",
7737 Alignment);
7738 Alignment.AlignConsecutiveAssignments = false;
7739
Daniel Jaspere12597c2015-10-01 10:06:54 +00007740 // FIXME: Should align all three declarations
7741 verifyFormat(
7742 "int i = 1;\n"
7743 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
7744 " loooooooooooooooooooooongParameterB);\n"
7745 "int j = 2;",
7746 Alignment);
7747
7748 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
7749 // We expect declarations and assignments to align, as long as it doesn't
7750 // exceed the column limit, starting a new alignemnt sequence whenever it
7751 // happens.
7752 Alignment.AlignConsecutiveAssignments = true;
7753 Alignment.ColumnLimit = 30;
7754 verifyFormat("float ii = 1;\n"
7755 "unsigned j = 2;\n"
7756 "int someVerylongVariable = 1;\n"
7757 "AnotherLongType ll = 123456;\n"
7758 "VeryVeryLongType k = 2;\n"
7759 "int myvar = 1;",
7760 Alignment);
7761 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00007762 Alignment.AlignConsecutiveAssignments = false;
7763
7764 verifyFormat(
7765 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
7766 " typename LongType, typename B>\n"
7767 "auto foo() {}\n",
7768 Alignment);
7769 verifyFormat("float a, b = 1;\n"
7770 "int c = 2;\n"
7771 "int dd = 3;\n",
7772 Alignment);
7773 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
7774 "float b[1][] = {{3.f}};\n",
7775 Alignment);
7776 Alignment.AlignConsecutiveAssignments = true;
7777 verifyFormat("float a, b = 1;\n"
7778 "int c = 2;\n"
7779 "int dd = 3;\n",
7780 Alignment);
7781 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
7782 "float b[1][] = {{3.f}};\n",
7783 Alignment);
7784 Alignment.AlignConsecutiveAssignments = false;
7785
7786 Alignment.ColumnLimit = 30;
7787 Alignment.BinPackParameters = false;
7788 verifyFormat("void foo(float a,\n"
7789 " float b,\n"
7790 " int c,\n"
7791 " uint32_t *d) {\n"
7792 " int * e = 0;\n"
7793 " float f = 0;\n"
7794 " double g = 0;\n"
7795 "}\n"
7796 "void bar(ino_t a,\n"
7797 " int b,\n"
7798 " uint32_t *c,\n"
7799 " bool d) {}\n",
7800 Alignment);
7801 Alignment.BinPackParameters = true;
7802 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00007803}
7804
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007805TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007806 FormatStyle LinuxBraceStyle = getLLVMStyle();
7807 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007808 verifyFormat("namespace a\n"
7809 "{\n"
7810 "class A\n"
7811 "{\n"
7812 " void f()\n"
7813 " {\n"
7814 " if (true) {\n"
7815 " a();\n"
7816 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00007817 " } else {\n"
7818 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007819 " }\n"
7820 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007821 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007822 "};\n"
7823 "struct B {\n"
7824 " int x;\n"
7825 "};\n"
7826 "}\n",
7827 LinuxBraceStyle);
7828 verifyFormat("enum X {\n"
7829 " Y = 0,\n"
7830 "}\n",
7831 LinuxBraceStyle);
7832 verifyFormat("struct S {\n"
7833 " int Type;\n"
7834 " union {\n"
7835 " int x;\n"
7836 " double y;\n"
7837 " } Value;\n"
7838 " class C\n"
7839 " {\n"
7840 " MyFavoriteType Value;\n"
7841 " } Class;\n"
7842 "}\n",
7843 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007844}
7845
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00007846TEST_F(FormatTest, MozillaBraceBreaking) {
7847 FormatStyle MozillaBraceStyle = getLLVMStyle();
7848 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
7849 verifyFormat("namespace a {\n"
7850 "class A\n"
7851 "{\n"
7852 " void f()\n"
7853 " {\n"
7854 " if (true) {\n"
7855 " a();\n"
7856 " b();\n"
7857 " }\n"
7858 " }\n"
7859 " void g() { return; }\n"
7860 "};\n"
7861 "enum E\n"
7862 "{\n"
7863 " A,\n"
7864 " // foo\n"
7865 " B,\n"
7866 " C\n"
7867 "};\n"
7868 "struct B\n"
7869 "{\n"
7870 " int x;\n"
7871 "};\n"
7872 "}\n",
7873 MozillaBraceStyle);
7874 verifyFormat("struct S\n"
7875 "{\n"
7876 " int Type;\n"
7877 " union\n"
7878 " {\n"
7879 " int x;\n"
7880 " double y;\n"
7881 " } Value;\n"
7882 " class C\n"
7883 " {\n"
7884 " MyFavoriteType Value;\n"
7885 " } Class;\n"
7886 "}\n",
7887 MozillaBraceStyle);
7888}
7889
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007890TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007891 FormatStyle StroustrupBraceStyle = getLLVMStyle();
7892 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007893 verifyFormat("namespace a {\n"
7894 "class A {\n"
7895 " void f()\n"
7896 " {\n"
7897 " if (true) {\n"
7898 " a();\n"
7899 " b();\n"
7900 " }\n"
7901 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007902 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007903 "};\n"
7904 "struct B {\n"
7905 " int x;\n"
7906 "};\n"
7907 "}\n",
7908 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00007909
Daniel Jasperd9670872014-08-05 12:06:20 +00007910 verifyFormat("void foo()\n"
7911 "{\n"
7912 " if (a) {\n"
7913 " a();\n"
7914 " }\n"
7915 " else {\n"
7916 " b();\n"
7917 " }\n"
7918 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007919 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00007920
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00007921 verifyFormat("#ifdef _DEBUG\n"
7922 "int foo(int i = 0)\n"
7923 "#else\n"
7924 "int foo(int i = 5)\n"
7925 "#endif\n"
7926 "{\n"
7927 " return i;\n"
7928 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007929 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00007930
7931 verifyFormat("void foo() {}\n"
7932 "void bar()\n"
7933 "#ifdef _DEBUG\n"
7934 "{\n"
7935 " foo();\n"
7936 "}\n"
7937 "#else\n"
7938 "{\n"
7939 "}\n"
7940 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007941 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00007942
7943 verifyFormat("void foobar() { int i = 5; }\n"
7944 "#ifdef _DEBUG\n"
7945 "void bar() {}\n"
7946 "#else\n"
7947 "void bar() { foobar(); }\n"
7948 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007949 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007950}
7951
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00007952TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007953 FormatStyle AllmanBraceStyle = getLLVMStyle();
7954 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00007955 verifyFormat("namespace a\n"
7956 "{\n"
7957 "class A\n"
7958 "{\n"
7959 " void f()\n"
7960 " {\n"
7961 " if (true)\n"
7962 " {\n"
7963 " a();\n"
7964 " b();\n"
7965 " }\n"
7966 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007967 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007968 "};\n"
7969 "struct B\n"
7970 "{\n"
7971 " int x;\n"
7972 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00007973 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007974 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00007975
7976 verifyFormat("void f()\n"
7977 "{\n"
7978 " if (true)\n"
7979 " {\n"
7980 " a();\n"
7981 " }\n"
7982 " else if (false)\n"
7983 " {\n"
7984 " b();\n"
7985 " }\n"
7986 " else\n"
7987 " {\n"
7988 " c();\n"
7989 " }\n"
7990 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007991 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00007992
7993 verifyFormat("void f()\n"
7994 "{\n"
7995 " for (int i = 0; i < 10; ++i)\n"
7996 " {\n"
7997 " a();\n"
7998 " }\n"
7999 " while (false)\n"
8000 " {\n"
8001 " b();\n"
8002 " }\n"
8003 " do\n"
8004 " {\n"
8005 " c();\n"
8006 " } while (false)\n"
8007 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008008 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008009
8010 verifyFormat("void f(int a)\n"
8011 "{\n"
8012 " switch (a)\n"
8013 " {\n"
8014 " case 0:\n"
8015 " break;\n"
8016 " case 1:\n"
8017 " {\n"
8018 " break;\n"
8019 " }\n"
8020 " case 2:\n"
8021 " {\n"
8022 " }\n"
8023 " break;\n"
8024 " default:\n"
8025 " break;\n"
8026 " }\n"
8027 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008028 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008029
8030 verifyFormat("enum X\n"
8031 "{\n"
8032 " Y = 0,\n"
8033 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008034 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00008035 verifyFormat("enum X\n"
8036 "{\n"
8037 " Y = 0\n"
8038 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008039 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008040
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008041 verifyFormat("@interface BSApplicationController ()\n"
8042 "{\n"
8043 "@private\n"
8044 " id _extraIvar;\n"
8045 "}\n"
8046 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008047 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008048
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008049 verifyFormat("#ifdef _DEBUG\n"
8050 "int foo(int i = 0)\n"
8051 "#else\n"
8052 "int foo(int i = 5)\n"
8053 "#endif\n"
8054 "{\n"
8055 " return i;\n"
8056 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008057 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008058
8059 verifyFormat("void foo() {}\n"
8060 "void bar()\n"
8061 "#ifdef _DEBUG\n"
8062 "{\n"
8063 " foo();\n"
8064 "}\n"
8065 "#else\n"
8066 "{\n"
8067 "}\n"
8068 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008069 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008070
8071 verifyFormat("void foobar() { int i = 5; }\n"
8072 "#ifdef _DEBUG\n"
8073 "void bar() {}\n"
8074 "#else\n"
8075 "void bar() { foobar(); }\n"
8076 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008077 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008078
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008079 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008080 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008081 " // ...\n"
8082 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008083 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008084 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008085 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008086 " // ...\n"
8087 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008088 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008089 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008090 // .. or dict literals.
8091 verifyFormat("void f()\n"
8092 "{\n"
8093 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
8094 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008095 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00008096 verifyFormat("int f()\n"
8097 "{ // comment\n"
8098 " return 42;\n"
8099 "}",
8100 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008101
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008102 AllmanBraceStyle.ColumnLimit = 19;
8103 verifyFormat("void f() { int i; }", AllmanBraceStyle);
8104 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00008105 verifyFormat("void f()\n"
8106 "{\n"
8107 " int i;\n"
8108 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008109 AllmanBraceStyle);
8110 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00008111
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008112 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00008113 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
8114 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
8115 verifyFormat("void f(bool b)\n"
8116 "{\n"
8117 " if (b)\n"
8118 " {\n"
8119 " return;\n"
8120 " }\n"
8121 "}\n",
8122 BreakBeforeBraceShortIfs);
8123 verifyFormat("void f(bool b)\n"
8124 "{\n"
8125 " if (b) return;\n"
8126 "}\n",
8127 BreakBeforeBraceShortIfs);
8128 verifyFormat("void f(bool b)\n"
8129 "{\n"
8130 " while (b)\n"
8131 " {\n"
8132 " return;\n"
8133 " }\n"
8134 "}\n",
8135 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008136}
8137
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008138TEST_F(FormatTest, GNUBraceBreaking) {
8139 FormatStyle GNUBraceStyle = getLLVMStyle();
8140 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
8141 verifyFormat("namespace a\n"
8142 "{\n"
8143 "class A\n"
8144 "{\n"
8145 " void f()\n"
8146 " {\n"
8147 " int a;\n"
8148 " {\n"
8149 " int b;\n"
8150 " }\n"
8151 " if (true)\n"
8152 " {\n"
8153 " a();\n"
8154 " b();\n"
8155 " }\n"
8156 " }\n"
8157 " void g() { return; }\n"
8158 "}\n"
8159 "}",
8160 GNUBraceStyle);
8161
8162 verifyFormat("void f()\n"
8163 "{\n"
8164 " if (true)\n"
8165 " {\n"
8166 " a();\n"
8167 " }\n"
8168 " else if (false)\n"
8169 " {\n"
8170 " b();\n"
8171 " }\n"
8172 " else\n"
8173 " {\n"
8174 " c();\n"
8175 " }\n"
8176 "}\n",
8177 GNUBraceStyle);
8178
8179 verifyFormat("void f()\n"
8180 "{\n"
8181 " for (int i = 0; i < 10; ++i)\n"
8182 " {\n"
8183 " a();\n"
8184 " }\n"
8185 " while (false)\n"
8186 " {\n"
8187 " b();\n"
8188 " }\n"
8189 " do\n"
8190 " {\n"
8191 " c();\n"
8192 " }\n"
8193 " while (false);\n"
8194 "}\n",
8195 GNUBraceStyle);
8196
8197 verifyFormat("void f(int a)\n"
8198 "{\n"
8199 " switch (a)\n"
8200 " {\n"
8201 " case 0:\n"
8202 " break;\n"
8203 " case 1:\n"
8204 " {\n"
8205 " break;\n"
8206 " }\n"
8207 " case 2:\n"
8208 " {\n"
8209 " }\n"
8210 " break;\n"
8211 " default:\n"
8212 " break;\n"
8213 " }\n"
8214 "}\n",
8215 GNUBraceStyle);
8216
8217 verifyFormat("enum X\n"
8218 "{\n"
8219 " Y = 0,\n"
8220 "}\n",
8221 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008222
8223 verifyFormat("@interface BSApplicationController ()\n"
8224 "{\n"
8225 "@private\n"
8226 " id _extraIvar;\n"
8227 "}\n"
8228 "@end\n",
8229 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008230
8231 verifyFormat("#ifdef _DEBUG\n"
8232 "int foo(int i = 0)\n"
8233 "#else\n"
8234 "int foo(int i = 5)\n"
8235 "#endif\n"
8236 "{\n"
8237 " return i;\n"
8238 "}",
8239 GNUBraceStyle);
8240
8241 verifyFormat("void foo() {}\n"
8242 "void bar()\n"
8243 "#ifdef _DEBUG\n"
8244 "{\n"
8245 " foo();\n"
8246 "}\n"
8247 "#else\n"
8248 "{\n"
8249 "}\n"
8250 "#endif",
8251 GNUBraceStyle);
8252
8253 verifyFormat("void foobar() { int i = 5; }\n"
8254 "#ifdef _DEBUG\n"
8255 "void bar() {}\n"
8256 "#else\n"
8257 "void bar() { foobar(); }\n"
8258 "#endif",
8259 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008260}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00008261
8262TEST_F(FormatTest, WebKitBraceBreaking) {
8263 FormatStyle WebKitBraceStyle = getLLVMStyle();
8264 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
8265 verifyFormat("namespace a {\n"
8266 "class A {\n"
8267 " void f()\n"
8268 " {\n"
8269 " if (true) {\n"
8270 " a();\n"
8271 " b();\n"
8272 " }\n"
8273 " }\n"
8274 " void g() { return; }\n"
8275 "};\n"
8276 "enum E {\n"
8277 " A,\n"
8278 " // foo\n"
8279 " B,\n"
8280 " C\n"
8281 "};\n"
8282 "struct B {\n"
8283 " int x;\n"
8284 "};\n"
8285 "}\n",
8286 WebKitBraceStyle);
8287 verifyFormat("struct S {\n"
8288 " int Type;\n"
8289 " union {\n"
8290 " int x;\n"
8291 " double y;\n"
8292 " } Value;\n"
8293 " class C {\n"
8294 " MyFavoriteType Value;\n"
8295 " } Class;\n"
8296 "};\n",
8297 WebKitBraceStyle);
8298}
8299
Manuel Klimekd5735502013-08-12 03:51:17 +00008300TEST_F(FormatTest, CatchExceptionReferenceBinding) {
8301 verifyFormat("void f() {\n"
8302 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00008303 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00008304 " }\n"
8305 "}\n",
8306 getLLVMStyle());
8307}
8308
Daniel Jasper9613c812013-08-07 16:29:23 +00008309TEST_F(FormatTest, UnderstandsPragmas) {
8310 verifyFormat("#pragma omp reduction(| : var)");
8311 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00008312
8313 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
8314 "(including parentheses).",
8315 format("#pragma mark Any non-hyphenated or hyphenated string "
8316 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00008317}
8318
Daniel Jasperee4a8a12015-04-22 09:45:42 +00008319TEST_F(FormatTest, UnderstandPragmaOption) {
8320 verifyFormat("#pragma option -C -A");
8321
8322 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
8323}
8324
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008325#define EXPECT_ALL_STYLES_EQUAL(Styles) \
8326 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +00008327 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
8328 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +00008329
8330TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008331 SmallVector<FormatStyle, 3> Styles;
8332 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008333
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008334 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008335 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
8336 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
8337 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008338
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008339 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008340 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
8341 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
8342 EXPECT_ALL_STYLES_EQUAL(Styles);
8343
Nico Weber514ecc82014-02-02 20:50:45 +00008344 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008345 EXPECT_TRUE(
8346 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
8347 EXPECT_TRUE(
8348 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
8349 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008350
Nico Weber514ecc82014-02-02 20:50:45 +00008351 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008352 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
8353 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
8354 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008355
8356 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008357 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
8358 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
8359 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008360
Daniel Jasperffefb3d2013-07-24 13:10:59 +00008361 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008362 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
8363 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
8364 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00008365
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +00008366 Styles[0] = getGNUStyle();
8367 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
8368 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
8369 EXPECT_ALL_STYLES_EQUAL(Styles);
8370
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008371 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
8372}
8373
8374TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
8375 SmallVector<FormatStyle, 8> Styles;
8376 Styles.resize(2);
8377
8378 Styles[0] = getGoogleStyle();
8379 Styles[1] = getLLVMStyle();
8380 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
8381 EXPECT_ALL_STYLES_EQUAL(Styles);
8382
8383 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +00008384 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008385 Styles[1] = getLLVMStyle();
8386 Styles[1].Language = FormatStyle::LK_JavaScript;
8387 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
8388
8389 Styles[2] = getLLVMStyle();
8390 Styles[2].Language = FormatStyle::LK_JavaScript;
8391 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
8392 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008393 &Styles[2])
8394 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008395
8396 Styles[3] = getLLVMStyle();
8397 Styles[3].Language = FormatStyle::LK_JavaScript;
8398 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
8399 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008400 &Styles[3])
8401 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008402
8403 Styles[4] = getLLVMStyle();
8404 Styles[4].Language = FormatStyle::LK_JavaScript;
8405 EXPECT_EQ(0, parseConfiguration("---\n"
8406 "BasedOnStyle: LLVM\n"
8407 "IndentWidth: 123\n"
8408 "---\n"
8409 "BasedOnStyle: Google\n"
8410 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008411 &Styles[4])
8412 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008413 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008414}
8415
Daniel Jasper91881d92014-09-29 08:07:46 +00008416#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +00008417 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +00008418 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008419 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +00008420 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +00008421 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008422
Daniel Jasper91881d92014-09-29 08:07:46 +00008423#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
8424
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008425#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
8426 Style.STRUCT.FIELD = false; \
8427 EXPECT_EQ(0, \
8428 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
8429 .value()); \
8430 EXPECT_TRUE(Style.STRUCT.FIELD); \
8431 EXPECT_EQ(0, \
8432 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
8433 .value()); \
8434 EXPECT_FALSE(Style.STRUCT.FIELD);
8435
8436#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
8437 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
8438
Daniel Jasper00853002014-09-16 16:22:30 +00008439#define CHECK_PARSE(TEXT, FIELD, VALUE) \
8440 EXPECT_NE(VALUE, Style.FIELD); \
8441 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
8442 EXPECT_EQ(VALUE, Style.FIELD)
8443
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008444TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008445 FormatStyle Style = {};
8446 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00008447 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +00008448 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +00008449 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +00008450 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008451 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008452 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +00008453 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +00008454 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008455 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +00008456 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00008457 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +00008458 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00008459 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008460 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +00008461 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00008462 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008463 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008464 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +00008465 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +00008466 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +00008467 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008468 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00008469 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +00008470 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +00008471 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008472 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +00008473 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +00008474 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +00008475 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008476 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +00008477 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00008478 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008479 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +00008480 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008481 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008482 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00008483 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +00008484 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008485
8486 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
8487 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
8488 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
8489 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
8490 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
8491 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
8492 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
8493 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
8494 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
8495 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
8496 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008497}
Alexander Kornienkod6538332013-05-07 15:32:14 +00008498
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008499#undef CHECK_PARSE_BOOL
8500
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008501TEST_F(FormatTest, ParsesConfiguration) {
8502 FormatStyle Style = {};
8503 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00008504 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00008505 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
8506 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +00008507 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008508 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
8509 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +00008510 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
8511 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008512 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
8513 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
8514 PenaltyReturnTypeOnItsOwnLine, 1234u);
8515 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
8516 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +00008517 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +00008518 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00008519 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +00008520
Daniel Jasper553d4872014-06-17 12:40:34 +00008521 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +00008522 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
8523 FormatStyle::PAS_Left);
8524 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
8525 FormatStyle::PAS_Right);
8526 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
8527 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +00008528 // For backward compatibility:
8529 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
8530 FormatStyle::PAS_Left);
8531 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
8532 FormatStyle::PAS_Right);
8533 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
8534 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +00008535
Alexander Kornienkod6538332013-05-07 15:32:14 +00008536 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +00008537 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
8538 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008539 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
8540 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
8541 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
8542
Daniel Jasperac043c92014-09-15 11:11:00 +00008543 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +00008544 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
8545 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +00008546 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
8547 FormatStyle::BOS_None);
8548 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
8549 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00008550 // For backward compatibility:
8551 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
8552 FormatStyle::BOS_None);
8553 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
8554 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +00008555
Daniel Jasper6501f7e2015-10-27 12:38:37 +00008556 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8557 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
8558 FormatStyle::BAS_Align);
8559 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
8560 FormatStyle::BAS_DontAlign);
8561 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
8562 FormatStyle::BAS_AlwaysBreak);
8563 // For backward compatibility:
8564 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
8565 FormatStyle::BAS_DontAlign);
8566 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
8567 FormatStyle::BAS_Align);
8568
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008569 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008570 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
8571 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
8572 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008573 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
8574 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +00008575 // For backward compatibility:
8576 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
8577 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008578
Daniel Jasperd74cf402014-04-08 12:46:38 +00008579 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +00008580 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
8581 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
8582 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
8583 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +00008584 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
8585 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +00008586 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
8587 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00008588 // For backward compatibility:
8589 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
8590 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
8591 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
8592 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +00008593
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008594 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
8595 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
8596 FormatStyle::SBPO_Never);
8597 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
8598 FormatStyle::SBPO_Always);
8599 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
8600 FormatStyle::SBPO_ControlStatements);
8601 // For backward compatibility:
8602 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
8603 FormatStyle::SBPO_Never);
8604 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
8605 FormatStyle::SBPO_ControlStatements);
8606
Alexander Kornienkod6538332013-05-07 15:32:14 +00008607 Style.ColumnLimit = 123;
8608 FormatStyle BaseStyle = getLLVMStyle();
8609 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
8610 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
8611
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008612 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
8613 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
8614 FormatStyle::BS_Attach);
8615 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
8616 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008617 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
8618 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008619 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
8620 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008621 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
8622 FormatStyle::BS_Allman);
8623 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008624 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
8625 FormatStyle::BS_WebKit);
8626 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
8627 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008628
Zachary Turner448592e2015-12-18 22:20:15 +00008629 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
8630 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
8631 FormatStyle::RTBS_None);
8632 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
8633 FormatStyle::RTBS_All);
8634 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +00008635 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +00008636 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
8637 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
8638 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
8639 AlwaysBreakAfterReturnType,
8640 FormatStyle::RTBS_TopLevelDefinitions);
8641
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00008642 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
8643 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
8644 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
8645 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
8646 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
8647 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
8648 AlwaysBreakAfterDefinitionReturnType,
8649 FormatStyle::DRTBS_TopLevel);
8650
Daniel Jasper65ee3472013-07-31 23:16:02 +00008651 Style.NamespaceIndentation = FormatStyle::NI_All;
8652 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
8653 FormatStyle::NI_None);
8654 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
8655 FormatStyle::NI_Inner);
8656 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
8657 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +00008658
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00008659 // FIXME: This is required because parsing a configuration simply overwrites
8660 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +00008661 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +00008662 std::vector<std::string> BoostForeach;
8663 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00008664 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +00008665 std::vector<std::string> BoostAndQForeach;
8666 BoostAndQForeach.push_back("BOOST_FOREACH");
8667 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00008668 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
8669 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00008670
8671 Style.IncludeCategories.clear();
8672 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
8673 {".*", 1}};
8674 CHECK_PARSE("IncludeCategories:\n"
8675 " - Regex: abc/.*\n"
8676 " Priority: 2\n"
8677 " - Regex: .*\n"
8678 " Priority: 1",
8679 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00008680 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008681}
8682
8683TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
8684 FormatStyle Style = {};
8685 Style.Language = FormatStyle::LK_Cpp;
8686 CHECK_PARSE("Language: Cpp\n"
8687 "IndentWidth: 12",
8688 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +00008689 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
8690 "IndentWidth: 34",
8691 &Style),
8692 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008693 EXPECT_EQ(12u, Style.IndentWidth);
8694 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
8695 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
8696
8697 Style.Language = FormatStyle::LK_JavaScript;
8698 CHECK_PARSE("Language: JavaScript\n"
8699 "IndentWidth: 12",
8700 IndentWidth, 12u);
8701 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +00008702 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
8703 "IndentWidth: 34",
8704 &Style),
8705 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008706 EXPECT_EQ(23u, Style.IndentWidth);
8707 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
8708 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
8709
8710 CHECK_PARSE("BasedOnStyle: LLVM\n"
8711 "IndentWidth: 67",
8712 IndentWidth, 67u);
8713
8714 CHECK_PARSE("---\n"
8715 "Language: JavaScript\n"
8716 "IndentWidth: 12\n"
8717 "---\n"
8718 "Language: Cpp\n"
8719 "IndentWidth: 34\n"
8720 "...\n",
8721 IndentWidth, 12u);
8722
8723 Style.Language = FormatStyle::LK_Cpp;
8724 CHECK_PARSE("---\n"
8725 "Language: JavaScript\n"
8726 "IndentWidth: 12\n"
8727 "---\n"
8728 "Language: Cpp\n"
8729 "IndentWidth: 34\n"
8730 "...\n",
8731 IndentWidth, 34u);
8732 CHECK_PARSE("---\n"
8733 "IndentWidth: 78\n"
8734 "---\n"
8735 "Language: JavaScript\n"
8736 "IndentWidth: 56\n"
8737 "...\n",
8738 IndentWidth, 78u);
8739
8740 Style.ColumnLimit = 123;
8741 Style.IndentWidth = 234;
8742 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
8743 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +00008744 EXPECT_FALSE(parseConfiguration("---\n"
8745 "IndentWidth: 456\n"
8746 "BreakBeforeBraces: Allman\n"
8747 "---\n"
8748 "Language: JavaScript\n"
8749 "IndentWidth: 111\n"
8750 "TabWidth: 111\n"
8751 "---\n"
8752 "Language: Cpp\n"
8753 "BreakBeforeBraces: Stroustrup\n"
8754 "TabWidth: 789\n"
8755 "...\n",
8756 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008757 EXPECT_EQ(123u, Style.ColumnLimit);
8758 EXPECT_EQ(456u, Style.IndentWidth);
8759 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
8760 EXPECT_EQ(789u, Style.TabWidth);
8761
Rafael Espindola1f243172014-06-12 11:35:17 +00008762 EXPECT_EQ(parseConfiguration("---\n"
8763 "Language: JavaScript\n"
8764 "IndentWidth: 56\n"
8765 "---\n"
8766 "IndentWidth: 78\n"
8767 "...\n",
8768 &Style),
8769 ParseError::Error);
8770 EXPECT_EQ(parseConfiguration("---\n"
8771 "Language: JavaScript\n"
8772 "IndentWidth: 56\n"
8773 "---\n"
8774 "Language: JavaScript\n"
8775 "IndentWidth: 78\n"
8776 "...\n",
8777 &Style),
8778 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008779
8780 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
8781}
Daniel Jasper65ee3472013-07-31 23:16:02 +00008782
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008783#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008784
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008785TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
8786 FormatStyle Style = {};
8787 Style.Language = FormatStyle::LK_JavaScript;
8788 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008789 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00008790 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008791
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008792 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008793 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008794 "BasedOnStyle: Google\n"
8795 "---\n"
8796 "Language: JavaScript\n"
8797 "IndentWidth: 76\n"
8798 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008799 &Style)
8800 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00008801 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008802 EXPECT_EQ(76u, Style.IndentWidth);
8803 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
8804}
8805
Alexander Kornienkod6538332013-05-07 15:32:14 +00008806TEST_F(FormatTest, ConfigurationRoundTripTest) {
8807 FormatStyle Style = getLLVMStyle();
8808 std::string YAML = configurationAsText(Style);
8809 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008810 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00008811 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
8812 EXPECT_EQ(Style, ParsedStyle);
8813}
8814
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008815TEST_F(FormatTest, WorksFor8bitEncodings) {
8816 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
8817 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
8818 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
8819 "\"\xef\xee\xf0\xf3...\"",
8820 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
8821 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
8822 "\xef\xee\xf0\xf3...\"",
8823 getLLVMStyleWithColumns(12)));
8824}
8825
Alexander Kornienko393e3082013-11-13 14:04:17 +00008826TEST_F(FormatTest, HandlesUTF8BOM) {
8827 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
8828 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
8829 format("\xef\xbb\xbf#include <iostream>"));
8830 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
8831 format("\xef\xbb\xbf\n#include <iostream>"));
8832}
8833
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +00008834// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
8835#if !defined(_MSC_VER)
8836
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008837TEST_F(FormatTest, CountsUTF8CharactersProperly) {
8838 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
8839 getLLVMStyleWithColumns(35));
8840 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008841 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008842 verifyFormat("// Однажды в студёную зимнюю пору...",
8843 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +00008844 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008845 verifyFormat("/* Однажды в студёную зимнюю пору... */",
8846 getLLVMStyleWithColumns(39));
8847 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008848 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008849}
8850
8851TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +00008852 // Non-printable characters' width is currently considered to be the length in
8853 // bytes in UTF8. The characters can be displayed in very different manner
8854 // (zero-width, single width with a substitution glyph, expanded to their code
8855 // (e.g. "<8d>"), so there's no single correct way to handle them.
8856 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00008857 "\"\xc2\x8d\";",
8858 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +00008859 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00008860 "\"\xc2\x8d\";",
8861 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008862 EXPECT_EQ("\"Однажды, в \"\n"
8863 "\"студёную \"\n"
8864 "\"зимнюю \"\n"
8865 "\"пору,\"",
8866 format("\"Однажды, в студёную зимнюю пору,\"",
8867 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008868 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +00008869 "\"一 二 三 \"\n"
8870 "\"四 五六 \"\n"
8871 "\"七 八 九 \"\n"
8872 "\"十\"",
8873 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008874 EXPECT_EQ("\"一\t二 \"\n"
8875 "\"\t三 \"\n"
8876 "\"四 五\t六 \"\n"
8877 "\"\t七 \"\n"
8878 "\"八九十\tqq\"",
8879 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
8880 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +00008881
8882 // UTF8 character in an escape sequence.
8883 EXPECT_EQ("\"aaaaaa\"\n"
8884 "\"\\\xC2\x8D\"",
8885 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008886}
8887
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008888TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
8889 EXPECT_EQ("const char *sssss =\n"
8890 " \"一二三四五六七八\\\n"
8891 " 九 十\";",
8892 format("const char *sssss = \"一二三四五六七八\\\n"
8893 " 九 十\";",
8894 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008895}
8896
8897TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00008898 EXPECT_EQ("// aaaaÄ\xc2\x8d",
8899 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008900 EXPECT_EQ("// Я из лесу\n"
8901 "// вышел; был\n"
8902 "// сильный\n"
8903 "// мороз.",
8904 format("// Я из лесу вышел; был сильный мороз.",
8905 getLLVMStyleWithColumns(13)));
8906 EXPECT_EQ("// 一二三\n"
8907 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008908 "// 八 九\n"
8909 "// 十",
8910 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008911}
8912
8913TEST_F(FormatTest, SplitsUTF8BlockComments) {
8914 EXPECT_EQ("/* Гляжу,\n"
8915 " * поднимается\n"
8916 " * медленно в\n"
8917 " * гору\n"
8918 " * Лошадка,\n"
8919 " * везущая\n"
8920 " * хворосту\n"
8921 " * воз. */",
8922 format("/* Гляжу, поднимается медленно в гору\n"
8923 " * Лошадка, везущая хворосту воз. */",
8924 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008925 EXPECT_EQ(
8926 "/* 一二三\n"
8927 " * 四五六七\n"
8928 " * 八 九\n"
8929 " * 十 */",
8930 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +00008931 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
8932 " * 𝕓𝕪𝕥𝕖\n"
8933 " * 𝖀𝕿𝕱-𝟠 */",
8934 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008935}
8936
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008937#endif // _MSC_VER
8938
Daniel Jaspercdaffa42013-08-13 10:58:30 +00008939TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
8940 FormatStyle Style = getLLVMStyle();
8941
8942 Style.ConstructorInitializerIndentWidth = 4;
8943 verifyFormat(
8944 "SomeClass::Constructor()\n"
8945 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
8946 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
8947 Style);
8948
8949 Style.ConstructorInitializerIndentWidth = 2;
8950 verifyFormat(
8951 "SomeClass::Constructor()\n"
8952 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
8953 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
8954 Style);
8955
8956 Style.ConstructorInitializerIndentWidth = 0;
8957 verifyFormat(
8958 "SomeClass::Constructor()\n"
8959 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
8960 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
8961 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +00008962 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8963 verifyFormat(
8964 "SomeLongTemplateVariableName<\n"
8965 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
8966 Style);
8967 verifyFormat(
8968 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
8969 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
8970 Style);
Daniel Jasper00853002014-09-16 16:22:30 +00008971}
Daniel Jaspercdaffa42013-08-13 10:58:30 +00008972
Daniel Jasper00853002014-09-16 16:22:30 +00008973TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
8974 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +00008975 Style.BreakConstructorInitializersBeforeComma = true;
8976 Style.ConstructorInitializerIndentWidth = 4;
8977 verifyFormat("SomeClass::Constructor()\n"
8978 " : a(a)\n"
8979 " , b(b)\n"
8980 " , c(c) {}",
8981 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00008982 verifyFormat("SomeClass::Constructor()\n"
8983 " : a(a) {}",
8984 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00008985
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00008986 Style.ColumnLimit = 0;
8987 verifyFormat("SomeClass::Constructor()\n"
8988 " : a(a) {}",
8989 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +00008990 verifyFormat("SomeClass::Constructor() noexcept\n"
8991 " : a(a) {}",
8992 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00008993 verifyFormat("SomeClass::Constructor()\n"
8994 " : a(a)\n"
8995 " , b(b)\n"
8996 " , c(c) {}",
8997 Style);
8998 verifyFormat("SomeClass::Constructor()\n"
8999 " : a(a) {\n"
9000 " foo();\n"
9001 " bar();\n"
9002 "}",
9003 Style);
9004
Daniel Jasperd74cf402014-04-08 12:46:38 +00009005 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009006 verifyFormat("SomeClass::Constructor()\n"
9007 " : a(a)\n"
9008 " , b(b)\n"
9009 " , c(c) {\n}",
9010 Style);
9011 verifyFormat("SomeClass::Constructor()\n"
9012 " : a(a) {\n}",
9013 Style);
9014
9015 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009016 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009017 Style.ConstructorInitializerIndentWidth = 2;
9018 verifyFormat("SomeClass::Constructor()\n"
9019 " : a(a)\n"
9020 " , b(b)\n"
9021 " , c(c) {}",
9022 Style);
9023
9024 Style.ConstructorInitializerIndentWidth = 0;
9025 verifyFormat("SomeClass::Constructor()\n"
9026 ": a(a)\n"
9027 ", b(b)\n"
9028 ", c(c) {}",
9029 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009030
9031 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
9032 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009033 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
9034 verifyFormat(
9035 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
9036 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009037 verifyFormat(
9038 "SomeClass::Constructor()\n"
9039 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
9040 Style);
9041 Style.ConstructorInitializerIndentWidth = 4;
9042 Style.ColumnLimit = 60;
9043 verifyFormat("SomeClass::Constructor()\n"
9044 " : aaaaaaaa(aaaaaaaa)\n"
9045 " , aaaaaaaa(aaaaaaaa)\n"
9046 " , aaaaaaaa(aaaaaaaa) {}",
9047 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009048}
9049
Daniel Jasper38efc132014-10-21 07:51:54 +00009050TEST_F(FormatTest, Destructors) {
9051 verifyFormat("void F(int &i) { i.~int(); }");
9052 verifyFormat("void F(int &i) { i->~int(); }");
9053}
9054
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009055TEST_F(FormatTest, FormatsWithWebKitStyle) {
9056 FormatStyle Style = getWebKitStyle();
9057
9058 // Don't indent in outer namespaces.
9059 verifyFormat("namespace outer {\n"
9060 "int i;\n"
9061 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00009062 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009063 "} // namespace inner\n"
9064 "} // namespace outer\n"
9065 "namespace other_outer {\n"
9066 "int i;\n"
9067 "}",
9068 Style);
9069
9070 // Don't indent case labels.
9071 verifyFormat("switch (variable) {\n"
9072 "case 1:\n"
9073 "case 2:\n"
9074 " doSomething();\n"
9075 " break;\n"
9076 "default:\n"
9077 " ++variable;\n"
9078 "}",
9079 Style);
9080
9081 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +00009082 EXPECT_EQ("void f()\n"
9083 "{\n"
9084 " if (aaaaaaaaaaaaaaaa\n"
9085 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
9086 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9087 " return;\n"
9088 "}",
9089 format("void f() {\n"
9090 "if (aaaaaaaaaaaaaaaa\n"
9091 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
9092 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9093 "return;\n"
9094 "}",
9095 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009096
Daniel Jasper35995672014-04-29 14:05:20 +00009097 // Allow functions on a single line.
9098 verifyFormat("void f() { return; }", Style);
9099
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009100 // Constructor initializers are formatted one per line with the "," on the
9101 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009102 verifyFormat("Constructor()\n"
9103 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
9104 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00009105 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +00009106 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
9107 "{\n"
9108 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009109 Style);
9110 verifyFormat("SomeClass::Constructor()\n"
9111 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +00009112 "{\n"
9113 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009114 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +00009115 EXPECT_EQ("SomeClass::Constructor()\n"
9116 " : a(a)\n"
9117 "{\n"
9118 "}",
9119 format("SomeClass::Constructor():a(a){}", Style));
9120 verifyFormat("SomeClass::Constructor()\n"
9121 " : a(a)\n"
9122 " , b(b)\n"
9123 " , c(c)\n"
9124 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009125 "}",
9126 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009127 verifyFormat("SomeClass::Constructor()\n"
9128 " : a(a)\n"
9129 "{\n"
9130 " foo();\n"
9131 " bar();\n"
9132 "}",
9133 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009134
Daniel Jasper65ee3472013-07-31 23:16:02 +00009135 // Access specifiers should be aligned left.
9136 verifyFormat("class C {\n"
9137 "public:\n"
9138 " int i;\n"
9139 "};",
9140 Style);
9141
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009142 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +00009143 verifyFormat("int a; // Do not\n"
9144 "double b; // align comments.",
9145 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009146
Daniel Jasper3219e432014-12-02 13:24:51 +00009147 // Do not align operands.
9148 EXPECT_EQ("ASSERT(aaaa\n"
9149 " || bbbb);",
9150 format("ASSERT ( aaaa\n||bbbb);", Style));
9151
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009152 // Accept input's line breaks.
9153 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
9154 " || bbbbbbbbbbbbbbb) {\n"
9155 " i++;\n"
9156 "}",
9157 format("if (aaaaaaaaaaaaaaa\n"
9158 "|| bbbbbbbbbbbbbbb) { i++; }",
9159 Style));
9160 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
9161 " i++;\n"
9162 "}",
9163 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +00009164
9165 // Don't automatically break all macro definitions (llvm.org/PR17842).
9166 verifyFormat("#define aNumber 10", Style);
9167 // However, generally keep the line breaks that the user authored.
9168 EXPECT_EQ("#define aNumber \\\n"
9169 " 10",
9170 format("#define aNumber \\\n"
9171 " 10",
9172 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +00009173
9174 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009175 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
9176 " copyItems:YES];",
9177 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
9178 "copyItems:YES];",
9179 Style));
9180 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
9181 " copyItems:YES];",
9182 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
9183 " copyItems:YES];",
9184 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +00009185 // FIXME: This does not seem right, there should be more indentation before
9186 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009187 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +00009188 " @\"a\",\n"
9189 " @\"a\"\n"
9190 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009191 " copyItems:YES];",
9192 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
9193 " @\"a\",\n"
9194 " @\"a\"\n"
9195 " ]\n"
9196 " copyItems:YES];",
9197 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009198 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009199 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
9200 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009201 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
9202 " copyItems:YES];",
9203 Style));
9204
9205 verifyFormat("[self.a b:c c:d];", Style);
9206 EXPECT_EQ("[self.a b:c\n"
9207 " c:d];",
9208 format("[self.a b:c\n"
9209 "c:d];",
9210 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009211}
9212
Manuel Klimekffdeb592013-09-03 15:10:01 +00009213TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +00009214 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
9215 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
9216 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
9217 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
9218 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +00009219 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +00009220 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009221 verifyFormat("void f() {\n"
9222 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
9223 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009224 verifyFormat("void f() {\n"
9225 " other(x.begin(), //\n"
9226 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +00009227 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009228 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +00009229 verifyFormat("SomeFunction([]() { // A cool function...\n"
9230 " return 43;\n"
9231 "});");
Daniel Jasper56346192014-10-27 16:31:46 +00009232 EXPECT_EQ("SomeFunction([]() {\n"
9233 "#define A a\n"
9234 " return 43;\n"
9235 "});",
9236 format("SomeFunction([](){\n"
9237 "#define A a\n"
9238 "return 43;\n"
9239 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +00009240 verifyFormat("void f() {\n"
9241 " SomeFunction([](decltype(x), A *a) {});\n"
9242 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +00009243 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9244 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +00009245 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
9246 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
9247 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +00009248 verifyFormat("Constructor()\n"
9249 " : Field([] { // comment\n"
9250 " int i;\n"
9251 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +00009252 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
9253 " return some_parameter.size();\n"
9254 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +00009255 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
9256 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +00009257 verifyFormat("int i = aaaaaa ? 1 //\n"
9258 " : [] {\n"
9259 " return 2; //\n"
9260 " }();");
9261 verifyFormat("llvm::errs() << \"number of twos is \"\n"
9262 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
9263 " return x == 2; // force break\n"
9264 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +00009265 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
9266 " int iiiiiiiiiiii) {\n"
9267 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
9268 "});",
9269 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +00009270 verifyFormat("SomeFunction({[&] {\n"
9271 " // comment\n"
9272 " },\n"
9273 " [&] {\n"
9274 " // comment\n"
9275 " }});");
9276 verifyFormat("SomeFunction({[&] {\n"
9277 " // comment\n"
9278 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00009279 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
9280 " [&]() { return true; },\n"
9281 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +00009282
Daniel Jaspercb51cf42014-01-16 09:11:55 +00009283 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +00009284 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +00009285 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +00009286 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
9287 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +00009288 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +00009289 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +00009290 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
9291 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +00009292 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +00009293 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
9294 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +00009295 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +00009296 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +00009297 verifyFormat(
9298 "aaaaaaaaaaaaaaaaaaaaaa(\n"
9299 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
9300 " return aaaaaaaaaaaaaaaaa;\n"
9301 " });",
9302 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +00009303 verifyFormat("[]() //\n"
9304 " -> int {\n"
9305 " return 1; //\n"
9306 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +00009307
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +00009308 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +00009309 verifyFormat("SomeFunction(\n"
9310 " []() {\n"
9311 " int i = 42;\n"
9312 " return i;\n"
9313 " },\n"
9314 " []() {\n"
9315 " int j = 43;\n"
9316 " return j;\n"
9317 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +00009318
Daniel Jasperda18fd82014-06-10 06:39:03 +00009319 // More complex introducers.
9320 verifyFormat("return [i, args...] {};");
9321
Daniel Jasperbf02b2c12013-09-05 11:49:39 +00009322 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +00009323 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +00009324 verifyFormat("double &operator[](int i) { return 0; }\n"
9325 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +00009326 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +00009327 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +00009328 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +00009329
9330 // Other corner cases.
9331 verifyFormat("void f() {\n"
9332 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
9333 " );\n"
9334 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +00009335
9336 // Lambdas created through weird macros.
9337 verifyFormat("void f() {\n"
9338 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +00009339 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +00009340 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +00009341
9342 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
9343 " doo_dah();\n"
9344 " doo_dah();\n"
9345 " })) {\n"
9346 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +00009347 verifyFormat("auto lambda = []() {\n"
9348 " int a = 2\n"
9349 "#if A\n"
9350 " + 2\n"
9351 "#endif\n"
9352 " ;\n"
9353 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +00009354}
9355
Manuel Klimek516e0542013-09-04 13:25:30 +00009356TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +00009357 FormatStyle ShortBlocks = getLLVMStyle();
9358 ShortBlocks.AllowShortBlocksOnASingleLine = true;
9359 verifyFormat("int (^Block)(int, int);", ShortBlocks);
9360 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
9361 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
9362 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
9363 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
9364 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +00009365
Daniel Jasper76284682014-10-22 09:12:44 +00009366 verifyFormat("foo(^{ bar(); });", ShortBlocks);
9367 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
9368 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +00009369
Daniel Jasper76284682014-10-22 09:12:44 +00009370 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009371 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009372 "}];");
9373 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009374 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009375 "}]};");
9376 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009377 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009378 "}];");
9379 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009380 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009381 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +00009382 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009383 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009384 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009385 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +00009386 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009387
9388 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009389 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009390 "}];",
9391 getLLVMStyleWithColumns(60));
9392 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009393 " NSString *path = [self sessionFilePath];\n"
9394 " if (path) {\n"
9395 " // ...\n"
9396 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009397 "});");
9398 verifyFormat("[[SessionService sharedService]\n"
9399 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009400 " if (window) {\n"
9401 " [self windowDidLoad:window];\n"
9402 " } else {\n"
9403 " [self errorLoadingWindow];\n"
9404 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009405 " }];");
9406 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009407 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009408 "};\n",
9409 getLLVMStyleWithColumns(40));
9410 verifyFormat("[[SessionService sharedService]\n"
9411 " loadWindowWithCompletionBlock: //\n"
9412 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009413 " if (window) {\n"
9414 " [self windowDidLoad:window];\n"
9415 " } else {\n"
9416 " [self errorLoadingWindow];\n"
9417 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009418 " }];",
9419 getLLVMStyleWithColumns(60));
9420 verifyFormat("[myObject doSomethingWith:arg1\n"
9421 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009422 " // ...\n"
9423 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009424 " }\n"
9425 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009426 " // ...\n"
9427 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +00009428 " }\n"
9429 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009430 " // ...\n"
9431 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009432 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +00009433 verifyFormat("[myObject doSomethingWith:arg1\n"
9434 " firstBlock:-1\n"
9435 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009436 " // ...\n"
9437 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +00009438 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009439
9440 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009441 " @autoreleasepool {\n"
9442 " if (a) {\n"
9443 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009444 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009445 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009446 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +00009447 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +00009448 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
9449 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +00009450
9451 FormatStyle FourIndent = getLLVMStyle();
9452 FourIndent.ObjCBlockIndentWidth = 4;
9453 verifyFormat("[operation setCompletionBlock:^{\n"
9454 " [self onOperationDone];\n"
9455 "}];",
9456 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +00009457}
9458
Daniel Jasper289afc02015-04-23 09:23:17 +00009459TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
9460 FormatStyle ZeroColumn = getLLVMStyle();
9461 ZeroColumn.ColumnLimit = 0;
9462
9463 verifyFormat("[[SessionService sharedService] "
9464 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9465 " if (window) {\n"
9466 " [self windowDidLoad:window];\n"
9467 " } else {\n"
9468 " [self errorLoadingWindow];\n"
9469 " }\n"
9470 "}];",
9471 ZeroColumn);
9472 EXPECT_EQ("[[SessionService sharedService]\n"
9473 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9474 " if (window) {\n"
9475 " [self windowDidLoad:window];\n"
9476 " } else {\n"
9477 " [self errorLoadingWindow];\n"
9478 " }\n"
9479 " }];",
9480 format("[[SessionService sharedService]\n"
9481 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9482 " if (window) {\n"
9483 " [self windowDidLoad:window];\n"
9484 " } else {\n"
9485 " [self errorLoadingWindow];\n"
9486 " }\n"
9487 "}];",
9488 ZeroColumn));
9489 verifyFormat("[myObject doSomethingWith:arg1\n"
9490 " firstBlock:^(Foo *a) {\n"
9491 " // ...\n"
9492 " int i;\n"
9493 " }\n"
9494 " secondBlock:^(Bar *b) {\n"
9495 " // ...\n"
9496 " int i;\n"
9497 " }\n"
9498 " thirdBlock:^Foo(Bar *b) {\n"
9499 " // ...\n"
9500 " int i;\n"
9501 " }];",
9502 ZeroColumn);
9503 verifyFormat("f(^{\n"
9504 " @autoreleasepool {\n"
9505 " if (a) {\n"
9506 " g();\n"
9507 " }\n"
9508 " }\n"
9509 "});",
9510 ZeroColumn);
9511 verifyFormat("void (^largeBlock)(void) = ^{\n"
9512 " // ...\n"
9513 "};",
9514 ZeroColumn);
9515
9516 ZeroColumn.AllowShortBlocksOnASingleLine = true;
9517 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009518 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +00009519 ZeroColumn.AllowShortBlocksOnASingleLine = false;
9520 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
9521 " int i;\n"
9522 "};",
9523 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
9524}
9525
Alexander Kornienko9e649af2013-09-11 12:25:57 +00009526TEST_F(FormatTest, SupportsCRLF) {
9527 EXPECT_EQ("int a;\r\n"
9528 "int b;\r\n"
9529 "int c;\r\n",
9530 format("int a;\r\n"
9531 " int b;\r\n"
9532 " int c;\r\n",
9533 getLLVMStyle()));
9534 EXPECT_EQ("int a;\r\n"
9535 "int b;\r\n"
9536 "int c;\r\n",
9537 format("int a;\r\n"
9538 " int b;\n"
9539 " int c;\r\n",
9540 getLLVMStyle()));
9541 EXPECT_EQ("int a;\n"
9542 "int b;\n"
9543 "int c;\n",
9544 format("int a;\r\n"
9545 " int b;\n"
9546 " int c;\n",
9547 getLLVMStyle()));
9548 EXPECT_EQ("\"aaaaaaa \"\r\n"
9549 "\"bbbbbbb\";\r\n",
9550 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
9551 EXPECT_EQ("#define A \\\r\n"
9552 " b; \\\r\n"
9553 " c; \\\r\n"
9554 " d;\r\n",
9555 format("#define A \\\r\n"
9556 " b; \\\r\n"
9557 " c; d; \r\n",
9558 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +00009559
9560 EXPECT_EQ("/*\r\n"
9561 "multi line block comments\r\n"
9562 "should not introduce\r\n"
9563 "an extra carriage return\r\n"
9564 "*/\r\n",
9565 format("/*\r\n"
9566 "multi line block comments\r\n"
9567 "should not introduce\r\n"
9568 "an extra carriage return\r\n"
9569 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +00009570}
9571
Manuel Klimekb212f3b2013-10-12 22:46:56 +00009572TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
9573 verifyFormat("MY_CLASS(C) {\n"
9574 " int i;\n"
9575 " int j;\n"
9576 "};");
9577}
9578
Daniel Jasper6633ab82013-10-18 10:38:14 +00009579TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
9580 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
9581 TwoIndent.ContinuationIndentWidth = 2;
9582
9583 EXPECT_EQ("int i =\n"
9584 " longFunction(\n"
9585 " arg);",
9586 format("int i = longFunction(arg);", TwoIndent));
9587
9588 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
9589 SixIndent.ContinuationIndentWidth = 6;
9590
9591 EXPECT_EQ("int i =\n"
9592 " longFunction(\n"
9593 " arg);",
9594 format("int i = longFunction(arg);", SixIndent));
9595}
9596
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009597TEST_F(FormatTest, SpacesInAngles) {
9598 FormatStyle Spaces = getLLVMStyle();
9599 Spaces.SpacesInAngles = true;
9600
9601 verifyFormat("static_cast< int >(arg);", Spaces);
9602 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
9603 verifyFormat("f< int, float >();", Spaces);
9604 verifyFormat("template <> g() {}", Spaces);
9605 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009606 verifyFormat("std::function< void(int, int) > fct;", Spaces);
9607 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
9608 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009609
9610 Spaces.Standard = FormatStyle::LS_Cpp03;
9611 Spaces.SpacesInAngles = true;
9612 verifyFormat("A< A< int > >();", Spaces);
9613
9614 Spaces.SpacesInAngles = false;
9615 verifyFormat("A<A<int> >();", Spaces);
9616
9617 Spaces.Standard = FormatStyle::LS_Cpp11;
9618 Spaces.SpacesInAngles = true;
9619 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00009620
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009621 Spaces.SpacesInAngles = false;
9622 verifyFormat("A<A<int>>();", Spaces);
9623}
9624
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00009625TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
9626 FormatStyle Style = getLLVMStyle();
9627 Style.SpaceAfterTemplateKeyword = false;
9628 verifyFormat("template<int> void foo();", Style);
9629}
9630
Jacques Pienaarfc275112015-02-18 23:48:37 +00009631TEST_F(FormatTest, TripleAngleBrackets) {
9632 verifyFormat("f<<<1, 1>>>();");
9633 verifyFormat("f<<<1, 1, 1, s>>>();");
9634 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +00009635 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009636 verifyFormat("f<param><<<1, 1>>>();");
9637 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +00009638 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009639 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9640 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +00009641 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
9642 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +00009643}
9644
9645TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +00009646 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +00009647 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009648 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9649 "aaallvm::outs() <<");
9650 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9651 "aaaallvm::outs()\n <<");
9652}
9653
Manuel Klimek819788d2014-03-18 11:22:45 +00009654TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
9655 std::string code = "#if A\n"
9656 "#if B\n"
9657 "a.\n"
9658 "#endif\n"
9659 " a = 1;\n"
9660 "#else\n"
9661 "#endif\n"
9662 "#if C\n"
9663 "#else\n"
9664 "#endif\n";
9665 EXPECT_EQ(code, format(code));
9666}
9667
Manuel Klimek68b03042014-04-14 09:14:11 +00009668TEST_F(FormatTest, HandleConflictMarkers) {
9669 // Git/SVN conflict markers.
9670 EXPECT_EQ("int a;\n"
9671 "void f() {\n"
9672 " callme(some(parameter1,\n"
9673 "<<<<<<< text by the vcs\n"
9674 " parameter2),\n"
9675 "||||||| text by the vcs\n"
9676 " parameter2),\n"
9677 " parameter3,\n"
9678 "======= text by the vcs\n"
9679 " parameter2, parameter3),\n"
9680 ">>>>>>> text by the vcs\n"
9681 " otherparameter);\n",
9682 format("int a;\n"
9683 "void f() {\n"
9684 " callme(some(parameter1,\n"
9685 "<<<<<<< text by the vcs\n"
9686 " parameter2),\n"
9687 "||||||| text by the vcs\n"
9688 " parameter2),\n"
9689 " parameter3,\n"
9690 "======= text by the vcs\n"
9691 " parameter2,\n"
9692 " parameter3),\n"
9693 ">>>>>>> text by the vcs\n"
9694 " otherparameter);\n"));
9695
9696 // Perforce markers.
9697 EXPECT_EQ("void f() {\n"
9698 " function(\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 "<<<< text by the vcs\n"
9706 " parameter);\n",
9707 format("void f() {\n"
9708 " function(\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 "<<<< text by the vcs\n"
9716 " parameter);\n"));
9717
9718 EXPECT_EQ("<<<<<<<\n"
9719 "|||||||\n"
9720 "=======\n"
9721 ">>>>>>>",
9722 format("<<<<<<<\n"
9723 "|||||||\n"
9724 "=======\n"
9725 ">>>>>>>"));
9726
9727 EXPECT_EQ("<<<<<<<\n"
9728 "|||||||\n"
9729 "int i;\n"
9730 "=======\n"
9731 ">>>>>>>",
9732 format("<<<<<<<\n"
9733 "|||||||\n"
9734 "int i;\n"
9735 "=======\n"
9736 ">>>>>>>"));
9737
9738 // FIXME: Handle parsing of macros around conflict markers correctly:
9739 EXPECT_EQ("#define Macro \\\n"
9740 "<<<<<<<\n"
9741 "Something \\\n"
9742 "|||||||\n"
9743 "Else \\\n"
9744 "=======\n"
9745 "Other \\\n"
9746 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00009747 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +00009748 format("#define Macro \\\n"
9749 "<<<<<<<\n"
9750 " Something \\\n"
9751 "|||||||\n"
9752 " Else \\\n"
9753 "=======\n"
9754 " Other \\\n"
9755 ">>>>>>>\n"
9756 " End\n"
9757 "int i;\n"));
9758}
9759
Daniel Jasper471894432014-08-06 13:40:26 +00009760TEST_F(FormatTest, DisableRegions) {
9761 EXPECT_EQ("int i;\n"
9762 "// clang-format off\n"
9763 " int j;\n"
9764 "// clang-format on\n"
9765 "int k;",
9766 format(" int i;\n"
9767 " // clang-format off\n"
9768 " int j;\n"
9769 " // clang-format on\n"
9770 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +00009771 EXPECT_EQ("int i;\n"
9772 "/* clang-format off */\n"
9773 " int j;\n"
9774 "/* clang-format on */\n"
9775 "int k;",
9776 format(" int i;\n"
9777 " /* clang-format off */\n"
9778 " int j;\n"
9779 " /* clang-format on */\n"
9780 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +00009781
9782 // Don't reflow comments within disabled regions.
9783 EXPECT_EQ(
9784 "// clang-format off\n"
9785 "// long long long long long long line\n"
9786 "/* clang-format on */\n"
9787 "/* long long long\n"
9788 " * long long long\n"
9789 " * line */\n"
9790 "int i;\n"
9791 "/* clang-format off */\n"
9792 "/* long long long long long long line */\n",
9793 format("// clang-format off\n"
9794 "// long long long long long long line\n"
9795 "/* clang-format on */\n"
9796 "/* long long long long long long line */\n"
9797 "int i;\n"
9798 "/* clang-format off */\n"
9799 "/* long long long long long long line */\n",
9800 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +00009801}
9802
Manuel Klimekf0c95b32015-06-11 10:14:13 +00009803TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
9804 format("? ) =");
9805 verifyNoCrash("#define a\\\n /**/}");
9806}
Manuel Klimek5f594f82014-08-13 14:00:41 +00009807
Daniel Jasper498f5582015-12-25 08:53:31 +00009808TEST_F(FormatTest, FormatsTableGenCode) {
9809 FormatStyle Style = getLLVMStyle();
9810 Style.Language = FormatStyle::LK_TableGen;
9811 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
9812}
9813
Nico Weberb2673a12016-11-10 21:49:25 +00009814TEST_F(FormatTest, ArrayOfTemplates) {
9815 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
9816 format("auto a = new unique_ptr<int > [ 10];"));
9817
9818 FormatStyle Spaces = getLLVMStyle();
9819 Spaces.SpacesInSquareBrackets = true;
9820 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
9821 format("auto a = new unique_ptr<int > [10];", Spaces));
9822}
9823
9824TEST_F(FormatTest, ArrayAsTemplateType) {
9825 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
9826 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
9827
9828 FormatStyle Spaces = getLLVMStyle();
9829 Spaces.SpacesInSquareBrackets = true;
9830 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
9831 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
9832}
9833
Eric Liu547d8792016-03-24 13:22:42 +00009834TEST(FormatStyle, GetStyleOfFile) {
9835 vfs::InMemoryFileSystem FS;
9836 // Test 1: format file in the same directory.
9837 ASSERT_TRUE(
9838 FS.addFile("/a/.clang-format", 0,
9839 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
9840 ASSERT_TRUE(
9841 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +00009842 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +00009843 ASSERT_TRUE((bool)Style1);
9844 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +00009845
Antonio Maiorano7eb75072017-01-20 01:22:42 +00009846 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +00009847 ASSERT_TRUE(
9848 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +00009849 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +00009850 ASSERT_TRUE((bool)Style2);
9851 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +00009852
Antonio Maiorano7eb75072017-01-20 01:22:42 +00009853 // Test 2.2: no format on 'none' fallback style.
9854 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
9855 ASSERT_TRUE((bool)Style2);
9856 ASSERT_EQ(*Style2, getNoStyle());
9857
9858 // Test 2.3: format if config is found with no based style while fallback is
9859 // 'none'.
9860 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
9861 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
9862 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
9863 ASSERT_TRUE((bool)Style2);
9864 ASSERT_EQ(*Style2, getLLVMStyle());
9865
9866 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
9867 Style2 = getStyle("{}", "a.h", "none", "", &FS);
9868 ASSERT_TRUE((bool)Style2);
9869 ASSERT_EQ(*Style2, getLLVMStyle());
9870
Eric Liu547d8792016-03-24 13:22:42 +00009871 // Test 3: format file in parent directory.
9872 ASSERT_TRUE(
9873 FS.addFile("/c/.clang-format", 0,
9874 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
9875 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
9876 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +00009877 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +00009878 ASSERT_TRUE((bool)Style3);
9879 ASSERT_EQ(*Style3, getGoogleStyle());
9880
9881 // Test 4: error on invalid fallback style
9882 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
9883 ASSERT_FALSE((bool)Style4);
9884 llvm::consumeError(Style4.takeError());
9885
9886 // Test 5: error on invalid yaml on command line
9887 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
9888 ASSERT_FALSE((bool)Style5);
9889 llvm::consumeError(Style5.takeError());
9890
9891 // Test 6: error on invalid style
9892 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
9893 ASSERT_FALSE((bool)Style6);
9894 llvm::consumeError(Style6.takeError());
9895
9896 // Test 7: found config file, error on parsing it
9897 ASSERT_TRUE(
9898 FS.addFile("/d/.clang-format", 0,
9899 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
9900 "InvalidKey: InvalidValue")));
9901 ASSERT_TRUE(
9902 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
9903 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
9904 ASSERT_FALSE((bool)Style7);
9905 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +00009906}
9907
Manuel Klimekb12e5a52016-03-01 12:37:30 +00009908TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
9909 // Column limit is 20.
9910 std::string Code = "Type *a =\n"
9911 " new Type();\n"
9912 "g(iiiii, 0, jjjjj,\n"
9913 " 0, kkkkk, 0, mm);\n"
9914 "int bad = format ;";
9915 std::string Expected = "auto a = new Type();\n"
9916 "g(iiiii, nullptr,\n"
9917 " jjjjj, nullptr,\n"
9918 " kkkkk, nullptr,\n"
9919 " mm);\n"
9920 "int bad = format ;";
9921 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +00009922 tooling::Replacements Replaces = toReplacements(
9923 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
9924 "auto "),
9925 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
9926 "nullptr"),
9927 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
9928 "nullptr"),
9929 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
9930 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +00009931
9932 format::FormatStyle Style = format::getLLVMStyle();
9933 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +00009934 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
9935 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
9936 << llvm::toString(FormattedReplaces.takeError()) << "\n";
9937 auto Result = applyAllReplacements(Code, *FormattedReplaces);
9938 EXPECT_TRUE(static_cast<bool>(Result));
9939 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +00009940}
9941
Eric Liubaf58c22016-05-18 13:43:48 +00009942TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
9943 std::string Code = "#include \"a.h\"\n"
9944 "#include \"c.h\"\n"
9945 "\n"
9946 "int main() {\n"
9947 " return 0;\n"
9948 "}";
9949 std::string Expected = "#include \"a.h\"\n"
9950 "#include \"b.h\"\n"
9951 "#include \"c.h\"\n"
9952 "\n"
9953 "int main() {\n"
9954 " return 0;\n"
9955 "}";
9956 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +00009957 tooling::Replacements Replaces = toReplacements(
9958 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
9959 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +00009960
9961 format::FormatStyle Style = format::getLLVMStyle();
9962 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +00009963 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
9964 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
9965 << llvm::toString(FormattedReplaces.takeError()) << "\n";
9966 auto Result = applyAllReplacements(Code, *FormattedReplaces);
9967 EXPECT_TRUE(static_cast<bool>(Result));
9968 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +00009969}
9970
Daniel Jasperd246a5a2015-06-15 15:25:11 +00009971} // end namespace
9972} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +00009973} // end namespace clang