blob: c0117215e6a5b75d9e98402dff09b0872c4cc4d3 [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:
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000033 enum StatusCheck {
34 SC_ExpectComplete,
35 SC_ExpectIncomplete,
36 SC_DoNotCheck
Manuel Klimekec5c3db2015-05-07 12:26:30 +000037 };
38
Daniel Jasperd246a5a2015-06-15 15:25:11 +000039 std::string format(llvm::StringRef Code,
40 const FormatStyle &Style = getLLVMStyle(),
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000041 StatusCheck CheckComplete = SC_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()));
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000045 FormattingAttemptStatus Status;
Manuel Klimekec5c3db2015-05-07 12:26:30 +000046 tooling::Replacements Replaces =
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000047 reformat(Style, Code, Ranges, "<stdin>", &Status);
48 if (CheckComplete != SC_DoNotCheck) {
49 bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete;
50 EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete)
51 << Code << "\n\n";
Manuel Klimekec5c3db2015-05-07 12:26:30 +000052 }
Daniel Jasperec04c0d2013-05-16 10:40:07 +000053 ReplacementCount = Replaces.size();
Eric Liu4f8d9942016-07-11 13:53:12 +000054 auto Result = applyAllReplacements(Code, Replaces);
55 EXPECT_TRUE(static_cast<bool>(Result));
56 DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
57 return *Result;
Daniel Jasperf7935112012-12-03 18:12:45 +000058 }
59
Francois Ferranda6b6d512017-05-24 11:36:58 +000060 FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000061 Style.ColumnLimit = ColumnLimit;
62 return Style;
63 }
64
Francois Ferranda6b6d512017-05-24 11:36:58 +000065 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
66 return getStyleWithColumns(getLLVMStyle(), ColumnLimit);
67 }
68
Daniel Jasper1b750ed2013-01-14 16:24:39 +000069 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
Francois Ferranda6b6d512017-05-24 11:36:58 +000070 return getStyleWithColumns(getGoogleStyle(), ColumnLimit);
Daniel Jasper1b750ed2013-01-14 16:24:39 +000071 }
72
Martin Probsta004b3f2017-11-17 18:06:33 +000073 void verifyFormat(llvm::StringRef Expected, llvm::StringRef Code,
Manuel Klimekb69e3c62013-01-02 18:33:23 +000074 const FormatStyle &Style = getLLVMStyle()) {
Martin Probsta004b3f2017-11-17 18:06:33 +000075 EXPECT_EQ(Expected.str(), format(Code, Style));
Nico Weberd96ae862017-02-24 19:10:12 +000076 if (Style.Language == FormatStyle::LK_Cpp) {
77 // Objective-C++ is a superset of C++, so everything checked for C++
78 // needs to be checked for Objective-C++ as well.
79 FormatStyle ObjCStyle = Style;
80 ObjCStyle.Language = FormatStyle::LK_ObjC;
Martin Probsta004b3f2017-11-17 18:06:33 +000081 EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle));
Nico Weberd96ae862017-02-24 19:10:12 +000082 }
Daniel Jasperf7935112012-12-03 18:12:45 +000083 }
84
Martin Probsta004b3f2017-11-17 18:06:33 +000085 void verifyFormat(llvm::StringRef Code,
86 const FormatStyle &Style = getLLVMStyle()) {
87 verifyFormat(Code, test::messUp(Code), Style);
88 }
89
Manuel Klimekec5c3db2015-05-07 12:26:30 +000090 void verifyIncompleteFormat(llvm::StringRef Code,
91 const FormatStyle &Style = getLLVMStyle()) {
92 EXPECT_EQ(Code.str(),
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000093 format(test::messUp(Code), Style, SC_ExpectIncomplete));
Manuel Klimekec5c3db2015-05-07 12:26:30 +000094 }
95
Daniel Jasperf7935112012-12-03 18:12:45 +000096 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000097 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +000098 }
Daniel Jasper5b49f472013-01-23 12:10:53 +000099
100 void verifyIndependentOfContext(llvm::StringRef text) {
101 verifyFormat(text);
102 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
103 }
Daniel Jasper7b038a22013-01-30 09:46:12 +0000104
Daniel Jasper675b4f82015-01-19 10:51:23 +0000105 /// \brief Verify that clang-format does not crash on the given input.
106 void verifyNoCrash(llvm::StringRef Code,
107 const FormatStyle &Style = getLLVMStyle()) {
Krasimir Georgievbcda54b2017-04-21 14:35:20 +0000108 format(Code, Style, SC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +0000109 }
110
Daniel Jasper7b038a22013-01-30 09:46:12 +0000111 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +0000112};
113
Manuel Klimek52b15152013-01-09 15:25:02 +0000114TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000115 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
116 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
117 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
118 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
119 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000120}
121
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000122//===----------------------------------------------------------------------===//
123// Basic function tests.
124//===----------------------------------------------------------------------===//
125
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000126TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000127 EXPECT_EQ(";", format(";"));
128}
129
130TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
131 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000132 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000133 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
134 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
135}
136
137TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
138 EXPECT_EQ("int i;", format("int\ni;"));
139}
140
141TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000142 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000143}
144
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000145TEST_F(FormatTest, FormatsNestedCall) {
146 verifyFormat("Method(f1, f2(f3));");
147 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000148 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000149}
150
Daniel Jasper14556742013-02-07 21:08:36 +0000151TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000152 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000153 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000154 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000155 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper23c2b5a2017-02-17 10:44:07 +0000156 verifyFormat("ALWAYS_INLINE ::std::string getName();");
157 verifyFormat("some::string getName();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000158}
159
Daniel Jasper7b038a22013-01-30 09:46:12 +0000160TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
161 EXPECT_EQ("if (a) {\n"
162 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000163 "}",
164 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000165 EXPECT_EQ(4, ReplacementCount);
166 EXPECT_EQ("if (a) {\n"
167 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000168 "}",
169 format("if (a) {\n"
170 " f();\n"
171 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000172 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000173 EXPECT_EQ("/*\r\n"
174 "\r\n"
175 "*/\r\n",
176 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000177 "\r\n"
178 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000179 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000180}
181
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000182TEST_F(FormatTest, RemovesEmptyLines) {
183 EXPECT_EQ("class C {\n"
184 " int i;\n"
185 "};",
186 format("class C {\n"
187 " int i;\n"
188 "\n"
189 "};"));
190
Nico Weber34272652014-11-13 16:25:37 +0000191 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000192 EXPECT_EQ("namespace N {\n"
193 "\n"
194 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000195 "}",
Daniel Jasper01b35482014-03-21 13:03:33 +0000196 format("namespace N {\n"
197 "\n"
198 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000199 "}",
200 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000201 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
202 "\n"
203 "int i;\n"
204 "}",
205 format("extern /**/ \"C\" /**/ {\n"
206 "\n"
207 "int i;\n"
208 "}",
209 getGoogleStyle()));
210
211 // ...but do keep inlining and removing empty lines for non-block extern "C"
212 // functions.
213 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
214 EXPECT_EQ("extern \"C\" int f() {\n"
215 " int i = 42;\n"
216 " return i;\n"
217 "}",
218 format("extern \"C\" int f() {\n"
219 "\n"
220 " int i = 42;\n"
221 " return i;\n"
222 "}",
223 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000224
Daniel Jasper11164bd2014-03-21 12:58:53 +0000225 // Remove empty lines at the beginning and end of blocks.
226 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000227 "\n"
228 " if (a) {\n"
229 "\n"
230 " f();\n"
231 " }\n"
232 "}",
233 format("void f() {\n"
234 "\n"
235 " if (a) {\n"
236 "\n"
237 " f();\n"
238 "\n"
239 " }\n"
240 "\n"
241 "}",
242 getLLVMStyle()));
243 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000244 " if (a) {\n"
245 " f();\n"
246 " }\n"
247 "}",
248 format("void f() {\n"
249 "\n"
250 " if (a) {\n"
251 "\n"
252 " f();\n"
253 "\n"
254 " }\n"
255 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000256 "}",
257 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000258
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000259 // Don't remove empty lines in more complex control statements.
260 EXPECT_EQ("void f() {\n"
261 " if (a) {\n"
262 " f();\n"
263 "\n"
264 " } else if (b) {\n"
265 " f();\n"
266 " }\n"
267 "}",
268 format("void f() {\n"
269 " if (a) {\n"
270 " f();\n"
271 "\n"
272 " } else if (b) {\n"
273 " f();\n"
274 "\n"
275 " }\n"
276 "\n"
277 "}"));
278
279 // FIXME: This is slightly inconsistent.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000280 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
281 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000282 EXPECT_EQ("namespace {\n"
283 "int i;\n"
284 "}",
285 format("namespace {\n"
286 "int i;\n"
287 "\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000288 "}", LLVMWithNoNamespaceFix));
289 EXPECT_EQ("namespace {\n"
290 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000291 "}",
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000292 format("namespace {\n"
293 "int i;\n"
294 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000295 "}"));
296 EXPECT_EQ("namespace {\n"
297 "int i;\n"
298 "\n"
299 "} // namespace",
300 format("namespace {\n"
301 "int i;\n"
302 "\n"
303 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000304
305 FormatStyle Style = getLLVMStyle();
306 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
307 Style.MaxEmptyLinesToKeep = 2;
308 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
309 Style.BraceWrapping.AfterClass = true;
310 Style.BraceWrapping.AfterFunction = true;
311 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
312
313 EXPECT_EQ("class Foo\n"
314 "{\n"
315 " Foo() {}\n"
316 "\n"
317 " void funk() {}\n"
318 "};",
319 format("class Foo\n"
320 "{\n"
321 " Foo()\n"
322 " {\n"
323 " }\n"
324 "\n"
325 " void funk() {}\n"
326 "};",
327 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000328}
329
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000330TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000331 verifyFormat("x = (a) and (b);");
332 verifyFormat("x = (a) or (b);");
333 verifyFormat("x = (a) bitand (b);");
334 verifyFormat("x = (a) bitor (b);");
335 verifyFormat("x = (a) not_eq (b);");
336 verifyFormat("x = (a) and_eq (b);");
337 verifyFormat("x = (a) or_eq (b);");
338 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000339}
340
Olivier Goffart90f981b2017-07-14 09:23:40 +0000341TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) {
342 verifyFormat("x = compl(a);");
343 verifyFormat("x = not(a);");
344 verifyFormat("x = bitand(a);");
345 // Unary operator must not be merged with the next identifier
346 verifyFormat("x = compl a;");
347 verifyFormat("x = not a;");
348 verifyFormat("x = bitand a;");
349}
350
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000351//===----------------------------------------------------------------------===//
352// Tests for control statements.
353//===----------------------------------------------------------------------===//
354
Daniel Jaspercdd06622013-05-14 10:31:09 +0000355TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000356 verifyFormat("if (true)\n f();\ng();");
357 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000358 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000359 verifyFormat("if constexpr (true)\n"
360 " f();\ng();");
361 verifyFormat("if constexpr (a)\n"
362 " if constexpr (b)\n"
363 " if constexpr (c)\n"
364 " g();\n"
365 "h();");
366 verifyFormat("if constexpr (a)\n"
367 " if constexpr (b) {\n"
368 " f();\n"
369 " }\n"
370 "g();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000371
Daniel Jasper3a685df2013-05-16 12:12:21 +0000372 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +0000373 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jasperced17f82013-01-16 15:44:34 +0000374 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
375 verifyFormat("if (a)\n"
376 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000377 " f();",
378 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000379 verifyFormat("{\n"
380 " if (a)\n"
381 " label:\n"
382 " f();\n"
383 "}",
384 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000385 verifyFormat("#define A \\\n"
386 " if (a) \\\n"
387 " label: \\\n"
388 " f()",
389 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000390 verifyFormat("if (a)\n"
391 " ;",
392 AllowsMergedIf);
393 verifyFormat("if (a)\n"
394 " if (b) return;",
395 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000396
Daniel Jasper3a685df2013-05-16 12:12:21 +0000397 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000398 " f();\n",
399 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000400 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000401 " f();",
402 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000403 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000404 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000405 "}",
406 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000407 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000408 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000409 "}",
410 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000411
412 AllowsMergedIf.ColumnLimit = 14;
413 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000414 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000415 " return;",
416 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000417
418 AllowsMergedIf.ColumnLimit = 13;
419 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000420}
421
Daniel Jasper3a685df2013-05-16 12:12:21 +0000422TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
423 FormatStyle AllowsMergedLoops = getLLVMStyle();
424 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
425 verifyFormat("while (true) continue;", AllowsMergedLoops);
426 verifyFormat("for (;;) continue;", AllowsMergedLoops);
427 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
428 verifyFormat("while (true)\n"
429 " ;",
430 AllowsMergedLoops);
431 verifyFormat("for (;;)\n"
432 " ;",
433 AllowsMergedLoops);
434 verifyFormat("for (;;)\n"
435 " for (;;) continue;",
436 AllowsMergedLoops);
437 verifyFormat("for (;;) // Can't merge this\n"
438 " continue;",
439 AllowsMergedLoops);
440 verifyFormat("for (;;) /* still don't merge */\n"
441 " continue;",
442 AllowsMergedLoops);
443}
444
Daniel Jasper17605d32014-05-14 09:33:35 +0000445TEST_F(FormatTest, FormatShortBracedStatements) {
446 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000447 AllowSimpleBracedStatements.ColumnLimit = 40;
Daniel Jasper17605d32014-05-14 09:33:35 +0000448 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
449
450 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
451 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
452
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000453 AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom;
454 AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true;
455 AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false;
456
Daniel Jasper17605d32014-05-14 09:33:35 +0000457 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000458 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000459 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
460 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
461 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000462 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000463 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
464 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000465 verifyFormat("if (true) {\n"
466 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
467 "}",
468 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000469 verifyFormat("if (true) { //\n"
470 " f();\n"
471 "}",
472 AllowSimpleBracedStatements);
473 verifyFormat("if (true) {\n"
474 " f();\n"
475 " f();\n"
476 "}",
477 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000478 verifyFormat("if (true) {\n"
479 " f();\n"
480 "} else {\n"
481 " f();\n"
482 "}",
483 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000484
Daniel Jasperf92659e2017-06-19 07:45:41 +0000485 verifyFormat("struct A2 {\n"
486 " int X;\n"
487 "};",
488 AllowSimpleBracedStatements);
489 verifyFormat("typedef struct A2 {\n"
490 " int X;\n"
491 "} A2_t;",
492 AllowSimpleBracedStatements);
Daniel Jasperbd630732014-05-22 13:25:26 +0000493 verifyFormat("template <int> struct A2 {\n"
494 " struct B {};\n"
495 "};",
496 AllowSimpleBracedStatements);
497
Daniel Jasper17605d32014-05-14 09:33:35 +0000498 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000499 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000500 verifyFormat("if (true) {\n"
501 " f();\n"
502 "}",
503 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000504 verifyFormat("if (true) {\n"
505 " f();\n"
506 "} else {\n"
507 " f();\n"
508 "}",
509 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000510
511 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000512 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000513 verifyFormat("while (true) {\n"
514 " f();\n"
515 "}",
516 AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000517 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000518 verifyFormat("for (;;) {\n"
519 " f();\n"
520 "}",
521 AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000522
523 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
524 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
525 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = true;
526
527 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
528 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
529 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
530 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
531 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
532 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
533 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
534 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
535 verifyFormat("if (true)\n"
536 "{\n"
537 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
538 "}",
539 AllowSimpleBracedStatements);
540 verifyFormat("if (true)\n"
541 "{ //\n"
542 " f();\n"
543 "}",
544 AllowSimpleBracedStatements);
545 verifyFormat("if (true)\n"
546 "{\n"
547 " f();\n"
548 " f();\n"
549 "}",
550 AllowSimpleBracedStatements);
551 verifyFormat("if (true)\n"
552 "{\n"
553 " f();\n"
554 "} else\n"
555 "{\n"
556 " f();\n"
557 "}",
558 AllowSimpleBracedStatements);
559
560 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
561 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
562 verifyFormat("if (true)\n"
563 "{\n"
564 " f();\n"
565 "}",
566 AllowSimpleBracedStatements);
567 verifyFormat("if (true)\n"
568 "{\n"
569 " f();\n"
570 "} else\n"
571 "{\n"
572 " f();\n"
573 "}",
574 AllowSimpleBracedStatements);
575
576 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
577 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
578 verifyFormat("while (true)\n"
579 "{\n"
580 " f();\n"
581 "}",
582 AllowSimpleBracedStatements);
583 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
584 verifyFormat("for (;;)\n"
585 "{\n"
586 " f();\n"
587 "}",
588 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000589}
590
Krasimir Georgievbf4cdda2018-01-19 16:12:37 +0000591TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) {
592 FormatStyle Style = getLLVMStyleWithColumns(60);
593 Style.AllowShortBlocksOnASingleLine = true;
594 Style.AllowShortIfStatementsOnASingleLine = true;
595 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
596 EXPECT_EQ("#define A \\\n"
597 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n"
598 " { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n"
599 "X;",
600 format("#define A \\\n"
601 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n"
602 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n"
603 " }\n"
604 "X;",
605 Style));
606}
607
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000608TEST_F(FormatTest, ParseIfElse) {
609 verifyFormat("if (true)\n"
610 " if (true)\n"
611 " if (true)\n"
612 " f();\n"
613 " else\n"
614 " g();\n"
615 " else\n"
616 " h();\n"
617 "else\n"
618 " i();");
619 verifyFormat("if (true)\n"
620 " if (true)\n"
621 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000622 " if (true)\n"
623 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000624 " } else {\n"
625 " g();\n"
626 " }\n"
627 " else\n"
628 " h();\n"
629 "else {\n"
630 " i();\n"
631 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000632 verifyFormat("if (true)\n"
633 " if constexpr (true)\n"
634 " if (true) {\n"
635 " if constexpr (true)\n"
636 " f();\n"
637 " } else {\n"
638 " g();\n"
639 " }\n"
640 " else\n"
641 " h();\n"
642 "else {\n"
643 " i();\n"
644 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000645 verifyFormat("void f() {\n"
646 " if (a) {\n"
647 " } else {\n"
648 " }\n"
649 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000650}
651
652TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000653 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000654 verifyFormat("if (a)\n"
655 " f();\n"
656 "else if (b)\n"
657 " g();\n"
658 "else\n"
659 " h();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000660 verifyFormat("if constexpr (a)\n"
661 " f();\n"
662 "else if constexpr (b)\n"
663 " g();\n"
664 "else\n"
665 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000666 verifyFormat("if (a) {\n"
667 " f();\n"
668 "}\n"
669 "// or else ..\n"
670 "else {\n"
671 " g()\n"
672 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000673
674 verifyFormat("if (a) {\n"
675 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
676 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
677 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000678 verifyFormat("if (a) {\n"
679 "} else if (\n"
680 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
681 "}",
682 getLLVMStyleWithColumns(62));
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000683 verifyFormat("if (a) {\n"
684 "} else if constexpr (\n"
685 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
686 "}",
687 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000688}
689
Daniel Jasperf7935112012-12-03 18:12:45 +0000690TEST_F(FormatTest, FormatsForLoop) {
691 verifyFormat(
692 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000693 " ++VeryVeryLongLoopVariable)\n"
694 " ;");
695 verifyFormat("for (;;)\n"
696 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000697 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000698 verifyFormat("for (;;) {\n"
699 " f();\n"
700 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000701 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000702
703 verifyFormat(
704 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
705 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000706 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000707
708 verifyFormat(
709 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000710 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000711 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
712 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000713 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000714 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
715 " I = FD->getDeclsInPrototypeScope().begin(),\n"
716 " E = FD->getDeclsInPrototypeScope().end();\n"
717 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000718 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
719 " I = Container.begin(),\n"
720 " E = Container.end();\n"
721 " I != E; ++I) {\n}",
722 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000723
Daniel Jasper48c62f92013-01-28 17:30:17 +0000724 verifyFormat(
725 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
726 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000727 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
728 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000729 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000730 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
731 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
732 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000733 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
734 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
735 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000736 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
737 " aaaaaaaaaa);\n"
738 " iter; ++iter) {\n"
739 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000740 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
741 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
742 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
743 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000744
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000745 FormatStyle NoBinPacking = getLLVMStyle();
746 NoBinPacking.BinPackParameters = false;
747 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
748 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
749 " aaaaaaaaaaaaaaaa,\n"
750 " aaaaaaaaaaaaaaaa,\n"
751 " aaaaaaaaaaaaaaaa);\n"
752 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
753 "}",
754 NoBinPacking);
755 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000756 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
757 " E = UnwrappedLines.end();\n"
758 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000759 " ++I) {\n}",
760 NoBinPacking);
Daniel Jasper7b85a192017-09-03 08:56:24 +0000761
762 FormatStyle AlignLeft = getLLVMStyle();
763 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
764 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
Daniel Jasperf7935112012-12-03 18:12:45 +0000765}
766
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000767TEST_F(FormatTest, RangeBasedForLoops) {
768 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
769 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
770 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
771 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000772 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
773 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000774 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
775 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000776}
777
Daniel Jaspere1e43192014-04-01 12:55:11 +0000778TEST_F(FormatTest, ForEachLoops) {
779 verifyFormat("void f() {\n"
780 " foreach (Item *item, itemlist) {}\n"
781 " Q_FOREACH (Item *item, itemlist) {}\n"
782 " BOOST_FOREACH (Item *item, itemlist) {}\n"
783 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
784 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000785
786 // As function-like macros.
787 verifyFormat("#define foreach(x, y)\n"
788 "#define Q_FOREACH(x, y)\n"
789 "#define BOOST_FOREACH(x, y)\n"
790 "#define UNKNOWN_FOREACH(x, y)\n");
791
792 // Not as function-like macros.
793 verifyFormat("#define foreach (x, y)\n"
794 "#define Q_FOREACH (x, y)\n"
795 "#define BOOST_FOREACH (x, y)\n"
796 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000797}
798
Daniel Jasperf7935112012-12-03 18:12:45 +0000799TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000800 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000801 verifyFormat("while (true)\n"
802 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000803 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000804 verifyFormat("while () {\n"
805 " f();\n"
806 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000807}
808
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000809TEST_F(FormatTest, FormatsDoWhile) {
810 verifyFormat("do {\n"
811 " do_something();\n"
812 "} while (something());");
813 verifyFormat("do\n"
814 " do_something();\n"
815 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000816}
817
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000818TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000819 verifyFormat("switch (x) {\n"
820 "case 1:\n"
821 " f();\n"
822 " break;\n"
823 "case kFoo:\n"
824 "case ns::kBar:\n"
825 "case kBaz:\n"
826 " break;\n"
827 "default:\n"
828 " g();\n"
829 " break;\n"
830 "}");
831 verifyFormat("switch (x) {\n"
832 "case 1: {\n"
833 " f();\n"
834 " break;\n"
835 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000836 "case 2: {\n"
837 " break;\n"
838 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000839 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000840 verifyFormat("switch (x) {\n"
841 "case 1: {\n"
842 " f();\n"
843 " {\n"
844 " g();\n"
845 " h();\n"
846 " }\n"
847 " break;\n"
848 "}\n"
849 "}");
850 verifyFormat("switch (x) {\n"
851 "case 1: {\n"
852 " f();\n"
853 " if (foo) {\n"
854 " g();\n"
855 " h();\n"
856 " }\n"
857 " break;\n"
858 "}\n"
859 "}");
860 verifyFormat("switch (x) {\n"
861 "case 1: {\n"
862 " f();\n"
863 " g();\n"
864 "} break;\n"
865 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000866 verifyFormat("switch (test)\n"
867 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000868 verifyFormat("switch (x) {\n"
869 "default: {\n"
870 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000871 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000872 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000873 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000874 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000875 "// if 1, do f()\n"
876 "case 1:\n"
877 " f();\n"
878 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000879 verifyFormat("switch (x) {\n"
880 "case 1:\n"
881 " // Do amazing stuff\n"
882 " {\n"
883 " f();\n"
884 " g();\n"
885 " }\n"
886 " break;\n"
887 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000888 verifyFormat("#define A \\\n"
889 " switch (x) { \\\n"
890 " case a: \\\n"
891 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000892 " }",
893 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000894 verifyFormat("#define OPERATION_CASE(name) \\\n"
895 " case OP_name: \\\n"
896 " return operations::Operation##name\n",
897 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000898 verifyFormat("switch (x) {\n"
899 "case 1:;\n"
900 "default:;\n"
901 " int i;\n"
902 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000903
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000904 verifyGoogleFormat("switch (x) {\n"
905 " case 1:\n"
906 " f();\n"
907 " break;\n"
908 " case kFoo:\n"
909 " case ns::kBar:\n"
910 " case kBaz:\n"
911 " break;\n"
912 " default:\n"
913 " g();\n"
914 " break;\n"
915 "}");
916 verifyGoogleFormat("switch (x) {\n"
917 " case 1: {\n"
918 " f();\n"
919 " break;\n"
920 " }\n"
921 "}");
922 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000923 " ;");
924
925 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
926 " case OP_name: \\\n"
927 " return operations::Operation##name\n");
928 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
929 " // Get the correction operation class.\n"
930 " switch (OpCode) {\n"
931 " CASE(Add);\n"
932 " CASE(Subtract);\n"
933 " default:\n"
934 " return operations::Unknown;\n"
935 " }\n"
936 "#undef OPERATION_CASE\n"
937 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000938 verifyFormat("DEBUG({\n"
939 " switch (x) {\n"
940 " case A:\n"
941 " f();\n"
942 " break;\n"
Krasimir Georgieve0926342017-07-12 15:21:43 +0000943 " // fallthrough\n"
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000944 " case B:\n"
945 " g();\n"
946 " break;\n"
947 " }\n"
948 "});");
Krasimir Georgieve0926342017-07-12 15:21:43 +0000949 EXPECT_EQ("DEBUG({\n"
950 " switch (x) {\n"
951 " case A:\n"
952 " f();\n"
953 " break;\n"
954 " // On B:\n"
955 " case B:\n"
956 " g();\n"
957 " break;\n"
958 " }\n"
959 "});",
960 format("DEBUG({\n"
961 " switch (x) {\n"
962 " case A:\n"
963 " f();\n"
964 " break;\n"
965 " // On B:\n"
966 " case B:\n"
967 " g();\n"
968 " break;\n"
969 " }\n"
970 "});",
971 getLLVMStyle()));
Daniel Jasper031e2402014-04-28 07:48:36 +0000972 verifyFormat("switch (a) {\n"
973 "case (b):\n"
974 " return;\n"
975 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000976
977 verifyFormat("switch (a) {\n"
978 "case some_namespace::\n"
979 " some_constant:\n"
980 " return;\n"
981 "}",
982 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000983}
984
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000985TEST_F(FormatTest, CaseRanges) {
986 verifyFormat("switch (x) {\n"
987 "case 'A' ... 'Z':\n"
988 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000989 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000990 " break;\n"
991 "}");
992}
993
Daniel Jasperb87899b2014-09-10 13:11:45 +0000994TEST_F(FormatTest, ShortCaseLabels) {
995 FormatStyle Style = getLLVMStyle();
996 Style.AllowShortCaseLabelsOnASingleLine = true;
997 verifyFormat("switch (a) {\n"
998 "case 1: x = 1; break;\n"
999 "case 2: return;\n"
1000 "case 3:\n"
1001 "case 4:\n"
1002 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +00001003 "case 6: // comment\n"
1004 " return;\n"
1005 "case 7:\n"
1006 " // comment\n"
1007 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +00001008 "case 8:\n"
1009 " x = 8; // comment\n"
1010 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001011 "default: y = 1; break;\n"
1012 "}",
1013 Style);
1014 verifyFormat("switch (a) {\n"
Francois Ferranda64ba702017-07-28 07:56:18 +00001015 "case 0: return; // comment\n"
1016 "case 1: break; // comment\n"
1017 "case 2: return;\n"
1018 "// comment\n"
1019 "case 3: return;\n"
1020 "// comment 1\n"
1021 "// comment 2\n"
1022 "// comment 3\n"
1023 "case 4: break; /* comment */\n"
1024 "case 5:\n"
1025 " // comment\n"
1026 " break;\n"
1027 "case 6: /* comment */ x = 1; break;\n"
1028 "case 7: x = /* comment */ 1; break;\n"
1029 "case 8:\n"
1030 " x = 1; /* comment */\n"
1031 " break;\n"
1032 "case 9:\n"
1033 " break; // comment line 1\n"
1034 " // comment line 2\n"
1035 "}",
1036 Style);
1037 EXPECT_EQ("switch (a) {\n"
1038 "case 1:\n"
1039 " x = 8;\n"
1040 " // fall through\n"
1041 "case 2: x = 8;\n"
1042 "// comment\n"
1043 "case 3:\n"
1044 " return; /* comment line 1\n"
1045 " * comment line 2 */\n"
1046 "case 4: i = 8;\n"
1047 "// something else\n"
1048 "#if FOO\n"
1049 "case 5: break;\n"
1050 "#endif\n"
1051 "}",
1052 format("switch (a) {\n"
1053 "case 1: x = 8;\n"
1054 " // fall through\n"
1055 "case 2:\n"
1056 " x = 8;\n"
1057 "// comment\n"
1058 "case 3:\n"
1059 " return; /* comment line 1\n"
1060 " * comment line 2 */\n"
1061 "case 4:\n"
1062 " i = 8;\n"
1063 "// something else\n"
1064 "#if FOO\n"
1065 "case 5: break;\n"
1066 "#endif\n"
1067 "}",
1068 Style));
1069 EXPECT_EQ("switch (a) {\n" "case 0:\n"
1070 " return; // long long long long long long long long long long long long comment\n"
1071 " // line\n" "}",
1072 format("switch (a) {\n"
1073 "case 0: return; // long long long long long long long long long long long long comment line\n"
1074 "}",
1075 Style));
1076 EXPECT_EQ("switch (a) {\n"
1077 "case 0:\n"
1078 " return; /* long long long long long long long long long long long long comment\n"
1079 " line */\n"
1080 "}",
1081 format("switch (a) {\n"
1082 "case 0: return; /* long long long long long long long long long long long long comment line */\n"
1083 "}",
1084 Style));
1085 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +00001086 "#if FOO\n"
1087 "case 0: return 0;\n"
1088 "#endif\n"
1089 "}",
1090 Style);
1091 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001092 "case 1: {\n"
1093 "}\n"
1094 "case 2: {\n"
1095 " return;\n"
1096 "}\n"
1097 "case 3: {\n"
1098 " x = 1;\n"
1099 " return;\n"
1100 "}\n"
1101 "case 4:\n"
1102 " if (x)\n"
1103 " return;\n"
1104 "}",
1105 Style);
1106 Style.ColumnLimit = 21;
1107 verifyFormat("switch (a) {\n"
1108 "case 1: x = 1; break;\n"
1109 "case 2: return;\n"
1110 "case 3:\n"
1111 "case 4:\n"
1112 "case 5: return;\n"
1113 "default:\n"
1114 " y = 1;\n"
1115 " break;\n"
1116 "}",
1117 Style);
1118}
1119
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001120TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +00001121 verifyFormat("void f() {\n"
1122 " some_code();\n"
1123 "test_label:\n"
1124 " some_other_code();\n"
1125 " {\n"
1126 " some_more_code();\n"
1127 " another_label:\n"
1128 " some_more_code();\n"
1129 " }\n"
1130 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +00001131 verifyFormat("{\n"
1132 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00001133 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +00001134 " some_other_code();\n"
1135 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +00001136 verifyFormat("{\n"
1137 " some_code();\n"
1138 "test_label:;\n"
1139 " int i = 0;\n"
1140 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00001141}
1142
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001143//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001144// Tests for classes, namespaces, etc.
1145//===----------------------------------------------------------------------===//
1146
1147TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001148 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001149}
1150
1151TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1152 verifyFormat("class A {\n"
1153 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001154 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001155 "protected:\n"
1156 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001157 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001158 "};");
1159 verifyGoogleFormat("class A {\n"
1160 " public:\n"
1161 " protected:\n"
1162 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001163 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001164 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001165 verifyFormat("class A {\n"
1166 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001167 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001168 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001169 " void f2() {}\n"
1170 "protected slots:\n"
1171 " void f3() {}\n"
1172 "protected Q_SLOTS:\n"
1173 " void f4() {}\n"
1174 "private slots:\n"
1175 " void f5() {}\n"
1176 "private Q_SLOTS:\n"
1177 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001178 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001179 " void g1();\n"
1180 "Q_SIGNALS:\n"
1181 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001182 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001183
1184 // Don't interpret 'signals' the wrong way.
1185 verifyFormat("signals.set();");
1186 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001187 verifyFormat("{\n"
1188 " signals.set(); // This needs indentation.\n"
1189 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001190 verifyFormat("void f() {\n"
1191 "label:\n"
1192 " signals.baz();\n"
1193 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001194}
1195
Alexander Kornienkofd433362013-03-27 17:08:02 +00001196TEST_F(FormatTest, SeparatesLogicalBlocks) {
1197 EXPECT_EQ("class A {\n"
1198 "public:\n"
1199 " void f();\n"
1200 "\n"
1201 "private:\n"
1202 " void g() {}\n"
1203 " // test\n"
1204 "protected:\n"
1205 " int h;\n"
1206 "};",
1207 format("class A {\n"
1208 "public:\n"
1209 "void f();\n"
1210 "private:\n"
1211 "void g() {}\n"
1212 "// test\n"
1213 "protected:\n"
1214 "int h;\n"
1215 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001216 EXPECT_EQ("class A {\n"
1217 "protected:\n"
1218 "public:\n"
1219 " void f();\n"
1220 "};",
1221 format("class A {\n"
1222 "protected:\n"
1223 "\n"
1224 "public:\n"
1225 "\n"
1226 " void f();\n"
1227 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00001228
1229 // Even ensure proper spacing inside macros.
1230 EXPECT_EQ("#define B \\\n"
1231 " class A { \\\n"
1232 " protected: \\\n"
1233 " public: \\\n"
1234 " void f(); \\\n"
1235 " };",
1236 format("#define B \\\n"
1237 " class A { \\\n"
1238 " protected: \\\n"
1239 " \\\n"
1240 " public: \\\n"
1241 " \\\n"
1242 " void f(); \\\n"
1243 " };",
1244 getGoogleStyle()));
1245 // But don't remove empty lines after macros ending in access specifiers.
1246 EXPECT_EQ("#define A private:\n"
1247 "\n"
1248 "int i;",
1249 format("#define A private:\n"
1250 "\n"
1251 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00001252}
1253
Daniel Jasper83193602013-04-05 17:22:09 +00001254TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001255 verifyFormat("class A : public B {};");
1256 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001257
1258 verifyFormat(
1259 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001260 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001261 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1262 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001263 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001264 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001265 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001266 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1267 " public C,\n"
1268 " public D,\n"
1269 " public E,\n"
1270 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001271 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001272
1273 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001274 " ReallyReallyLongClassName {\n"
1275 " int i;\n"
1276 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001277 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001278 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1279 " aaaaaaaaaaaaaaaa> {};");
1280 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1281 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1282 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001283 verifyFormat("template <class R, class C>\n"
1284 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1285 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001286 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001287}
1288
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001289TEST_F(FormatTest, BreakBeforeInheritanceComma) {
1290 FormatStyle StyleWithInheritanceBreak = getLLVMStyle();
1291 StyleWithInheritanceBreak.BreakBeforeInheritanceComma = true;
1292
1293 verifyFormat("class MyClass : public X {};", StyleWithInheritanceBreak);
1294 verifyFormat("class MyClass\n"
1295 " : public X\n"
1296 " , public Y {};",
1297 StyleWithInheritanceBreak);
1298}
1299
Manuel Klimek28cacc72013-01-07 18:10:23 +00001300TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001301 verifyFormat("class A {\n} a, b;");
1302 verifyFormat("struct A {\n} a, b;");
1303 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001304}
1305
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001306TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001307 verifyFormat("enum {\n"
1308 " Zero,\n"
1309 " One = 1,\n"
1310 " Two = One + 1,\n"
1311 " Three = (One + Two),\n"
1312 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1313 " Five = (One, Two, Three, Four, 5)\n"
1314 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001315 verifyGoogleFormat("enum {\n"
1316 " Zero,\n"
1317 " One = 1,\n"
1318 " Two = One + 1,\n"
1319 " Three = (One + Two),\n"
1320 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1321 " Five = (One, Two, Three, Four, 5)\n"
1322 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001323 verifyFormat("enum Enum {};");
1324 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001325 verifyFormat("enum X E {} d;");
1326 verifyFormat("enum __attribute__((...)) E {} d;");
1327 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001328 verifyFormat("enum {\n"
1329 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001330 "};",
1331 getLLVMStyleWithColumns(30));
1332
1333 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001334 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001335
1336 EXPECT_EQ("enum KeepEmptyLines {\n"
1337 " ONE,\n"
1338 "\n"
1339 " TWO,\n"
1340 "\n"
1341 " THREE\n"
1342 "}",
1343 format("enum KeepEmptyLines {\n"
1344 " ONE,\n"
1345 "\n"
1346 " TWO,\n"
1347 "\n"
1348 "\n"
1349 " THREE\n"
1350 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001351 verifyFormat("enum E { // comment\n"
1352 " ONE,\n"
1353 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001354 "};\n"
1355 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001356 // Not enums.
1357 verifyFormat("enum X f() {\n"
1358 " a();\n"
1359 " return 42;\n"
1360 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001361 verifyFormat("enum X Type::f() {\n"
1362 " a();\n"
1363 " return 42;\n"
1364 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001365 verifyFormat("enum ::X f() {\n"
1366 " a();\n"
1367 " return 42;\n"
1368 "}");
1369 verifyFormat("enum ns::X f() {\n"
1370 " a();\n"
1371 " return 42;\n"
1372 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001373}
1374
Daniel Jasperb7150872013-08-30 10:10:19 +00001375TEST_F(FormatTest, FormatsEnumsWithErrors) {
1376 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001377 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001378 " Two = 1;\n"
1379 "};");
1380 verifyFormat("namespace n {\n"
1381 "enum Type {\n"
1382 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001383 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001384 " int i;\n"
1385 "}\n"
1386 "void g() {}");
1387}
1388
Daniel Jasper2b41a822013-08-20 12:42:50 +00001389TEST_F(FormatTest, FormatsEnumStruct) {
1390 verifyFormat("enum struct {\n"
1391 " Zero,\n"
1392 " One = 1,\n"
1393 " Two = One + 1,\n"
1394 " Three = (One + Two),\n"
1395 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1396 " Five = (One, Two, Three, Four, 5)\n"
1397 "};");
1398 verifyFormat("enum struct Enum {};");
1399 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001400 verifyFormat("enum struct X E {} d;");
1401 verifyFormat("enum struct __attribute__((...)) E {} d;");
1402 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001403 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1404}
1405
1406TEST_F(FormatTest, FormatsEnumClass) {
1407 verifyFormat("enum class {\n"
1408 " Zero,\n"
1409 " One = 1,\n"
1410 " Two = One + 1,\n"
1411 " Three = (One + Two),\n"
1412 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1413 " Five = (One, Two, Three, Four, 5)\n"
1414 "};");
1415 verifyFormat("enum class Enum {};");
1416 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001417 verifyFormat("enum class X E {} d;");
1418 verifyFormat("enum class __attribute__((...)) E {} d;");
1419 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001420 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1421}
1422
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001423TEST_F(FormatTest, FormatsEnumTypes) {
1424 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001425 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001426 " B\n"
1427 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001428 verifyFormat("enum X : int { A, B };");
1429 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001430}
1431
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001432TEST_F(FormatTest, FormatsTypedefEnum) {
1433 FormatStyle Style = getLLVMStyle();
1434 Style.ColumnLimit = 40;
1435 verifyFormat("typedef enum {} EmptyEnum;");
1436 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1437 verifyFormat("typedef enum {\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001438 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001439 " ONE = 1,\n"
1440 " TWO = 2,\n"
1441 " THREE = 3\n"
1442 "} LongEnum;",
1443 Style);
1444 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1445 Style.BraceWrapping.AfterEnum = true;
1446 verifyFormat("typedef enum {} EmptyEnum;");
1447 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1448 verifyFormat("typedef enum\n"
1449 "{\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001450 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001451 " ONE = 1,\n"
1452 " TWO = 2,\n"
1453 " THREE = 3\n"
1454 "} LongEnum;",
1455 Style);
1456}
1457
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001458TEST_F(FormatTest, FormatsNSEnums) {
1459 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1460 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1461 " // Information about someDecentlyLongValue.\n"
1462 " someDecentlyLongValue,\n"
1463 " // Information about anotherDecentlyLongValue.\n"
1464 " anotherDecentlyLongValue,\n"
1465 " // Information about aThirdDecentlyLongValue.\n"
1466 " aThirdDecentlyLongValue\n"
1467 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001468 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1469 " a = 1,\n"
1470 " b = 2,\n"
1471 " c = 3,\n"
1472 "};");
1473 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1474 " a = 1,\n"
1475 " b = 2,\n"
1476 " c = 3,\n"
1477 "};");
1478 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1479 " a = 1,\n"
1480 " b = 2,\n"
1481 " c = 3,\n"
1482 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001483}
1484
Nico Weber7769a902013-01-14 05:49:49 +00001485TEST_F(FormatTest, FormatsBitfields) {
1486 verifyFormat("struct Bitfields {\n"
1487 " unsigned sClass : 8;\n"
1488 " unsigned ValueKind : 2;\n"
1489 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001490 verifyFormat("struct A {\n"
1491 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1492 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1493 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001494 verifyFormat("struct MyStruct {\n"
1495 " uchar data;\n"
1496 " uchar : 8;\n"
1497 " uchar : 8;\n"
1498 " uchar other;\n"
1499 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001500}
1501
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001502TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001503 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1504 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1505
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001506 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001507 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001508 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001509 "}",
1510 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001511 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001512 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001513 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001514 "}",
1515 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001516 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001517 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001518 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001519 "}",
1520 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001521 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001522 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001523 "void f() { f(); }",
1524 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001525
1526 // This code is more common than we thought; if we
1527 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001528 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001529 verifyFormat("namespace {};",
1530 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001531 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001532 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001533 "};",
1534 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001535
1536 verifyFormat("namespace {\n"
1537 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001538 "} // namespace",
1539 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001540 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1541 "#define HEADER_GUARD\n"
1542 "namespace my_namespace {\n"
1543 "int i;\n"
1544 "} // my_namespace\n"
1545 "#endif // HEADER_GUARD",
1546 format("#ifndef HEADER_GUARD\n"
1547 " #define HEADER_GUARD\n"
1548 " namespace my_namespace {\n"
1549 "int i;\n"
1550 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001551 "#endif // HEADER_GUARD",
1552 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001553
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001554 EXPECT_EQ("namespace A::B {\n"
1555 "class C {};\n"
1556 "}",
1557 format("namespace A::B {\n"
1558 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001559 "}",
1560 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001561
Daniel Jasper65ee3472013-07-31 23:16:02 +00001562 FormatStyle Style = getLLVMStyle();
1563 Style.NamespaceIndentation = FormatStyle::NI_All;
1564 EXPECT_EQ("namespace out {\n"
1565 " int i;\n"
1566 " namespace in {\n"
1567 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001568 " } // namespace in\n"
1569 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001570 format("namespace out {\n"
1571 "int i;\n"
1572 "namespace in {\n"
1573 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001574 "} // namespace in\n"
1575 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001576 Style));
1577
1578 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1579 EXPECT_EQ("namespace out {\n"
1580 "int i;\n"
1581 "namespace in {\n"
1582 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001583 "} // namespace in\n"
1584 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001585 format("namespace out {\n"
1586 "int i;\n"
1587 "namespace in {\n"
1588 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001589 "} // namespace in\n"
1590 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001591 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001592}
1593
Francois Ferrande56a8292017-06-14 12:29:47 +00001594TEST_F(FormatTest, FormatsCompactNamespaces) {
1595 FormatStyle Style = getLLVMStyle();
1596 Style.CompactNamespaces = true;
1597
1598 verifyFormat("namespace A { namespace B {\n"
1599 "}} // namespace A::B",
1600 Style);
1601
1602 EXPECT_EQ("namespace out { namespace in {\n"
1603 "}} // namespace out::in",
1604 format("namespace out {\n"
1605 "namespace in {\n"
1606 "} // namespace in\n"
1607 "} // namespace out",
1608 Style));
1609
1610 // Only namespaces which have both consecutive opening and end get compacted
1611 EXPECT_EQ("namespace out {\n"
1612 "namespace in1 {\n"
1613 "} // namespace in1\n"
1614 "namespace in2 {\n"
1615 "} // namespace in2\n"
1616 "} // namespace out",
1617 format("namespace out {\n"
1618 "namespace in1 {\n"
1619 "} // namespace in1\n"
1620 "namespace in2 {\n"
1621 "} // namespace in2\n"
1622 "} // namespace out",
1623 Style));
1624
1625 EXPECT_EQ("namespace out {\n"
1626 "int i;\n"
1627 "namespace in {\n"
1628 "int j;\n"
1629 "} // namespace in\n"
1630 "int k;\n"
1631 "} // namespace out",
1632 format("namespace out { int i;\n"
1633 "namespace in { int j; } // namespace in\n"
1634 "int k; } // namespace out",
1635 Style));
1636
1637 EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1638 "}}} // namespace A::B::C\n",
1639 format("namespace A { namespace B {\n"
1640 "namespace C {\n"
1641 "}} // namespace B::C\n"
1642 "} // namespace A\n",
1643 Style));
1644
1645 Style.ColumnLimit = 40;
1646 EXPECT_EQ("namespace aaaaaaaaaa {\n"
1647 "namespace bbbbbbbbbb {\n"
1648 "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1649 format("namespace aaaaaaaaaa {\n"
1650 "namespace bbbbbbbbbb {\n"
1651 "} // namespace bbbbbbbbbb\n"
1652 "} // namespace aaaaaaaaaa",
1653 Style));
1654
1655 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1656 "namespace cccccc {\n"
1657 "}}} // namespace aaaaaa::bbbbbb::cccccc",
1658 format("namespace aaaaaa {\n"
1659 "namespace bbbbbb {\n"
1660 "namespace cccccc {\n"
1661 "} // namespace cccccc\n"
1662 "} // namespace bbbbbb\n"
1663 "} // namespace aaaaaa",
1664 Style));
1665 Style.ColumnLimit = 80;
1666
1667 // Extra semicolon after 'inner' closing brace prevents merging
1668 EXPECT_EQ("namespace out { namespace in {\n"
1669 "}; } // namespace out::in",
1670 format("namespace out {\n"
1671 "namespace in {\n"
1672 "}; // namespace in\n"
1673 "} // namespace out",
1674 Style));
1675
1676 // Extra semicolon after 'outer' closing brace is conserved
1677 EXPECT_EQ("namespace out { namespace in {\n"
1678 "}}; // namespace out::in",
1679 format("namespace out {\n"
1680 "namespace in {\n"
1681 "} // namespace in\n"
1682 "}; // namespace out",
1683 Style));
1684
1685 Style.NamespaceIndentation = FormatStyle::NI_All;
1686 EXPECT_EQ("namespace out { namespace in {\n"
1687 " int i;\n"
1688 "}} // namespace out::in",
1689 format("namespace out {\n"
1690 "namespace in {\n"
1691 "int i;\n"
1692 "} // namespace in\n"
1693 "} // namespace out",
1694 Style));
1695 EXPECT_EQ("namespace out { namespace mid {\n"
1696 " namespace in {\n"
1697 " int j;\n"
1698 " } // namespace in\n"
1699 " int k;\n"
1700 "}} // namespace out::mid",
1701 format("namespace out { namespace mid {\n"
1702 "namespace in { int j; } // namespace in\n"
1703 "int k; }} // namespace out::mid",
1704 Style));
1705
1706 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1707 EXPECT_EQ("namespace out { namespace in {\n"
1708 " int i;\n"
1709 "}} // namespace out::in",
1710 format("namespace out {\n"
1711 "namespace in {\n"
1712 "int i;\n"
1713 "} // namespace in\n"
1714 "} // namespace out",
1715 Style));
1716 EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1717 " int i;\n"
1718 "}}} // namespace out::mid::in",
1719 format("namespace out {\n"
1720 "namespace mid {\n"
1721 "namespace in {\n"
1722 "int i;\n"
1723 "} // namespace in\n"
1724 "} // namespace mid\n"
1725 "} // namespace out",
1726 Style));
1727}
1728
Krasimir Georgievd6ce9372017-09-15 11:23:50 +00001729TEST_F(FormatTest, FormatsExternC) {
1730 verifyFormat("extern \"C\" {\nint a;");
1731 verifyFormat("extern \"C\" {}");
1732 verifyFormat("extern \"C\" {\n"
1733 "int foo();\n"
1734 "}");
1735 verifyFormat("extern \"C\" int foo() {}");
1736 verifyFormat("extern \"C\" int foo();");
1737 verifyFormat("extern \"C\" int foo() {\n"
1738 " int i = 42;\n"
1739 " return i;\n"
1740 "}");
1741
1742 FormatStyle Style = getLLVMStyle();
1743 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1744 Style.BraceWrapping.AfterFunction = true;
1745 verifyFormat("extern \"C\" int foo() {}", Style);
1746 verifyFormat("extern \"C\" int foo();", Style);
1747 verifyFormat("extern \"C\" int foo()\n"
1748 "{\n"
1749 " int i = 42;\n"
1750 " return i;\n"
1751 "}",
1752 Style);
1753
1754 Style.BraceWrapping.AfterExternBlock = true;
1755 Style.BraceWrapping.SplitEmptyRecord = false;
1756 verifyFormat("extern \"C\"\n"
1757 "{}",
1758 Style);
1759 verifyFormat("extern \"C\"\n"
1760 "{\n"
1761 " int foo();\n"
1762 "}",
1763 Style);
1764}
Manuel Klimekae610d12013-01-21 14:32:05 +00001765
Daniel Jasper40aacf42013-03-14 13:45:21 +00001766TEST_F(FormatTest, FormatsInlineASM) {
1767 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001768 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001769 verifyFormat(
1770 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1771 " \"cpuid\\n\\t\"\n"
1772 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001773 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001774 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001775 EXPECT_EQ(
1776 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001777 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001778 " mov edx,[that] // vtable in edx\n"
1779 " mov eax,methodIndex\n"
1780 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001781 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001782 "}",
1783 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1784 " __asm {\n"
1785 " mov edx,[that] // vtable in edx\n"
1786 " mov eax,methodIndex\n"
1787 " call [edx][eax*4] // stdcall\n"
1788 " }\n"
1789 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001790 EXPECT_EQ("_asm {\n"
1791 " xor eax, eax;\n"
1792 " cpuid;\n"
1793 "}",
1794 format("_asm {\n"
1795 " xor eax, eax;\n"
1796 " cpuid;\n"
1797 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001798 verifyFormat("void function() {\n"
1799 " // comment\n"
1800 " asm(\"\");\n"
1801 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001802 EXPECT_EQ("__asm {\n"
1803 "}\n"
1804 "int i;",
1805 format("__asm {\n"
1806 "}\n"
1807 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001808}
1809
Nico Weberd5650bd2013-01-07 16:36:17 +00001810TEST_F(FormatTest, FormatTryCatch) {
1811 verifyFormat("try {\n"
1812 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001813 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001814 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001815 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001816 " exit(42);\n"
1817 "}");
1818
1819 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001820 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001821 " return 5;\n"
1822 "}");
1823 verifyFormat("class A {\n"
1824 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001825 " A() try : a(0) {\n"
1826 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001827 " throw;\n"
1828 " }\n"
1829 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001830
1831 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001832 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001833}
1834
Nico Weberfac23712015-02-04 15:26:27 +00001835TEST_F(FormatTest, FormatSEHTryCatch) {
1836 verifyFormat("__try {\n"
1837 " int a = b * c;\n"
1838 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1839 " // Do nothing.\n"
1840 "}");
1841
1842 verifyFormat("__try {\n"
1843 " int a = b * c;\n"
1844 "} __finally {\n"
1845 " // Do nothing.\n"
1846 "}");
1847
1848 verifyFormat("DEBUG({\n"
1849 " __try {\n"
1850 " } __finally {\n"
1851 " }\n"
1852 "});\n");
1853}
1854
Daniel Jasper04a71a42014-05-08 11:58:24 +00001855TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1856 verifyFormat("try {\n"
1857 " f();\n"
1858 "} catch {\n"
1859 " g();\n"
1860 "}");
1861 verifyFormat("try {\n"
1862 " f();\n"
1863 "} catch (A a) MACRO(x) {\n"
1864 " g();\n"
1865 "} catch (B b) MACRO(x) {\n"
1866 " g();\n"
1867 "}");
1868}
1869
1870TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1871 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001872 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1873 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001874 Style.BreakBeforeBraces = BraceStyle;
1875 verifyFormat("try {\n"
1876 " // something\n"
1877 "} catch (...) {\n"
1878 " // something\n"
1879 "}",
1880 Style);
1881 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001882 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1883 verifyFormat("try {\n"
1884 " // something\n"
1885 "}\n"
1886 "catch (...) {\n"
1887 " // something\n"
1888 "}",
1889 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001890 verifyFormat("__try {\n"
1891 " // something\n"
1892 "}\n"
1893 "__finally {\n"
1894 " // something\n"
1895 "}",
1896 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001897 verifyFormat("@try {\n"
1898 " // something\n"
1899 "}\n"
1900 "@finally {\n"
1901 " // something\n"
1902 "}",
1903 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001904 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1905 verifyFormat("try\n"
1906 "{\n"
1907 " // something\n"
1908 "}\n"
1909 "catch (...)\n"
1910 "{\n"
1911 " // something\n"
1912 "}",
1913 Style);
1914 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1915 verifyFormat("try\n"
1916 " {\n"
1917 " // something\n"
1918 " }\n"
1919 "catch (...)\n"
1920 " {\n"
1921 " // something\n"
1922 " }",
1923 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001924 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1925 Style.BraceWrapping.BeforeCatch = true;
1926 verifyFormat("try {\n"
1927 " // something\n"
1928 "}\n"
1929 "catch (...) {\n"
1930 " // something\n"
1931 "}",
1932 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001933}
1934
Daniel Jaspere25509f2012-12-17 11:29:41 +00001935TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001936 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001937
Daniel Jaspera44991332015-04-29 13:06:49 +00001938 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1939 " 100000000, "
1940 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001941
Daniel Jasper473c62c2013-05-17 09:35:01 +00001942 // Here, everything other than the "}" would fit on a line.
1943 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001944 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001945 EXPECT_EQ("S s = {a,\n"
1946 "\n"
1947 " b};",
1948 format("S s = {\n"
1949 " a,\n"
1950 "\n"
1951 " b\n"
1952 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001953
1954 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1955 // line. However, the formatting looks a bit off and this probably doesn't
1956 // happen often in practice.
1957 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001958 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001959 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001960}
1961
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001962TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001963 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1964 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1965 " .bbbbbbbbbb = 2,\n"
1966 " .cccccccccc = 3,\n"
1967 " .dddddddddd = 4,\n"
1968 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001969 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001970 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1971 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1972 " .ccccccccccccccccccccccccccc = 3,\n"
1973 " .ddddddddddddddddddddddddddd = 4,\n"
1974 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001975
1976 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00001977
1978 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
1979 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
1980 " [2] = bbbbbbbbbb,\n"
1981 " [3] = cccccccccc,\n"
1982 " [4] = dddddddddd,\n"
1983 " [5] = eeeeeeeeee};");
1984 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
1985 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1986 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
1987 " [3] = cccccccccccccccccccccccccccccccccccccc,\n"
1988 " [4] = dddddddddddddddddddddddddddddddddddddd,\n"
1989 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001990}
1991
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001992TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001993 verifyFormat("static A x = {{{}}};\n");
1994 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
1995 " {init1, init2, init3, init4}}};",
1996 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00001997
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001998 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001999 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2000 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2001 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2002 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00002003 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002004 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2005 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2006 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00002007 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2008 " {rect.fRight - rect.fLeft, rect.fBottom - "
2009 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002010
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002011 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00002012 "SomeArrayOfSomeType a = {\n"
2013 " {{1, 2, 3},\n"
2014 " {1, 2, 3},\n"
2015 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
2016 " 333333333333333333333333333333},\n"
2017 " {1, 2, 3},\n"
2018 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00002019 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00002020 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002021 " {{1, 2, 3}},\n"
2022 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002023 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2024 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002025 " {{1, 2, 3}},\n"
2026 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002027
Daniel Jaspera44991332015-04-29 13:06:49 +00002028 verifyFormat("struct {\n"
2029 " unsigned bit;\n"
2030 " const char *const name;\n"
2031 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2032 " {kOsWin, \"Windows\"},\n"
2033 " {kOsLinux, \"Linux\"},\n"
2034 " {kOsCrOS, \"Chrome OS\"}};");
2035 verifyFormat("struct {\n"
2036 " unsigned bit;\n"
2037 " const char *const name;\n"
2038 "} kBitsToOs[] = {\n"
2039 " {kOsMac, \"Mac\"},\n"
2040 " {kOsWin, \"Windows\"},\n"
2041 " {kOsLinux, \"Linux\"},\n"
2042 " {kOsCrOS, \"Chrome OS\"},\n"
2043 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002044}
2045
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002046TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2047 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2048 " \\\n"
2049 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2050}
2051
Daniel Jasperda16db32013-01-07 10:48:50 +00002052TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002053 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2054 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00002055
2056 // Do break defaulted and deleted functions.
2057 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2058 " default;",
2059 getLLVMStyleWithColumns(40));
2060 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2061 " delete;",
2062 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002063}
2064
2065TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2066 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2067 getLLVMStyleWithColumns(40));
2068 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2069 getLLVMStyleWithColumns(40));
2070 EXPECT_EQ("#define Q \\\n"
2071 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
2072 " \"aaaaaaaa.cpp\"",
2073 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2074 getLLVMStyleWithColumns(40)));
2075}
2076
2077TEST_F(FormatTest, UnderstandsLinePPDirective) {
2078 EXPECT_EQ("# 123 \"A string literal\"",
2079 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00002080}
2081
Manuel Klimek591b5802013-01-31 15:58:48 +00002082TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00002083 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00002084 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002085}
2086
2087TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2088 EXPECT_EQ("#line 42 \"test\"\n",
2089 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002090 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
2091 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002092}
2093
2094TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2095 EXPECT_EQ("#line 42 \"test\"",
2096 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002097 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002098}
2099
Daniel Jasper877615c2013-10-11 19:45:02 +00002100TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2101 verifyFormat("#define A \\x20");
2102 verifyFormat("#define A \\ x20");
2103 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
2104 verifyFormat("#define A ''");
2105 verifyFormat("#define A ''qqq");
2106 verifyFormat("#define A `qqq");
2107 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00002108 EXPECT_EQ("const char *c = STRINGIFY(\n"
2109 "\\na : b);",
2110 format("const char * c = STRINGIFY(\n"
2111 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00002112
2113 verifyFormat("a\r\\");
2114 verifyFormat("a\v\\");
2115 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00002116}
2117
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002118TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002119 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2120 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002121 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002122 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00002123 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00002124
2125 verifyFormat("#define A A\n#define A A");
2126 verifyFormat("#define A(X) A\n#define A A");
2127
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002128 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2129 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002130}
2131
2132TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002133 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002134 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002135 "#define A( \\\n"
2136 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002137 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002138 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002139 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002140 " #include \"a.h\"\n"
2141 "#define A(A,\\\n"
2142 " B)\n"
2143 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002144 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002145 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002146}
2147
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002148TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002149
2150TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2151 EXPECT_EQ("#define A \\\n"
2152 " c; \\\n"
2153 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002154 "f;",
2155 format("#define A c; e;\n"
2156 "f;",
2157 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002158}
2159
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002160TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002161
Manuel Klimek1abf7892013-01-04 23:34:14 +00002162TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002163 EXPECT_EQ("int x,\n"
2164 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002165 " y;",
2166 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002167}
2168
Manuel Klimek09e07972013-01-05 21:34:55 +00002169TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002170 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002171 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002172 verifyFormat("#define A \\\n"
2173 " { \\\n"
2174 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002175 " }",
2176 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002177
2178 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002179 " void function##X()",
2180 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002181
2182 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002183 " void a##b##c()",
2184 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002185
Daniel Jasper39825ea2013-01-14 15:40:57 +00002186 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002187}
2188
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002189TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002190 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2191 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002192}
2193
Manuel Klimek0c137952013-02-11 12:33:24 +00002194TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2195 EXPECT_EQ("#define A b;", format("#define A \\\n"
2196 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002197 " b;",
2198 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002199 EXPECT_EQ("#define A \\\n"
2200 " \\\n"
2201 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002202 " b;",
2203 format("#define A \\\n"
2204 " \\\n"
2205 " a; \\\n"
2206 " b;",
2207 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002208 EXPECT_EQ("#define A \\\n"
2209 " a; \\\n"
2210 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002211 " b;",
2212 format("#define A \\\n"
2213 " a; \\\n"
2214 " \\\n"
2215 " b;",
2216 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002217}
2218
Daniel Jasper00475962013-02-19 17:14:38 +00002219TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002220 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002221 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002222 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002223 " case 2\n",
2224 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002225 verifyFormat("#define MACRO(a) \\\n"
2226 " if (a) \\\n"
2227 " f(); \\\n"
2228 " else \\\n"
2229 " g()",
2230 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002231 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002232 verifyIncompleteFormat("#define STR(x) #x\n"
2233 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002234 verifyFormat("#pragma omp threadprivate( \\\n"
2235 " y)), // expected-warning",
2236 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002237 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002238 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002239 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002240 "#define b \\\n"
2241 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002242 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002243 "a",
2244 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002245 verifyFormat("#define A \\\n"
2246 " { \\\n"
2247 " {\n"
2248 "#define B \\\n"
2249 " } \\\n"
2250 " }",
2251 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002252 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002253 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002254 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002255 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002256}
2257
Daniel Jasper40e19212013-05-29 13:16:10 +00002258TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2259 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2260 EXPECT_EQ("class A : public QObject {\n"
2261 " Q_OBJECT\n"
2262 "\n"
2263 " A() {}\n"
2264 "};",
2265 format("class A : public QObject {\n"
2266 " Q_OBJECT\n"
2267 "\n"
2268 " A() {\n}\n"
2269 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002270 EXPECT_EQ("MACRO\n"
2271 "/*static*/ int i;",
2272 format("MACRO\n"
2273 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002274 EXPECT_EQ("SOME_MACRO\n"
2275 "namespace {\n"
2276 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002277 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00002278 format("SOME_MACRO\n"
2279 " namespace {\n"
2280 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002281 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002282 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002283 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2284 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002285 // Only if everything is upper case.
2286 EXPECT_EQ("class A : public QObject {\n"
2287 " Q_Object A() {}\n"
2288 "};",
2289 format("class A : public QObject {\n"
2290 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002291 " A() {\n}\n"
2292 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002293
2294 // Only if the next line can actually start an unwrapped line.
2295 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2296 format("SOME_WEIRD_LOG_MACRO\n"
2297 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002298
2299 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002300 "(n, buffers))\n",
2301 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002302}
2303
Alexander Kornienkode644272013-04-08 22:16:06 +00002304TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2305 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2306 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2307 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002308 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002309 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2310 "int *createScopDetectionPass() { return 0; }",
2311 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2312 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2313 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2314 " class X {};\n"
2315 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2316 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002317 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2318 // braces, so that inner block is indented one level more.
2319 EXPECT_EQ("int q() {\n"
2320 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2321 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2322 " IPC_END_MESSAGE_MAP()\n"
2323 "}",
2324 format("int q() {\n"
2325 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2326 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2327 " IPC_END_MESSAGE_MAP()\n"
2328 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002329
Daniel Jasper352dae12014-01-03 11:50:46 +00002330 // Same inside macros.
2331 EXPECT_EQ("#define LIST(L) \\\n"
2332 " L(A) \\\n"
2333 " L(B) \\\n"
2334 " L(C)",
2335 format("#define LIST(L) \\\n"
2336 " L(A) \\\n"
2337 " L(B) \\\n"
2338 " L(C)",
2339 getGoogleStyle()));
2340
Daniel Jasper545c6522013-09-17 09:26:07 +00002341 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002342 EXPECT_EQ("int q() {\n"
2343 " f(x);\n"
2344 " f(x) {}\n"
2345 " f(x)->g();\n"
2346 " f(x)->*g();\n"
2347 " f(x).g();\n"
2348 " f(x) = x;\n"
2349 " f(x) += x;\n"
2350 " f(x) -= x;\n"
2351 " f(x) *= x;\n"
2352 " f(x) /= x;\n"
2353 " f(x) %= x;\n"
2354 " f(x) &= x;\n"
2355 " f(x) |= x;\n"
2356 " f(x) ^= x;\n"
2357 " f(x) >>= x;\n"
2358 " f(x) <<= x;\n"
2359 " f(x)[y].z();\n"
2360 " LOG(INFO) << x;\n"
2361 " ifstream(x) >> x;\n"
2362 "}\n",
2363 format("int q() {\n"
2364 " f(x)\n;\n"
2365 " f(x)\n {}\n"
2366 " f(x)\n->g();\n"
2367 " f(x)\n->*g();\n"
2368 " f(x)\n.g();\n"
2369 " f(x)\n = x;\n"
2370 " f(x)\n += x;\n"
2371 " f(x)\n -= x;\n"
2372 " f(x)\n *= x;\n"
2373 " f(x)\n /= x;\n"
2374 " f(x)\n %= x;\n"
2375 " f(x)\n &= x;\n"
2376 " f(x)\n |= x;\n"
2377 " f(x)\n ^= x;\n"
2378 " f(x)\n >>= x;\n"
2379 " f(x)\n <<= x;\n"
2380 " f(x)\n[y].z();\n"
2381 " LOG(INFO)\n << x;\n"
2382 " ifstream(x)\n >> x;\n"
2383 "}\n"));
2384 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002385 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002386 " if (1) {\n"
2387 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002388 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002389 " while (1) {\n"
2390 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002391 " F(x)\n"
2392 " G(x);\n"
2393 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002394 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002395 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002396 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002397 " }\n"
2398 "}\n",
2399 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002400 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002401 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002402 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002403 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002404 "F(x)\n"
2405 "G(x);\n"
2406 "F(x)\n"
2407 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002408 "}\n"));
2409 EXPECT_EQ("class A {\n"
2410 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002411 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002412 " A(X x)\n" // FIXME: function-level try blocks are broken.
2413 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002414 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002415 " }\n"
2416 "};",
2417 format("class A {\n"
2418 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002419 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002420 " A(X x)\n"
2421 " try : t(0) {} catch (...) {}\n"
2422 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002423 EXPECT_EQ("class SomeClass {\n"
2424 "public:\n"
2425 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2426 "};",
2427 format("class SomeClass {\n"
2428 "public:\n"
2429 " SomeClass()\n"
2430 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2431 "};"));
2432 EXPECT_EQ("class SomeClass {\n"
2433 "public:\n"
2434 " SomeClass()\n"
2435 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2436 "};",
2437 format("class SomeClass {\n"
2438 "public:\n"
2439 " SomeClass()\n"
2440 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2441 "};",
2442 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002443
2444 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002445}
2446
Manuel Klimek4fe43002013-05-22 12:51:29 +00002447TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2448 verifyFormat("#define A \\\n"
2449 " f({ \\\n"
2450 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002451 " });",
2452 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002453}
2454
Krasimir Georgievad47c902017-08-30 14:34:57 +00002455TEST_F(FormatTest, IndentPreprocessorDirectives) {
2456 FormatStyle Style = getLLVMStyle();
2457 Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2458 Style.ColumnLimit = 40;
2459 verifyFormat("#ifdef _WIN32\n"
2460 "#define A 0\n"
2461 "#ifdef VAR2\n"
2462 "#define B 1\n"
2463 "#include <someheader.h>\n"
2464 "#define MACRO \\\n"
2465 " some_very_long_func_aaaaaaaaaa();\n"
2466 "#endif\n"
2467 "#else\n"
2468 "#define A 1\n"
2469 "#endif",
2470 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002471 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2472 verifyFormat("#ifdef _WIN32\n"
2473 "# define A 0\n"
2474 "# ifdef VAR2\n"
2475 "# define B 1\n"
2476 "# include <someheader.h>\n"
2477 "# define MACRO \\\n"
2478 " some_very_long_func_aaaaaaaaaa();\n"
2479 "# endif\n"
2480 "#else\n"
2481 "# define A 1\n"
2482 "#endif",
2483 Style);
2484 verifyFormat("#if A\n"
2485 "# define MACRO \\\n"
2486 " void a(int x) { \\\n"
2487 " b(); \\\n"
2488 " c(); \\\n"
2489 " d(); \\\n"
2490 " e(); \\\n"
2491 " f(); \\\n"
2492 " }\n"
2493 "#endif",
2494 Style);
2495 // Comments before include guard.
2496 verifyFormat("// file comment\n"
2497 "// file comment\n"
2498 "#ifndef HEADER_H\n"
2499 "#define HEADER_H\n"
2500 "code();\n"
2501 "#endif",
2502 Style);
2503 // Test with include guards.
Krasimir Georgievad47c902017-08-30 14:34:57 +00002504 verifyFormat("#ifndef HEADER_H\n"
2505 "#define HEADER_H\n"
2506 "code();\n"
2507 "#endif",
2508 Style);
2509 // Include guards must have a #define with the same variable immediately
2510 // after #ifndef.
2511 verifyFormat("#ifndef NOT_GUARD\n"
2512 "# define FOO\n"
2513 "code();\n"
2514 "#endif",
2515 Style);
2516
2517 // Include guards must cover the entire file.
2518 verifyFormat("code();\n"
2519 "code();\n"
2520 "#ifndef NOT_GUARD\n"
2521 "# define NOT_GUARD\n"
2522 "code();\n"
2523 "#endif",
2524 Style);
2525 verifyFormat("#ifndef NOT_GUARD\n"
2526 "# define NOT_GUARD\n"
2527 "code();\n"
2528 "#endif\n"
2529 "code();",
2530 Style);
2531 // Test with trailing blank lines.
2532 verifyFormat("#ifndef HEADER_H\n"
2533 "#define HEADER_H\n"
2534 "code();\n"
2535 "#endif\n",
2536 Style);
2537 // Include guards don't have #else.
2538 verifyFormat("#ifndef NOT_GUARD\n"
2539 "# define NOT_GUARD\n"
2540 "code();\n"
2541 "#else\n"
2542 "#endif",
2543 Style);
2544 verifyFormat("#ifndef NOT_GUARD\n"
2545 "# define NOT_GUARD\n"
2546 "code();\n"
2547 "#elif FOO\n"
2548 "#endif",
2549 Style);
Mark Zeren1c3afaf2018-02-05 15:59:00 +00002550 // Non-identifier #define after potential include guard.
2551 verifyFormat("#ifndef FOO\n"
2552 "# define 1\n"
2553 "#endif\n",
2554 Style);
2555 // #if closes past last non-preprocessor line.
2556 verifyFormat("#ifndef FOO\n"
2557 "#define FOO\n"
2558 "#if 1\n"
2559 "int i;\n"
2560 "# define A 0\n"
2561 "#endif\n"
2562 "#endif\n",
2563 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002564 // FIXME: This doesn't handle the case where there's code between the
2565 // #ifndef and #define but all other conditions hold. This is because when
2566 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2567 // previous code line yet, so we can't detect it.
2568 EXPECT_EQ("#ifndef NOT_GUARD\n"
2569 "code();\n"
2570 "#define NOT_GUARD\n"
2571 "code();\n"
2572 "#endif",
2573 format("#ifndef NOT_GUARD\n"
2574 "code();\n"
2575 "# define NOT_GUARD\n"
2576 "code();\n"
2577 "#endif",
2578 Style));
2579 // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2580 // be outside an include guard. Examples are #pragma once and
2581 // #pragma GCC diagnostic, or anything else that does not change the meaning
2582 // of the file if it's included multiple times.
2583 EXPECT_EQ("#ifdef WIN32\n"
2584 "# pragma once\n"
2585 "#endif\n"
2586 "#ifndef HEADER_H\n"
2587 "# define HEADER_H\n"
2588 "code();\n"
2589 "#endif",
2590 format("#ifdef WIN32\n"
2591 "# pragma once\n"
2592 "#endif\n"
2593 "#ifndef HEADER_H\n"
2594 "#define HEADER_H\n"
2595 "code();\n"
2596 "#endif",
2597 Style));
2598 // FIXME: This does not detect when there is a single non-preprocessor line
2599 // in front of an include-guard-like structure where other conditions hold
2600 // because ScopedLineState hides the line.
2601 EXPECT_EQ("code();\n"
2602 "#ifndef HEADER_H\n"
2603 "#define HEADER_H\n"
2604 "code();\n"
2605 "#endif",
2606 format("code();\n"
2607 "#ifndef HEADER_H\n"
2608 "# define HEADER_H\n"
2609 "code();\n"
2610 "#endif",
2611 Style));
Mark Zerend2b2ac62018-01-31 20:05:50 +00002612 // Keep comments aligned with #, otherwise indent comments normally. These
2613 // tests cannot use verifyFormat because messUp manipulates leading
2614 // whitespace.
2615 {
2616 const char *Expected = ""
2617 "void f() {\n"
2618 "#if 1\n"
2619 "// Preprocessor aligned.\n"
2620 "# define A 0\n"
2621 " // Code. Separated by blank line.\n"
2622 "\n"
2623 "# define B 0\n"
2624 " // Code. Not aligned with #\n"
2625 "# define C 0\n"
2626 "#endif";
2627 const char *ToFormat = ""
2628 "void f() {\n"
2629 "#if 1\n"
2630 "// Preprocessor aligned.\n"
2631 "# define A 0\n"
2632 "// Code. Separated by blank line.\n"
2633 "\n"
2634 "# define B 0\n"
2635 " // Code. Not aligned with #\n"
2636 "# define C 0\n"
2637 "#endif";
2638 EXPECT_EQ(Expected, format(ToFormat, Style));
2639 EXPECT_EQ(Expected, format(Expected, Style));
2640 }
2641 // Keep block quotes aligned.
2642 {
2643 const char *Expected = ""
2644 "void f() {\n"
2645 "#if 1\n"
2646 "/* Preprocessor aligned. */\n"
2647 "# define A 0\n"
2648 " /* Code. Separated by blank line. */\n"
2649 "\n"
2650 "# define B 0\n"
2651 " /* Code. Not aligned with # */\n"
2652 "# define C 0\n"
2653 "#endif";
2654 const char *ToFormat = ""
2655 "void f() {\n"
2656 "#if 1\n"
2657 "/* Preprocessor aligned. */\n"
2658 "# define A 0\n"
2659 "/* Code. Separated by blank line. */\n"
2660 "\n"
2661 "# define B 0\n"
2662 " /* Code. Not aligned with # */\n"
2663 "# define C 0\n"
2664 "#endif";
2665 EXPECT_EQ(Expected, format(ToFormat, Style));
2666 EXPECT_EQ(Expected, format(Expected, Style));
2667 }
2668 // Keep comments aligned with un-indented directives.
2669 {
2670 const char *Expected = ""
2671 "void f() {\n"
2672 "// Preprocessor aligned.\n"
2673 "#define A 0\n"
2674 " // Code. Separated by blank line.\n"
2675 "\n"
2676 "#define B 0\n"
2677 " // Code. Not aligned with #\n"
2678 "#define C 0\n";
2679 const char *ToFormat = ""
2680 "void f() {\n"
2681 "// Preprocessor aligned.\n"
2682 "#define A 0\n"
2683 "// Code. Separated by blank line.\n"
2684 "\n"
2685 "#define B 0\n"
2686 " // Code. Not aligned with #\n"
2687 "#define C 0\n";
2688 EXPECT_EQ(Expected, format(ToFormat, Style));
2689 EXPECT_EQ(Expected, format(Expected, Style));
2690 }
Krasimir Georgievad47c902017-08-30 14:34:57 +00002691 // Test with tabs.
2692 Style.UseTab = FormatStyle::UT_Always;
2693 Style.IndentWidth = 8;
2694 Style.TabWidth = 8;
2695 verifyFormat("#ifdef _WIN32\n"
2696 "#\tdefine A 0\n"
2697 "#\tifdef VAR2\n"
2698 "#\t\tdefine B 1\n"
2699 "#\t\tinclude <someheader.h>\n"
2700 "#\t\tdefine MACRO \\\n"
2701 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
2702 "#\tendif\n"
2703 "#else\n"
2704 "#\tdefine A 1\n"
2705 "#endif",
2706 Style);
Daniel Jasper4df130f2017-09-04 13:33:52 +00002707
2708 // Regression test: Multiline-macro inside include guards.
2709 verifyFormat("#ifndef HEADER_H\n"
2710 "#define HEADER_H\n"
2711 "#define A() \\\n"
2712 " int i; \\\n"
2713 " int j;\n"
2714 "#endif // HEADER_H",
2715 getLLVMStyleWithColumns(20));
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002716}
2717
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002718TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002719 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002720}
2721
Manuel Klimek1058d982013-01-06 20:07:31 +00002722TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2723 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2724 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2725 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2726 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2727}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002728
Daniel Jaspere2408e32015-05-06 11:16:43 +00002729TEST_F(FormatTest, EscapedNewlines) {
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002730 FormatStyle Narrow = getLLVMStyleWithColumns(11);
2731 EXPECT_EQ("#define A \\\n int i; \\\n int j;",
2732 format("#define A \\\nint i;\\\n int j;", Narrow));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002733 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002734 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002735 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002736 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002737
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002738 FormatStyle AlignLeft = getLLVMStyle();
2739 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
2740 EXPECT_EQ("#define MACRO(x) \\\n"
2741 "private: \\\n"
2742 " int x(int a);\n",
2743 format("#define MACRO(x) \\\n"
2744 "private: \\\n"
2745 " int x(int a);\n",
2746 AlignLeft));
2747
2748 // CRLF line endings
2749 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;",
2750 format("#define A \\\r\nint i;\\\r\n int j;", Narrow));
2751 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
2752 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
2753 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */"));
2754 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
2755 EXPECT_EQ("#define MACRO(x) \\\r\n"
2756 "private: \\\r\n"
2757 " int x(int a);\r\n",
2758 format("#define MACRO(x) \\\r\n"
2759 "private: \\\r\n"
2760 " int x(int a);\r\n",
2761 AlignLeft));
2762
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002763 FormatStyle DontAlign = getLLVMStyle();
2764 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
2765 DontAlign.MaxEmptyLinesToKeep = 3;
2766 // FIXME: can't use verifyFormat here because the newline before
2767 // "public:" is not inserted the first time it's reformatted
2768 EXPECT_EQ("#define A \\\n"
2769 " class Foo { \\\n"
2770 " void bar(); \\\n"
2771 "\\\n"
2772 "\\\n"
2773 "\\\n"
2774 " public: \\\n"
2775 " void baz(); \\\n"
2776 " };",
2777 format("#define A \\\n"
2778 " class Foo { \\\n"
2779 " void bar(); \\\n"
2780 "\\\n"
2781 "\\\n"
2782 "\\\n"
2783 " public: \\\n"
2784 " void baz(); \\\n"
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002785 " };",
2786 DontAlign));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002787}
2788
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002789TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2790 verifyFormat("#define A \\\n"
2791 " int v( \\\n"
2792 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002793 " int i;",
2794 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002795}
2796
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002797TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002798 EXPECT_EQ(
2799 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2800 " \\\n"
2801 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2802 "\n"
2803 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2804 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2805 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2806 "\\\n"
2807 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2808 " \n"
2809 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2810 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002811}
2812
Manuel Klimek52b15152013-01-09 15:25:02 +00002813TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2814 EXPECT_EQ("int\n"
2815 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002816 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002817 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002818 verifyFormat("functionCallTo(\n"
2819 " someOtherFunction(\n"
2820 " withSomeParameters, whichInSequence,\n"
2821 " areLongerThanALine(andAnotherCall,\n"
2822 "#define A B\n"
2823 " withMoreParamters,\n"
2824 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002825 " andMoreParameters),\n"
2826 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002827 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002828 verifyFormat("Foo::Foo()\n"
2829 "#ifdef BAR\n"
2830 " : baz(0)\n"
2831 "#endif\n"
2832 "{\n"
2833 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002834 verifyFormat("void f() {\n"
2835 " if (true)\n"
2836 "#ifdef A\n"
2837 " f(42);\n"
2838 " x();\n"
2839 "#else\n"
2840 " g();\n"
2841 " x();\n"
2842 "#endif\n"
2843 "}");
2844 verifyFormat("void f(param1, param2,\n"
2845 " param3,\n"
2846 "#ifdef A\n"
2847 " param4(param5,\n"
2848 "#ifdef A1\n"
2849 " param6,\n"
2850 "#ifdef A2\n"
2851 " param7),\n"
2852 "#else\n"
2853 " param8),\n"
2854 " param9,\n"
2855 "#endif\n"
2856 " param10,\n"
2857 "#endif\n"
2858 " param11)\n"
2859 "#else\n"
2860 " param12)\n"
2861 "#endif\n"
2862 "{\n"
2863 " x();\n"
2864 "}",
2865 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002866 verifyFormat("#if 1\n"
2867 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002868 verifyFormat("#if 1\n"
2869 "#endif\n"
2870 "#if 1\n"
2871 "#else\n"
2872 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002873 verifyFormat("DEBUG({\n"
2874 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2875 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2876 "});\n"
2877 "#if a\n"
2878 "#else\n"
2879 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002880
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002881 verifyIncompleteFormat("void f(\n"
2882 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00002883 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002884 "#else\n"
2885 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002886}
2887
Manuel Klimek14bd9172014-01-29 08:49:02 +00002888TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2889 verifyFormat("#endif\n"
2890 "#if B");
2891}
2892
Manuel Klimek88033d72013-10-21 08:11:15 +00002893TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2894 FormatStyle SingleLine = getLLVMStyle();
2895 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002896 verifyFormat("#if 0\n"
2897 "#elif 1\n"
2898 "#endif\n"
2899 "void foo() {\n"
2900 " if (test) foo2();\n"
2901 "}",
2902 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002903}
2904
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002905TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002906 verifyFormat("functionCall({ int i; });");
2907 verifyFormat("functionCall({\n"
2908 " int i;\n"
2909 " int j;\n"
2910 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002911 verifyFormat("functionCall(\n"
2912 " {\n"
2913 " int i;\n"
2914 " int j;\n"
2915 " },\n"
2916 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002917 verifyFormat("functionA(functionB({\n"
2918 " int i;\n"
2919 " int j;\n"
2920 " }),\n"
2921 " aaaa, bbbb, cccc);");
2922 verifyFormat("functionCall(\n"
2923 " {\n"
2924 " int i;\n"
2925 " int j;\n"
2926 " },\n"
2927 " aaaa, bbbb, // comment\n"
2928 " cccc);");
2929 verifyFormat("functionA(functionB({\n"
2930 " int i;\n"
2931 " int j;\n"
2932 " }),\n"
2933 " aaaa, bbbb, // comment\n"
2934 " cccc);");
2935 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2936 verifyFormat("functionCall(aaaa, bbbb, {\n"
2937 " int i;\n"
2938 " int j;\n"
2939 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002940 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002941 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002942 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002943 " int i; // break\n"
2944 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002945 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2946 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002947 verifyFormat("DEBUG({\n"
2948 " if (a)\n"
2949 " f();\n"
2950 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002951}
2952
2953TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002954 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002955 "int i;",
2956 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002957}
2958
2959TEST_F(FormatTest, LayoutNestedBlocks) {
2960 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2961 " struct s {\n"
2962 " int i;\n"
2963 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002964 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002965 " for (int i = 0; i < 10; ++i)\n"
2966 " return;\n"
2967 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002968 verifyFormat("call(parameter, {\n"
2969 " something();\n"
2970 " // Comment using all columns.\n"
2971 " somethingelse();\n"
2972 "});",
2973 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002974 verifyFormat("DEBUG( //\n"
2975 " { f(); }, a);");
2976 verifyFormat("DEBUG( //\n"
2977 " {\n"
2978 " f(); //\n"
2979 " },\n"
2980 " a);");
2981
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002982 EXPECT_EQ("call(parameter, {\n"
2983 " something();\n"
2984 " // Comment too\n"
2985 " // looooooooooong.\n"
2986 " somethingElse();\n"
2987 "});",
2988 format("call(parameter, {\n"
2989 " something();\n"
2990 " // Comment too looooooooooong.\n"
2991 " somethingElse();\n"
2992 "});",
2993 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002994 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00002995 EXPECT_EQ("DEBUG({ // comment\n"
2996 " int i;\n"
2997 "});",
2998 format("DEBUG({ // comment\n"
2999 "int i;\n"
3000 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003001 EXPECT_EQ("DEBUG({\n"
3002 " int i;\n"
3003 "\n"
3004 " // comment\n"
3005 " int j;\n"
3006 "});",
3007 format("DEBUG({\n"
3008 " int i;\n"
3009 "\n"
3010 " // comment\n"
3011 " int j;\n"
3012 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003013
3014 verifyFormat("DEBUG({\n"
3015 " if (a)\n"
3016 " return;\n"
3017 "});");
3018 verifyGoogleFormat("DEBUG({\n"
3019 " if (a) return;\n"
3020 "});");
3021 FormatStyle Style = getGoogleStyle();
3022 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003023 verifyFormat("Debug(aaaaa,\n"
3024 " {\n"
3025 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3026 " },\n"
3027 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003028 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003029
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003030 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3031
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003032 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003033}
3034
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003035TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3036 EXPECT_EQ("#define MACRO() \\\n"
3037 " Debug(aaa, /* force line break */ \\\n"
3038 " { \\\n"
3039 " int i; \\\n"
3040 " int j; \\\n"
3041 " })",
3042 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3043 " { int i; int j; })",
3044 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003045
3046 EXPECT_EQ("#define A \\\n"
3047 " [] { \\\n"
3048 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3049 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3050 " }",
3051 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3052 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3053 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003054}
3055
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003056TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3057 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003058 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003059 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003060}
3061
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003062TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3063 FormatStyle Style = getLLVMStyle();
3064 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3065 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3066 verifyFormat("FOO_BEGIN\n"
3067 " FOO_ENTRY\n"
3068 "FOO_END", Style);
3069 verifyFormat("FOO_BEGIN\n"
3070 " NESTED_FOO_BEGIN\n"
3071 " NESTED_FOO_ENTRY\n"
3072 " NESTED_FOO_END\n"
3073 "FOO_END", Style);
3074 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3075 " int x;\n"
3076 " x = 1;\n"
3077 "FOO_END(Baz)", Style);
3078}
3079
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003080//===----------------------------------------------------------------------===//
3081// Line break tests.
3082//===----------------------------------------------------------------------===//
3083
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003084TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003085 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003086 "void f() {\n"
3087 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3088 " parameter, parameter, parameter)),\n"
3089 " SecondLongCall(parameter));\n"
3090 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003091 verifyFormat(
3092 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3093 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3094 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3095 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3096 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003097 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3098 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3099 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3100 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003101 verifyFormat(
3102 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3103 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3104 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3105 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003106 verifyFormat("int a = bbbb && ccc &&\n"
3107 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003108 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003109 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003110}
3111
Daniel Jasperd69fc772013-05-08 14:12:04 +00003112TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3113 verifyFormat(
3114 "bool aaaaaaa =\n"
3115 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3116 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003117 verifyFormat(
3118 "bool aaaaaaa =\n"
3119 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3120 " bbbbbbbb();");
3121
Daniel Jasperd69fc772013-05-08 14:12:04 +00003122 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3123 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3124 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003125 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3126 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3127 " ccccccccc == ddddddddddd;");
3128 verifyFormat(
3129 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3130 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3131 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003132
3133 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3134 " aaaaaa) &&\n"
3135 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003136 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3137 " aaaaaa) >>\n"
3138 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003139 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003140 " SourceMgr.getSpellingColumnNumber(\n"
3141 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3142 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003143
Daniel Jasper68d888c2013-06-03 08:42:05 +00003144 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3145 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3146 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00003147 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3148 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3149 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003150 verifyFormat("b = a &&\n"
3151 " // Comment\n"
3152 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003153
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003154 // If the LHS of a comparison is not a binary expression itself, the
3155 // additional linebreak confuses many people.
3156 verifyFormat(
3157 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3158 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3159 "}");
3160 verifyFormat(
3161 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3162 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3163 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003164 verifyFormat(
3165 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3166 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3167 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003168 verifyFormat(
3169 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3170 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3171 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003172 // Even explicit parentheses stress the precedence enough to make the
3173 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003174 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3175 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3176 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003177 // This cases is borderline, but with the indentation it is still readable.
3178 verifyFormat(
3179 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3180 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3181 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3182 "}",
3183 getLLVMStyleWithColumns(75));
3184
3185 // If the LHS is a binary expression, we should still use the additional break
3186 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003187 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3188 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3189 " 5) {\n"
3190 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003191 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3192 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3193 " 5) {\n"
3194 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003195
Daniel Jasper571f1af2013-05-14 20:39:56 +00003196 FormatStyle OnePerLine = getLLVMStyle();
3197 OnePerLine.BinPackParameters = false;
3198 verifyFormat(
3199 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3200 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3201 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3202 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003203
3204 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3205 " .aaa(aaaaaaaaaaaaa) *\n"
3206 " aaaaaaa +\n"
3207 " aaaaaaa;",
3208 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003209}
3210
Daniel Jasper6bee6822013-04-08 20:33:42 +00003211TEST_F(FormatTest, ExpressionIndentation) {
3212 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3213 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3214 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3215 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3216 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3217 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3218 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3219 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3220 " ccccccccccccccccccccccccccccccccccccccccc;");
3221 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3222 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3223 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3224 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3225 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3226 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3227 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3228 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3229 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3230 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3231 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3232 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003233 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003234 "} else if (aaaaa && bbbbb > // break\n"
3235 " ccccc) {\n"
3236 "}");
3237 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003238 "} else if (aaaaa &&\n"
3239 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003240 " ccccc &&\n"
3241 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003242 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003243
3244 // Presence of a trailing comment used to change indentation of b.
3245 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3246 " b;\n"
3247 "return aaaaaaaaaaaaaaaaaaa +\n"
3248 " b; //",
3249 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003250}
3251
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003252TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3253 // Not sure what the best system is here. Like this, the LHS can be found
3254 // immediately above an operator (everything with the same or a higher
3255 // indent). The RHS is aligned right of the operator and so compasses
3256 // everything until something with the same indent as the operator is found.
3257 // FIXME: Is this a good system?
3258 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003259 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003260 verifyFormat(
3261 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003262 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3263 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3264 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3265 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3266 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003267 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003268 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3269 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003270 Style);
3271 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003272 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3273 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003274 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3275 Style);
3276 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003277 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3278 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003279 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3280 Style);
3281 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3282 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003283 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3284 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003285 Style);
3286 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003287 "} else if (aaaaa\n"
3288 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003289 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003290 "}",
3291 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003292 verifyFormat("return (a)\n"
3293 " // comment\n"
3294 " + b;",
3295 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003296 verifyFormat(
3297 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3298 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3299 " + cc;",
3300 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003301
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003302 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3303 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3304 Style);
3305
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003306 // Forced by comments.
3307 verifyFormat(
3308 "unsigned ContentSize =\n"
3309 " sizeof(int16_t) // DWARF ARange version number\n"
3310 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3311 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3312 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003313
3314 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3315 " == boost::fusion::at_c<1>(iiii).second;",
3316 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003317
3318 Style.ColumnLimit = 60;
3319 verifyFormat("zzzzzzzzzz\n"
3320 " = bbbbbbbbbbbbbbbbb\n"
3321 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3322 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003323}
3324
Daniel Jasperb1270392017-02-01 23:27:37 +00003325TEST_F(FormatTest, EnforcedOperatorWraps) {
3326 // Here we'd like to wrap after the || operators, but a comment is forcing an
3327 // earlier wrap.
3328 verifyFormat("bool x = aaaaa //\n"
3329 " || bbbbb\n"
3330 " //\n"
3331 " || cccc;");
3332}
3333
Daniel Jasper3219e432014-12-02 13:24:51 +00003334TEST_F(FormatTest, NoOperandAlignment) {
3335 FormatStyle Style = getLLVMStyle();
3336 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00003337 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3338 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3339 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3340 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003341 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003342 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3343 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3344 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3345 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3346 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3347 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3348 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3349 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3350 " > ccccccccccccccccccccccccccccccccccccccccc;",
3351 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003352
3353 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3354 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3355 " + cc;",
3356 Style);
3357 verifyFormat("int a = aa\n"
3358 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003359 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00003360 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003361
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003362 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003363 verifyFormat("return (a > b\n"
3364 " // comment1\n"
3365 " // comment2\n"
3366 " || c);",
3367 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003368}
3369
Daniel Jasperac043c92014-09-15 11:11:00 +00003370TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3371 FormatStyle Style = getLLVMStyle();
3372 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3373 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3374 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003375 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3376 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003377}
3378
Daniel Jasper988e7e42017-05-08 15:07:52 +00003379TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3380 FormatStyle Style = getLLVMStyle();
3381 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3382 Style.BinPackArguments = false;
3383 Style.ColumnLimit = 40;
3384 verifyFormat("void test() {\n"
3385 " someFunction(\n"
3386 " this + argument + is + quite\n"
3387 " + long + so + it + gets + wrapped\n"
3388 " + but + remains + bin - packed);\n"
3389 "}",
3390 Style);
3391 verifyFormat("void test() {\n"
3392 " someFunction(arg1,\n"
3393 " this + argument + is\n"
3394 " + quite + long + so\n"
3395 " + it + gets + wrapped\n"
3396 " + but + remains + bin\n"
3397 " - packed,\n"
3398 " arg3);\n"
3399 "}",
3400 Style);
3401 verifyFormat("void test() {\n"
3402 " someFunction(\n"
3403 " arg1,\n"
3404 " this + argument + has\n"
3405 " + anotherFunc(nested,\n"
3406 " calls + whose\n"
3407 " + arguments\n"
3408 " + are + also\n"
3409 " + wrapped,\n"
3410 " in + addition)\n"
3411 " + to + being + bin - packed,\n"
3412 " arg3);\n"
3413 "}",
3414 Style);
3415
3416 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3417 verifyFormat("void test() {\n"
3418 " someFunction(\n"
3419 " arg1,\n"
3420 " this + argument + has +\n"
3421 " anotherFunc(nested,\n"
3422 " calls + whose +\n"
3423 " arguments +\n"
3424 " are + also +\n"
3425 " wrapped,\n"
3426 " in + addition) +\n"
3427 " to + being + bin - packed,\n"
3428 " arg3);\n"
3429 "}",
3430 Style);
3431}
3432
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003433TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003434 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003435 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3436 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003437 verifyFormat("Constructor()\n"
3438 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003439 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003440 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003441 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003442 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003443
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003444 verifyFormat("template <typename T>\n"
3445 "Constructor() : Initializer(FitsOnTheLine) {}",
3446 getLLVMStyleWithColumns(45));
3447
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003448 verifyFormat(
3449 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003450 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003451
3452 verifyFormat(
3453 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003454 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003455 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003456 verifyFormat(
3457 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003458 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003459 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003460 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3461 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3462 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003463
3464 verifyFormat("Constructor()\n"
3465 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3466 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3467 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003468 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003469
Daniel Jasper65585ed2013-01-28 13:31:35 +00003470 verifyFormat("Constructor()\n"
3471 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003472 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003473
Daniel Jasper62e68172013-02-25 15:59:54 +00003474 verifyFormat("Constructor(int Parameter = 0)\n"
3475 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3476 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003477 verifyFormat("Constructor()\n"
3478 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3479 "}",
3480 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003481 verifyFormat("Constructor()\n"
3482 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3483 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003484
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003485 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003486 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003487 verifyFormat("Constructor()\n"
3488 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3489 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3490 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003491
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003492 FormatStyle OnePerLine = getLLVMStyle();
3493 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003494 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003495 verifyFormat("SomeClass::Constructor()\n"
3496 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3497 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003498 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003499 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003500 verifyFormat("SomeClass::Constructor()\n"
3501 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3502 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003503 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003504 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003505 verifyFormat("MyClass::MyClass(int var)\n"
3506 " : some_var_(var), // 4 space indent\n"
3507 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003508 "}",
3509 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003510 verifyFormat("Constructor()\n"
3511 " : aaaaa(aaaaaa),\n"
3512 " aaaaa(aaaaaa),\n"
3513 " aaaaa(aaaaaa),\n"
3514 " aaaaa(aaaaaa),\n"
3515 " aaaaa(aaaaaa) {}",
3516 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003517 verifyFormat("Constructor()\n"
3518 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3519 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3520 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003521 OnePerLine.BinPackParameters = false;
3522 verifyFormat(
3523 "Constructor()\n"
3524 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3525 " aaaaaaaaaaa().aaa(),\n"
3526 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3527 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003528 OnePerLine.ColumnLimit = 60;
3529 verifyFormat("Constructor()\n"
3530 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3531 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3532 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003533
3534 EXPECT_EQ("Constructor()\n"
3535 " : // Comment forcing unwanted break.\n"
3536 " aaaa(aaaa) {}",
3537 format("Constructor() :\n"
3538 " // Comment forcing unwanted break.\n"
3539 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003540}
3541
Francois Ferranda6b6d512017-05-24 11:36:58 +00003542TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3543 FormatStyle Style = getLLVMStyle();
3544 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3545
3546 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3547 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3548 getStyleWithColumns(Style, 45));
3549 verifyFormat("Constructor() :\n"
3550 " Initializer(FitsOnTheLine) {}",
3551 getStyleWithColumns(Style, 44));
3552 verifyFormat("Constructor() :\n"
3553 " Initializer(FitsOnTheLine) {}",
3554 getStyleWithColumns(Style, 43));
3555
3556 verifyFormat("template <typename T>\n"
3557 "Constructor() : Initializer(FitsOnTheLine) {}",
3558 getStyleWithColumns(Style, 50));
3559
3560 verifyFormat(
3561 "SomeClass::Constructor() :\n"
3562 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3563 Style);
3564
3565 verifyFormat(
3566 "SomeClass::Constructor() :\n"
3567 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3568 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3569 Style);
3570 verifyFormat(
3571 "SomeClass::Constructor() :\n"
3572 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3573 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3574 Style);
3575 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3576 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3577 " aaaaaaaaaa(aaaaaa) {}",
3578 Style);
3579
3580 verifyFormat("Constructor() :\n"
3581 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3582 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3583 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3584 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3585 Style);
3586
3587 verifyFormat("Constructor() :\n"
3588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3589 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3590 Style);
3591
3592 verifyFormat("Constructor(int Parameter = 0) :\n"
3593 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3594 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3595 Style);
3596 verifyFormat("Constructor() :\n"
3597 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3598 "}",
3599 getStyleWithColumns(Style, 60));
3600 verifyFormat("Constructor() :\n"
3601 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3602 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3603 Style);
3604
3605 // Here a line could be saved by splitting the second initializer onto two
3606 // lines, but that is not desirable.
3607 verifyFormat("Constructor() :\n"
3608 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3609 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3610 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3611 Style);
3612
3613 FormatStyle OnePerLine = Style;
3614 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3615 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3616 verifyFormat("SomeClass::Constructor() :\n"
3617 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3618 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3619 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3620 OnePerLine);
3621 verifyFormat("SomeClass::Constructor() :\n"
3622 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3623 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3624 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3625 OnePerLine);
3626 verifyFormat("MyClass::MyClass(int var) :\n"
3627 " some_var_(var), // 4 space indent\n"
3628 " some_other_var_(var + 1) { // lined up\n"
3629 "}",
3630 OnePerLine);
3631 verifyFormat("Constructor() :\n"
3632 " aaaaa(aaaaaa),\n"
3633 " aaaaa(aaaaaa),\n"
3634 " aaaaa(aaaaaa),\n"
3635 " aaaaa(aaaaaa),\n"
3636 " aaaaa(aaaaaa) {}",
3637 OnePerLine);
3638 verifyFormat("Constructor() :\n"
3639 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3640 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3641 OnePerLine);
3642 OnePerLine.BinPackParameters = false;
3643 verifyFormat(
3644 "Constructor() :\n"
3645 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3646 " aaaaaaaaaaa().aaa(),\n"
3647 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3648 OnePerLine);
3649 OnePerLine.ColumnLimit = 60;
3650 verifyFormat("Constructor() :\n"
3651 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3652 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3653 OnePerLine);
3654
3655 EXPECT_EQ("Constructor() :\n"
3656 " // Comment forcing unwanted break.\n"
3657 " aaaa(aaaa) {}",
3658 format("Constructor() :\n"
3659 " // Comment forcing unwanted break.\n"
3660 " aaaa(aaaa) {}",
3661 Style));
3662
3663 Style.ColumnLimit = 0;
3664 verifyFormat("SomeClass::Constructor() :\n"
3665 " a(a) {}",
3666 Style);
3667 verifyFormat("SomeClass::Constructor() noexcept :\n"
3668 " a(a) {}",
3669 Style);
3670 verifyFormat("SomeClass::Constructor() :\n"
3671 " a(a), b(b), c(c) {}",
3672 Style);
3673 verifyFormat("SomeClass::Constructor() :\n"
3674 " a(a) {\n"
3675 " foo();\n"
3676 " bar();\n"
3677 "}",
3678 Style);
3679
3680 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3681 verifyFormat("SomeClass::Constructor() :\n"
3682 " a(a), b(b), c(c) {\n"
3683 "}",
3684 Style);
3685 verifyFormat("SomeClass::Constructor() :\n"
3686 " a(a) {\n"
3687 "}",
3688 Style);
3689
3690 Style.ColumnLimit = 80;
3691 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3692 Style.ConstructorInitializerIndentWidth = 2;
3693 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3694 Style);
3695 verifyFormat("SomeClass::Constructor() :\n"
3696 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3697 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3698 Style);
3699}
3700
David Blaikieea95dd72017-08-31 18:49:34 +00003701#ifndef EXPENSIVE_CHECKS
3702// Expensive checks enables libstdc++ checking which includes validating the
3703// state of ranges used in std::priority_queue - this blows out the
3704// runtime/scalability of the function and makes this test unacceptably slow.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003705TEST_F(FormatTest, MemoizationTests) {
3706 // This breaks if the memoization lookup does not take \c Indent and
3707 // \c LastSpace into account.
3708 verifyFormat(
3709 "extern CFRunLoopTimerRef\n"
3710 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3711 " CFTimeInterval interval, CFOptionFlags flags,\n"
3712 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003713 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003714
3715 // Deep nesting somewhat works around our memoization.
3716 verifyFormat(
3717 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3718 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3719 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3720 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3721 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3722 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003723 verifyFormat(
3724 "aaaaa(\n"
3725 " aaaaa,\n"
3726 " aaaaa(\n"
3727 " aaaaa,\n"
3728 " aaaaa(\n"
3729 " aaaaa,\n"
3730 " aaaaa(\n"
3731 " aaaaa,\n"
3732 " aaaaa(\n"
3733 " aaaaa,\n"
3734 " aaaaa(\n"
3735 " aaaaa,\n"
3736 " aaaaa(\n"
3737 " aaaaa,\n"
3738 " aaaaa(\n"
3739 " aaaaa,\n"
3740 " aaaaa(\n"
3741 " aaaaa,\n"
3742 " aaaaa(\n"
3743 " aaaaa,\n"
3744 " aaaaa(\n"
3745 " aaaaa,\n"
3746 " aaaaa(\n"
3747 " aaaaa,\n"
3748 " aaaaa))))))))))));",
3749 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003750 verifyFormat(
3751 "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"
3752 " a),\n"
3753 " a),\n"
3754 " a),\n"
3755 " a),\n"
3756 " a),\n"
3757 " a),\n"
3758 " a),\n"
3759 " a),\n"
3760 " a),\n"
3761 " a),\n"
3762 " a),\n"
3763 " a),\n"
3764 " a),\n"
3765 " a),\n"
3766 " a),\n"
3767 " a),\n"
3768 " a)",
3769 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003770
3771 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003772 FormatStyle OnePerLine = getLLVMStyle();
3773 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003774 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003775 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003776 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003777 for (unsigned i = 0, e = 80; i != e; ++i) {
3778 input += " a,\n";
3779 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003780 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003781 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003782}
David Blaikieea95dd72017-08-31 18:49:34 +00003783#endif
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003784
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003785TEST_F(FormatTest, BreaksAsHighAsPossible) {
3786 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003787 "void f() {\n"
3788 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3789 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3790 " f();\n"
3791 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003792 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003793 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003794}
3795
Daniel Jasper6728fc12013-04-11 14:29:13 +00003796TEST_F(FormatTest, BreaksFunctionDeclarations) {
3797 // Principially, we break function declarations in a certain order:
3798 // 1) break amongst arguments.
3799 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3800 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003801 verifyFormat("template <class TemplateIt>\n"
3802 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3803 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003804
3805 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003806 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003807 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003808 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003809 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003810
3811 // 3) break after (.
3812 verifyFormat(
3813 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003814 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3815 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003816
3817 // 4) break before after nested name specifiers.
3818 verifyFormat(
3819 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003820 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3821 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003822 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003823
3824 // However, there are exceptions, if a sufficient amount of lines can be
3825 // saved.
3826 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3827 // more adjusting.
3828 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3829 " Cccccccccccccc cccccccccc,\n"
3830 " Cccccccccccccc cccccccccc,\n"
3831 " Cccccccccccccc cccccccccc,\n"
3832 " Cccccccccccccc cccccccccc);");
3833 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003834 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003835 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3836 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3837 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003838 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003839 verifyFormat(
3840 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3841 " Cccccccccccccc cccccccccc,\n"
3842 " Cccccccccccccc cccccccccc,\n"
3843 " Cccccccccccccc cccccccccc,\n"
3844 " Cccccccccccccc cccccccccc,\n"
3845 " Cccccccccccccc cccccccccc,\n"
3846 " Cccccccccccccc cccccccccc);");
3847 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3848 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3849 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3850 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3851 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003852
3853 // Break after multi-line parameters.
3854 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3855 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3856 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3857 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003858 verifyFormat("void SomeLoooooooooooongFunction(\n"
3859 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3860 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3861 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003862
3863 // Treat overloaded operators like other functions.
3864 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3865 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003866 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3867 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003868 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3869 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3870 verifyGoogleFormat(
3871 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3872 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003873 verifyGoogleFormat(
3874 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3875 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003876 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3877 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3878 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3879 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003880 verifyGoogleFormat(
3881 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3882 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3883 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003884 verifyGoogleFormat(
3885 "template <typename T>\n"
3886 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3887 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3888 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003889
3890 FormatStyle Style = getLLVMStyle();
3891 Style.PointerAlignment = FormatStyle::PAS_Left;
3892 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3893 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3894 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003895 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3896 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3897 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003898}
3899
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003900TEST_F(FormatTest, TrailingReturnType) {
3901 verifyFormat("auto foo() -> int;\n");
3902 verifyFormat("struct S {\n"
3903 " auto bar() const -> int;\n"
3904 "};");
3905 verifyFormat("template <size_t Order, typename T>\n"
3906 "auto load_img(const std::string &filename)\n"
3907 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003908 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3909 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003910 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003911 verifyFormat("template <typename T>\n"
3912 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3913 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003914
3915 // Not trailing return types.
3916 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003917}
3918
Daniel Jasper5be31f72013-05-21 09:16:31 +00003919TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003920 // Avoid breaking before trailing 'const' or other trailing annotations, if
3921 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003922 FormatStyle Style = getGoogleStyle();
3923 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003924 verifyFormat("void someLongFunction(\n"
3925 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003926 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003927 verifyFormat("LoooooongReturnType\n"
3928 "someLoooooooongFunction() const {}",
3929 getLLVMStyleWithColumns(47));
3930 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3931 " const {}",
3932 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003933 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3934 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3935 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3936 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3937 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3938 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003939 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3940 " aaaaaaaaaaa aaaaa) const override;");
3941 verifyGoogleFormat(
3942 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3943 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003944
Daniel Jasper5550de62014-02-17 07:57:46 +00003945 // Even if the first parameter has to be wrapped.
3946 verifyFormat("void someLongFunction(\n"
3947 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003948 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003949 verifyFormat("void someLongFunction(\n"
3950 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003951 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003952 verifyFormat("void someLongFunction(\n"
3953 " int someLongParameter) override {}",
3954 Style);
3955 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003956 " int someLongParameter) OVERRIDE {}",
3957 Style);
3958 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003959 " int someLongParameter) final {}",
3960 Style);
3961 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003962 " int someLongParameter) FINAL {}",
3963 Style);
3964 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003965 " int parameter) const override {}",
3966 Style);
3967
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003968 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3969 verifyFormat("void someLongFunction(\n"
3970 " int someLongParameter) const\n"
3971 "{\n"
3972 "}",
3973 Style);
3974
Daniel Jasper5550de62014-02-17 07:57:46 +00003975 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003976 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3977 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3978 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003979
3980 // Breaking before function-like trailing annotations is fine to keep them
3981 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003982 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3983 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3984 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3985 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3986 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3987 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003988 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3989 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003990 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003991
3992 verifyFormat(
3993 "void aaaaaaaaaaaaaaaaaa()\n"
3994 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3995 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
3996 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3997 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003998 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003999 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004000 " GUARDED_BY(aaaaaaaaaaaa);");
4001 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004002 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004003 " GUARDED_BY(aaaaaaaaaaaa);");
4004 verifyGoogleFormat(
4005 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4006 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004007 verifyGoogleFormat(
4008 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4009 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004010}
4011
Daniel Jasperf090f032015-05-18 09:47:22 +00004012TEST_F(FormatTest, FunctionAnnotations) {
4013 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004014 "int OldFunction(const string &parameter) {}");
4015 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004016 "string OldFunction(const string &parameter) {}");
4017 verifyFormat("template <typename T>\n"
4018 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4019 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004020
4021 // Not function annotations.
4022 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4023 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004024 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4025 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004026 verifyFormat("MACRO(abc).function() // wrap\n"
4027 " << abc;");
4028 verifyFormat("MACRO(abc)->function() // wrap\n"
4029 " << abc;");
4030 verifyFormat("MACRO(abc)::function() // wrap\n"
4031 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004032}
4033
Daniel Jasperf7935112012-12-03 18:12:45 +00004034TEST_F(FormatTest, BreaksDesireably) {
4035 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4036 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004037 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004038 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4039 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4040 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004041
4042 verifyFormat(
4043 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004044 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004045
4046 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4047 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004049
4050 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004051 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4052 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4053 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004054 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4055 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004056
4057 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4058 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4059
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004060 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004061 "void f() {\n"
4062 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4064 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004065 verifyFormat(
4066 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4067 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4068 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004069 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4070 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4071 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004072 "aaaaaa(aaa,\n"
4073 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004074 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4075 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004076 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4077 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4078 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004079
Daniel Jasper739b85f2015-06-29 10:42:59 +00004080 // Indent consistently independent of call expression and unary operator.
4081 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4082 " dddddddddddddddddddddddddddddd));");
4083 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4084 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004085 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004086 " dddddddddddddddddddddddddddddd));");
4087
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004088 // This test case breaks on an incorrect memoization, i.e. an optimization not
4089 // taking into account the StopAt value.
4090 verifyFormat(
4091 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004092 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4093 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4094 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004095
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004096 verifyFormat("{\n {\n {\n"
4097 " Annotation.SpaceRequiredBefore =\n"
4098 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4099 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4100 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004101
4102 // Break on an outer level if there was a break on an inner level.
4103 EXPECT_EQ("f(g(h(a, // comment\n"
4104 " b, c),\n"
4105 " d, e),\n"
4106 " x, y);",
4107 format("f(g(h(a, // comment\n"
4108 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004109
4110 // Prefer breaking similar line breaks.
4111 verifyFormat(
4112 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4113 " NSTrackingMouseEnteredAndExited |\n"
4114 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004115}
4116
Daniel Jasper18210d72014-10-09 09:52:05 +00004117TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4118 FormatStyle NoBinPacking = getGoogleStyle();
4119 NoBinPacking.BinPackParameters = false;
4120 NoBinPacking.BinPackArguments = true;
4121 verifyFormat("void f() {\n"
4122 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4123 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4124 "}",
4125 NoBinPacking);
4126 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4127 " int aaaaaaaaaaaaaaaaaaaa,\n"
4128 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4129 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004130
Daniel Jasper00693b082016-01-09 15:56:47 +00004131 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4132 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4133 " vector<int> bbbbbbbbbbbbbbb);",
4134 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004135 // FIXME: This behavior difference is probably not wanted. However, currently
4136 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4137 // template arguments from BreakBeforeParameter being set because of the
4138 // one-per-line formatting.
4139 verifyFormat(
4140 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4141 " aaaaaaaaaa> aaaaaaaaaa);",
4142 NoBinPacking);
4143 verifyFormat(
4144 "void fffffffffff(\n"
4145 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4146 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004147}
4148
Daniel Jasper9278eb92013-01-16 14:59:02 +00004149TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004150 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004151 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004152 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004153 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4154 " aaaaaaaaaaaaaaaaaaaa,\n"
4155 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4156 NoBinPacking);
4157 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4158 " aaaaaaaaaaaaa,\n"
4159 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4160 NoBinPacking);
4161 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004162 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4163 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4164 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4165 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004166 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4167 NoBinPacking);
4168 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4169 " .aaaaaaaaaaaaaaaaaa();",
4170 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004171 verifyFormat("void f() {\n"
4172 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4173 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4174 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004175 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004176
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004177 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004178 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4179 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004180 " aaaaaaaaaaaa);",
4181 NoBinPacking);
4182 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004183 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4184 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004185 " test);",
4186 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004187
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004188 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4189 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004190 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4191 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004192 NoBinPacking);
4193 verifyFormat("a(\"a\"\n"
4194 " \"a\",\n"
4195 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004196
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004197 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004198 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004199 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004200 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004201 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004202 verifyFormat(
4203 "void f() {\n"
4204 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4205 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004206 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004207 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004208 verifyFormat(
4209 "template <class SomeType, class SomeOtherType>\n"
4210 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4211 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004212}
4213
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004214TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4215 FormatStyle Style = getLLVMStyleWithColumns(15);
4216 Style.ExperimentalAutoDetectBinPacking = true;
4217 EXPECT_EQ("aaa(aaaa,\n"
4218 " aaaa,\n"
4219 " aaaa);\n"
4220 "aaa(aaaa,\n"
4221 " aaaa,\n"
4222 " aaaa);",
4223 format("aaa(aaaa,\n" // one-per-line
4224 " aaaa,\n"
4225 " aaaa );\n"
4226 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4227 Style));
4228 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4229 " aaaa);\n"
4230 "aaa(aaaa, aaaa,\n"
4231 " aaaa);",
4232 format("aaa(aaaa, aaaa,\n" // bin-packed
4233 " aaaa );\n"
4234 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4235 Style));
4236}
4237
Daniel Jasper04468962013-01-18 10:56:38 +00004238TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004239 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4240 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4241 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4242 " .StartsWith(\".init\", ORDER_INIT)\n"
4243 " .StartsWith(\".fini\", ORDER_FINI)\n"
4244 " .StartsWith(\".hash\", ORDER_HASH)\n"
4245 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004246
Daniel Jaspereb50c672013-02-15 20:33:06 +00004247 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004248 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004249 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004250 "aaaaaaa->aaaaaaa\n"
4251 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4252 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004253 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004254 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004255 "aaaaaaa->aaaaaaa\n"
4256 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4257 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4258 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004259 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004260 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004261 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004262 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4263 " aaaaaa->aaaaaaaaaaaa()\n"
4264 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004265 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004266 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004267 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004268 "void f() {\n"
4269 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004270 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004271 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004272 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004273 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004274 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004275 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004276 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004277 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004278 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004279 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004280 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004281
4282 verifyFormat(
4283 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4284 verifyFormat("aaaaaaaaaaaaaaa()\n"
4285 " .aaaaaaaaaaaaaaa()\n"
4286 " .aaaaaaaaaaaaaaa()\n"
4287 " .aaaaaaaaaaaaaaa()\n"
4288 " .aaaaaaaaaaaaaaa();");
4289 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4290 " .aaaaaaaaaaaaaaa()\n"
4291 " .aaaaaaaaaaaaaaa()\n"
4292 " .aaaaaaaaaaaaaaa();");
4293 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4294 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4295 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004296 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4297 " ->aaaaaaaaaaaaaae(0)\n"
4298 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004299
Daniel Jasper775954b2015-04-24 10:08:09 +00004300 // Don't linewrap after very short segments.
4301 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4302 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4303 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4304 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4305 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4306 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4307 verifyFormat("aaa()\n"
4308 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4309 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4310 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4311
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004312 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4313 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4314 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4315 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4316 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004317 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004318
Daniel Jaspera41aa532014-09-19 08:01:25 +00004319 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004320 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4321 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004322
4323 // Prefer not to create "hanging" indents.
4324 verifyFormat(
4325 "return !soooooooooooooome_map\n"
4326 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4327 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004328 verifyFormat(
4329 "return aaaaaaaaaaaaaaaa\n"
4330 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4331 " .aaaa(aaaaaaaaaaaaaa);");
4332 // No hanging indent here.
4333 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4334 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4335 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4336 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004337 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4338 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4339 getLLVMStyleWithColumns(60));
4340 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4341 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4342 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4343 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004344 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4345 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4346 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004347}
4348
Daniel Jasperde5c2072012-12-24 00:13:23 +00004349TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4350 verifyFormat(
4351 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004352 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004353 verifyFormat(
4354 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4355 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4356
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004357 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004358 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004359 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4360 " ccccccccccccccccccccccccc) {\n}");
4361
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004362 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004363 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004364 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4365 " ccccccccccccccccccccccccc) {\n}");
4366
Daniel Jasperde5c2072012-12-24 00:13:23 +00004367 verifyFormat(
4368 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004369 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004370 verifyFormat(
4371 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4372 " ccccccccccccccccccccccccc) {\n}");
4373
Daniel Jasper400adc62013-02-08 15:28:42 +00004374 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4375 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4376 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4377 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004378 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4379 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4380 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4381 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4382
Daniel Jasper400adc62013-02-08 15:28:42 +00004383 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4384 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4385 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004386 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4387 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4388 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004389}
4390
Daniel Jasper43b65482013-01-23 12:27:43 +00004391TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004392 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004393 "unsigned Cost =\n"
4394 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4395 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004396 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004397 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4398 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004399
4400 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004401 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4402 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004403 verifyFormat("unsigned OriginalStartColumn =\n"
4404 " SourceMgr.getSpellingColumnNumber(\n"
4405 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4406 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004407}
4408
Francois Ferrand9976efa2017-05-22 08:28:17 +00004409TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4410 FormatStyle Style = getLLVMStyle();
4411 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4412 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4413 Style);
4414
4415 Style.PenaltyBreakAssignment = 20;
4416 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4417 " cccccccccccccccccccccccccc;",
4418 Style);
4419}
4420
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004421TEST_F(FormatTest, AlignsAfterAssignments) {
4422 verifyFormat(
4423 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004424 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004425 verifyFormat(
4426 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004427 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004428 verifyFormat(
4429 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004430 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004431 verifyFormat(
4432 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004433 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004434 verifyFormat(
4435 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4436 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4437 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004438}
4439
4440TEST_F(FormatTest, AlignsAfterReturn) {
4441 verifyFormat(
4442 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4443 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4444 verifyFormat(
4445 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4446 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004447 verifyFormat(
4448 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004449 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004450 verifyFormat(
4451 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004452 " aaaaaaaaaaaaaaaaaaaaaa());");
4453 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4454 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4455 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4456 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4457 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004458 verifyFormat("return\n"
4459 " // true if code is one of a or b.\n"
4460 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004461}
4462
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004463TEST_F(FormatTest, AlignsAfterOpenBracket) {
4464 verifyFormat(
4465 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4466 " aaaaaaaaa aaaaaaa) {}");
4467 verifyFormat(
4468 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4469 " aaaaaaaaaaa aaaaaaaaa);");
4470 verifyFormat(
4471 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4472 " aaaaaaaaaaaaaaaaaaaaa));");
4473 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004474 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004475 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4476 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4477 Style);
4478 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4479 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4480 Style);
4481 verifyFormat("SomeLongVariableName->someFunction(\n"
4482 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4483 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004484 verifyFormat(
4485 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4486 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4487 Style);
4488 verifyFormat(
4489 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4490 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4491 Style);
4492 verifyFormat(
4493 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4494 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4495 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004496
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004497 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4498 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4499 " b));",
4500 Style);
4501
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004502 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4503 Style.BinPackArguments = false;
4504 Style.BinPackParameters = false;
4505 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4506 " aaaaaaaaaaa aaaaaaaa,\n"
4507 " aaaaaaaaa aaaaaaa,\n"
4508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4509 Style);
4510 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4511 " aaaaaaaaaaa aaaaaaaaa,\n"
4512 " aaaaaaaaaaa aaaaaaaaa,\n"
4513 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4514 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004515 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4516 " aaaaaaaaaaaaaaa,\n"
4517 " aaaaaaaaaaaaaaaaaaaaa,\n"
4518 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004519 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004520 verifyFormat(
4521 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4522 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4523 Style);
4524 verifyFormat(
4525 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4526 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4527 Style);
4528 verifyFormat(
4529 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4530 " aaaaaaaaaaaaaaaaaaaaa(\n"
4531 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4532 " aaaaaaaaaaaaaaaa);",
4533 Style);
4534 verifyFormat(
4535 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4536 " aaaaaaaaaaaaaaaaaaaaa(\n"
4537 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4538 " aaaaaaaaaaaaaaaa);",
4539 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004540}
4541
Daniel Jasper3219e432014-12-02 13:24:51 +00004542TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4543 FormatStyle Style = getLLVMStyleWithColumns(40);
4544 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4545 " bbbbbbbbbbbbbbbbbbbbbb);",
4546 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004547 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004548 Style.AlignOperands = false;
4549 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4550 " bbbbbbbbbbbbbbbbbbbbbb);",
4551 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004552 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004553 Style.AlignOperands = true;
4554 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4555 " bbbbbbbbbbbbbbbbbbbbbb);",
4556 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004557 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004558 Style.AlignOperands = false;
4559 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4560 " bbbbbbbbbbbbbbbbbbbbbb);",
4561 Style);
4562}
4563
Daniel Jasper399d24b2013-01-09 07:06:56 +00004564TEST_F(FormatTest, BreaksConditionalExpressions) {
4565 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004566 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4567 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4568 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4569 verifyFormat(
4570 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004571 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4572 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004573 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004574 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4575 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4576 verifyFormat(
4577 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004578 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4579 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004580 verifyFormat(
4581 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4582 " : aaaaaaaaaaaaa);");
4583 verifyFormat(
4584 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004585 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004586 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4587 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004588 verifyFormat(
4589 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4590 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4591 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004592 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4593 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4594 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4595 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4596 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4597 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4598 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4599 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4600 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4601 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4602 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4603 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004604 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4605 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4606 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4607 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4608 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004609 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4610 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4611 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004612 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4613 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4614 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4615 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004616 verifyFormat(
4617 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4618 " ? aaaaaaaaaaaaaaa\n"
4619 " : aaaaaaaaaaaaaaa;");
4620 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004621 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004622 " ? b\n"
4623 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004624 verifyFormat("return aaaa == bbbb\n"
4625 " // comment\n"
4626 " ? aaaa\n"
4627 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004628 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004629 " format(TheLine.First,\n"
4630 " IndentForLevel[TheLine.Level] >= 0\n"
4631 " ? IndentForLevel[TheLine.Level]\n"
4632 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004633 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004634 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004635 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4636 " ? aaaaaaaaaaaaaaa\n"
4637 " : bbbbbbbbbbbbbbb //\n"
4638 " ? ccccccccccccccc\n"
4639 " : ddddddddddddddd;");
4640 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4641 " ? aaaaaaaaaaaaaaa\n"
4642 " : (bbbbbbbbbbbbbbb //\n"
4643 " ? ccccccccccccccc\n"
4644 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004645 verifyFormat(
4646 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4647 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4648 " aaaaaaaaaaaaaaaaaaaaa +\n"
4649 " aaaaaaaaaaaaaaaaaaaaa\n"
4650 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004651 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004652 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4653 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4654 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004655
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004656 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004657 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004658 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004659 "void f() {\n"
4660 " g(aaa,\n"
4661 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4662 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4663 " ? aaaaaaaaaaaaaaa\n"
4664 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004665 "}",
4666 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004667 verifyFormat(
4668 "void f() {\n"
4669 " g(aaa,\n"
4670 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4671 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4672 " ?: aaaaaaaaaaaaaaa);\n"
4673 "}",
4674 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004675
4676 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4677 " // comment.\n"
4678 " ccccccccccccccccccccccccccccccccccccccc\n"
4679 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4680 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004681
4682 // Assignments in conditional expressions. Apparently not uncommon :-(.
4683 verifyFormat("return a != b\n"
4684 " // comment\n"
4685 " ? a = b\n"
4686 " : a = b;");
4687 verifyFormat("return a != b\n"
4688 " // comment\n"
4689 " ? a = a != b\n"
4690 " // comment\n"
4691 " ? a = b\n"
4692 " : a\n"
4693 " : a;\n");
4694 verifyFormat("return a != b\n"
4695 " // comment\n"
4696 " ? a\n"
4697 " : a = a != b\n"
4698 " // comment\n"
4699 " ? a = b\n"
4700 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004701}
4702
Daniel Jasper165b29e2013-11-08 00:57:11 +00004703TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4704 FormatStyle Style = getLLVMStyle();
4705 Style.BreakBeforeTernaryOperators = false;
4706 Style.ColumnLimit = 70;
4707 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004708 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4709 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4710 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4711 Style);
4712 verifyFormat(
4713 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004714 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4715 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004716 Style);
4717 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004718 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4719 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4720 Style);
4721 verifyFormat(
4722 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004723 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4724 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004725 Style);
4726 verifyFormat(
4727 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4728 " aaaaaaaaaaaaa);",
4729 Style);
4730 verifyFormat(
4731 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4732 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4733 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4734 " aaaaaaaaaaaaa);",
4735 Style);
4736 verifyFormat(
4737 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4738 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4739 " aaaaaaaaaaaaa);",
4740 Style);
4741 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4742 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4743 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4744 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4745 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4746 Style);
4747 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4748 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4749 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4750 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4752 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4753 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4754 Style);
4755 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4756 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4757 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4758 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4759 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4760 Style);
4761 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4762 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4763 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4764 Style);
4765 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004766 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004767 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4768 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4769 Style);
4770 verifyFormat(
4771 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4772 " aaaaaaaaaaaaaaa :\n"
4773 " aaaaaaaaaaaaaaa;",
4774 Style);
4775 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4776 " aaaaaaaaa ?\n"
4777 " b :\n"
4778 " c);",
4779 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004780 verifyFormat("unsigned Indent =\n"
4781 " format(TheLine.First,\n"
4782 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4783 " IndentForLevel[TheLine.Level] :\n"
4784 " TheLine * 2,\n"
4785 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4786 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004787 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4788 " aaaaaaaaaaaaaaa :\n"
4789 " bbbbbbbbbbbbbbb ? //\n"
4790 " ccccccccccccccc :\n"
4791 " ddddddddddddddd;",
4792 Style);
4793 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4794 " aaaaaaaaaaaaaaa :\n"
4795 " (bbbbbbbbbbbbbbb ? //\n"
4796 " ccccccccccccccc :\n"
4797 " ddddddddddddddd);",
4798 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004799 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4800 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4801 " ccccccccccccccccccccccccccc;",
4802 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004803 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4804 " aaaaa :\n"
4805 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4806 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004807}
4808
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004809TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4810 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4811 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4812 verifyFormat("bool a = true, b = false;");
4813
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004814 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004815 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004816 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004817 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004818 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004819 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004820 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004821 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004822 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4823 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4824 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4825 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4826 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4827 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004828
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004829 FormatStyle Style = getGoogleStyle();
4830 Style.PointerAlignment = FormatStyle::PAS_Left;
4831 Style.DerivePointerAlignment = false;
4832 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4833 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4834 " *b = bbbbbbbbbbbbbbbbbbb;",
4835 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004836 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4837 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4838 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004839 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004840 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004841}
4842
Nico Weber4a5030c2013-01-12 01:28:06 +00004843TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4844 verifyFormat("arr[foo ? bar : baz];");
4845 verifyFormat("f()[foo ? bar : baz];");
4846 verifyFormat("(a + b)[foo ? bar : baz];");
4847 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4848}
4849
Daniel Jasperf7935112012-12-03 18:12:45 +00004850TEST_F(FormatTest, AlignsStringLiterals) {
4851 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4852 " \"short literal\");");
4853 verifyFormat(
4854 "looooooooooooooooooooooooongFunction(\n"
4855 " \"short literal\"\n"
4856 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004857 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4858 " \" string literals\",\n"
4859 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004860 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4861 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004862 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004863 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004864 getLLVMStyleWithColumns(28)));
4865 EXPECT_EQ(
4866 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4867 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4868 " \"aaaaaaaaaaaaaaaa\";",
4869 format("aaaaaa ="
4870 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4871 "aaaaaaaaaaaaaaaaaaaaa\" "
4872 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004873 verifyFormat("a = a + \"a\"\n"
4874 " \"a\"\n"
4875 " \"a\";");
4876 verifyFormat("f(\"a\", \"b\"\n"
4877 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004878
4879 verifyFormat(
4880 "#define LL_FORMAT \"ll\"\n"
4881 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4882 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004883
4884 verifyFormat("#define A(X) \\\n"
4885 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4886 " \"ccccc\"",
4887 getLLVMStyleWithColumns(23));
4888 verifyFormat("#define A \"def\"\n"
4889 "f(\"abc\" A \"ghi\"\n"
4890 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004891
4892 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004893 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004894 verifyFormat("#define A(X) \\\n"
4895 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4896 " L\"ccccc\"",
4897 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004898
4899 verifyFormat("f(@\"a\"\n"
4900 " @\"b\");");
4901 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004902 " @\"b\"\n"
4903 " @\"c\";");
4904 verifyFormat("NSString s = @\"a\"\n"
4905 " \"b\"\n"
4906 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004907}
4908
Zachary Turner448592e2015-12-18 22:20:15 +00004909TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004910 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004911 // No declarations or definitions should be moved to own line.
4912 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4913 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004914 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004915 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004916 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004917 "int f() { return 1; }\n"
4918 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004919 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004920
4921 // All declarations and definitions should have the return type moved to its
4922 // own
4923 // line.
4924 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4925 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004926 " int\n"
4927 " f() {\n"
4928 " return 1;\n"
4929 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004930 " int\n"
4931 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004932 "};\n"
4933 "int\n"
4934 "f() {\n"
4935 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004936 "}\n"
4937 "int\n"
4938 "g();\n",
4939 Style);
4940
4941 // Top-level definitions, and no kinds of declarations should have the
4942 // return type moved to its own line.
4943 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4944 verifyFormat("class B {\n"
4945 " int f() { return 1; }\n"
4946 " int g();\n"
4947 "};\n"
4948 "int\n"
4949 "f() {\n"
4950 " return 1;\n"
4951 "}\n"
4952 "int g();\n",
4953 Style);
4954
4955 // Top-level definitions and declarations should have the return type moved
4956 // to its own line.
4957 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4958 verifyFormat("class C {\n"
4959 " int f() { return 1; }\n"
4960 " int g();\n"
4961 "};\n"
4962 "int\n"
4963 "f() {\n"
4964 " return 1;\n"
4965 "}\n"
4966 "int\n"
4967 "g();\n",
4968 Style);
4969
4970 // All definitions should have the return type moved to its own line, but no
4971 // kinds of declarations.
4972 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4973 verifyFormat("class D {\n"
4974 " int\n"
4975 " f() {\n"
4976 " return 1;\n"
4977 " }\n"
4978 " int g();\n"
4979 "};\n"
4980 "int\n"
4981 "f() {\n"
4982 " return 1;\n"
4983 "}\n"
4984 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004985 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004986 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004987 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004988 " return \"\";\n"
4989 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004990 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004991 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004992 verifyFormat("template <class T>\n"
4993 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004994 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004995 " return NULL;\n"
4996 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004997 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004998 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00004999 verifyFormat("class C {\n"
5000 " int\n"
5001 " operator+() {\n"
5002 " return 1;\n"
5003 " }\n"
5004 " int\n"
5005 " operator()() {\n"
5006 " return 1;\n"
5007 " }\n"
5008 "};\n",
5009 Style);
5010 verifyFormat("void\n"
5011 "A::operator()() {}\n"
5012 "void\n"
5013 "A::operator>>() {}\n"
5014 "void\n"
5015 "A::operator+() {}\n",
5016 Style);
5017 verifyFormat("void *operator new(std::size_t s);", // No break here.
5018 Style);
5019 verifyFormat("void *\n"
5020 "operator new(std::size_t s) {}",
5021 Style);
5022 verifyFormat("void *\n"
5023 "operator delete[](void *ptr) {}",
5024 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005025 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005026 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005027 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005028 "{\n"
5029 " return \"\";\n"
5030 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005031 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005032 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005033 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005034 "T *\n" // Problem here: no line break
5035 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005036 "{\n"
5037 " return NULL;\n"
5038 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005039 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005040 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005041}
5042
Alexander Kornienko58611712013-07-04 12:02:44 +00005043TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5044 FormatStyle NoBreak = getLLVMStyle();
5045 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5046 FormatStyle Break = getLLVMStyle();
5047 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005048 verifyFormat("aaaa = \"bbbb\"\n"
5049 " \"cccc\";",
5050 NoBreak);
5051 verifyFormat("aaaa =\n"
5052 " \"bbbb\"\n"
5053 " \"cccc\";",
5054 Break);
5055 verifyFormat("aaaa(\"bbbb\"\n"
5056 " \"cccc\");",
5057 NoBreak);
5058 verifyFormat("aaaa(\n"
5059 " \"bbbb\"\n"
5060 " \"cccc\");",
5061 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005062 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5063 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005064 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005065 verifyFormat("aaaa(qqq,\n"
5066 " \"bbbb\"\n"
5067 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005068 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005069 verifyFormat("aaaa(qqq,\n"
5070 " L\"bbbb\"\n"
5071 " L\"cccc\");",
5072 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005073 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5074 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005075 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005076 verifyFormat("string s = someFunction(\n"
5077 " \"abc\"\n"
5078 " \"abc\");",
5079 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005080
Daniel Jasper3251fff2014-06-10 06:27:23 +00005081 // As we break before unary operators, breaking right after them is bad.
5082 verifyFormat("string foo = abc ? \"x\"\n"
5083 " \"blah blah blah blah blah blah\"\n"
5084 " : \"y\";",
5085 Break);
5086
Daniel Jasperc834c702013-07-17 15:38:19 +00005087 // Don't break if there is no column gain.
5088 verifyFormat("f(\"aaaa\"\n"
5089 " \"bbbb\");",
5090 Break);
5091
5092 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005093 EXPECT_EQ("x = \"a\\\n"
5094 "b\\\n"
5095 "c\";",
5096 format("x = \"a\\\n"
5097 "b\\\n"
5098 "c\";",
5099 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005100 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005101 " \"a\\\n"
5102 "b\\\n"
5103 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005104 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005105 "b\\\n"
5106 "c\";",
5107 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005108
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00005109 EXPECT_EQ("NSString *const kString =\n"
5110 " @\"aaaa\"\n"
5111 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005112 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005113 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005114 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005115
5116 Break.ColumnLimit = 0;
5117 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005118}
5119
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005120TEST_F(FormatTest, AlignsPipes) {
5121 verifyFormat(
5122 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5123 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5124 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5125 verifyFormat(
5126 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5127 " << aaaaaaaaaaaaaaaaaaaa;");
5128 verifyFormat(
5129 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5130 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5131 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005132 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5133 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5134 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005135 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5136 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5137 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5138 verifyFormat(
5139 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5140 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5141 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005142 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5143 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5144 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5145 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005146 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5147 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005148 verifyFormat(
5149 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5150 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00005151 verifyFormat(
5152 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5153 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005154
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005155 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5156 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005157 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5158 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5159 " aaaaaaaaaaaaaaaaaaaaa)\n"
5160 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005161 verifyFormat("LOG_IF(aaa == //\n"
5162 " bbb)\n"
5163 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005164
Daniel Jasper467ddb12013-08-12 12:58:05 +00005165 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005166 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5167 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005168 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5169 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5170 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005171 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5172 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005173 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5174 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5175 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5176 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5177 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5178 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5179 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005180
Daniel Jasperc238c872013-04-02 14:33:13 +00005181 verifyFormat(
5182 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5183 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005184
5185 // Incomplete string literal.
5186 EXPECT_EQ("llvm::errs() << \"\n"
5187 " << a;",
5188 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005189
5190 verifyFormat("void f() {\n"
5191 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5192 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5193 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005194
5195 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005196 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5197 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5198 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005199
5200 // Handle '\n'.
5201 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5202 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5203 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5204 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5205 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5206 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5207 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005208}
5209
Daniel Jasper7209bb92016-12-13 11:16:42 +00005210TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5211 verifyFormat("return out << \"somepacket = {\\n\"\n"
5212 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5213 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5214 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5215 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5216 " << \"}\";");
5217
5218 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5219 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5220 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5221 verifyFormat(
5222 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5223 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5224 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5225 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5226 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5227 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5228 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5229 verifyFormat(
5230 "void f() {\n"
5231 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5232 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5233 "}");
5234
5235 // Breaking before the first "<<" is generally not desirable.
5236 verifyFormat(
5237 "llvm::errs()\n"
5238 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5239 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5240 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5241 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5242 getLLVMStyleWithColumns(70));
5243 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5244 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5245 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5246 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5247 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5248 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5249 getLLVMStyleWithColumns(70));
5250
5251 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5252 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5253 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5254 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5255 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5256 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005257 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5258 " (aaaa + aaaa);",
5259 getLLVMStyleWithColumns(40));
5260 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5261 " (aaaaaaa + aaaaa));",
5262 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005263 verifyFormat(
5264 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5265 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5266 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005267}
5268
Daniel Jasperf7935112012-12-03 18:12:45 +00005269TEST_F(FormatTest, UnderstandsEquals) {
5270 verifyFormat(
5271 "aaaaaaaaaaaaaaaaa =\n"
5272 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5273 verifyFormat(
5274 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005275 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005276 verifyFormat(
5277 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005278 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005279 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005280 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5281 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005282
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005283 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5284 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005285}
5286
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005287TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005288 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5289 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005290
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005291 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5292 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005293
5294 verifyFormat(
5295 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5296 " Parameter2);");
5297
5298 verifyFormat(
5299 "ShortObject->shortFunction(\n"
5300 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5301 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5302
5303 verifyFormat("loooooooooooooongFunction(\n"
5304 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5305
5306 verifyFormat(
5307 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5308 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5309
Daniel Jasper687af3b2013-02-14 14:26:07 +00005310 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5311 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005312 verifyFormat("void f() {\n"
5313 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5314 " .Times(2)\n"
5315 " .WillRepeatedly(Return(SomeValue));\n"
5316 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005317 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5318 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005319 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005320 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5321 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005322 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005323 verifyFormat("void f() {\n"
5324 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5325 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5326 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005327 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5328 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5329 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5330 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5331 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005332 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5333 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5334 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5335 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5336 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005337
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005338 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005339 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005340 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005341 verifyFormat(
5342 "aaaaaaaaaaa->aaaaaaaaa(\n"
5343 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5344 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005345
5346 verifyFormat(
5347 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5348 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005349 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5350 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5351 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5352 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005353
Daniel Jasper9b334242013-03-15 14:57:30 +00005354 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005355 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5356 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005357
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005358 FormatStyle NoBinPacking = getLLVMStyle();
5359 NoBinPacking.BinPackParameters = false;
5360 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5361 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5362 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5363 " aaaaaaaaaaaaaaaaaaa,\n"
5364 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5365 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005366
5367 // If there is a subsequent call, change to hanging indentation.
5368 verifyFormat(
5369 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5370 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5371 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5372 verifyFormat(
5373 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5374 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005375 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5376 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5377 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5378 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5379 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5380 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005381}
5382
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005383TEST_F(FormatTest, WrapsTemplateDeclarations) {
5384 verifyFormat("template <typename T>\n"
5385 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005386 verifyFormat("template <typename T>\n"
5387 "// T should be one of {A, B}.\n"
5388 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005389 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005390 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005391 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005392 verifyFormat("template <typename T>\n"
5393 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5394 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005395 verifyFormat(
5396 "template <typename T>\n"
5397 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5398 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005399 verifyFormat(
5400 "template <typename T>\n"
5401 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5402 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005404 verifyFormat("template <typename T>\n"
5405 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005406 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005407 verifyFormat(
5408 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5409 " typename T4 = char>\n"
5410 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005411 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5412 " template <typename> class cccccccccccccccccccccc,\n"
5413 " typename ddddddddddddd>\n"
5414 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005415 verifyFormat(
5416 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5417 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005418
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005419 verifyFormat("void f() {\n"
5420 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5421 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5422 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005423
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005424 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005425 verifyFormat("template <typename T> void f();");
5426 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005427 verifyFormat(
5428 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5429 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5430 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5431 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5432 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5433 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5434 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5435 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005436 EXPECT_EQ("static_cast<A< //\n"
5437 " B> *>(\n"
5438 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00005439 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00005440 format("static_cast<A<//\n"
5441 " B>*>(\n"
5442 "\n"
5443 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005444 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5445 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005446
5447 FormatStyle AlwaysBreak = getLLVMStyle();
5448 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5449 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5450 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5451 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5452 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5453 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5454 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5455 verifyFormat("template <template <typename> class Fooooooo,\n"
5456 " template <typename> class Baaaaaaar>\n"
5457 "struct C {};",
5458 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005459 verifyFormat("template <typename T> // T can be A, B or C.\n"
5460 "struct C {};",
5461 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005462 verifyFormat("template <enum E> class A {\n"
5463 "public:\n"
5464 " E *f();\n"
5465 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005466}
5467
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005468TEST_F(FormatTest, WrapsTemplateParameters) {
5469 FormatStyle Style = getLLVMStyle();
5470 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5471 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5472 verifyFormat(
5473 "template <typename... a> struct q {};\n"
5474 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5475 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5476 " y;",
5477 Style);
5478 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5479 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5480 verifyFormat(
5481 "template <typename... a> struct r {};\n"
5482 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5483 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5484 " y;",
5485 Style);
5486 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5487 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5488 verifyFormat(
5489 "template <typename... a> struct s {};\n"
5490 "extern s<\n"
5491 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5492 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5493 " y;",
5494 Style);
5495 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5496 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5497 verifyFormat(
5498 "template <typename... a> struct t {};\n"
5499 "extern t<\n"
5500 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5501 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5502 " y;",
5503 Style);
5504}
5505
Daniel Jasper45797022013-01-25 10:57:27 +00005506TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5507 verifyFormat(
5508 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5509 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5510 verifyFormat(
5511 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5512 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5513 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5514
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005515 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005516 verifyFormat(
5517 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5518 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005519 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005520
Daniel Jasper45797022013-01-25 10:57:27 +00005521 verifyFormat(
5522 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005523 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005524
5525 // Breaking at nested name specifiers is generally not desirable.
5526 verifyFormat(
5527 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5528 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005529
5530 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005531 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5532 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5533 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005534 " aaaaaaaaaaaaaaaaaaaaa);",
5535 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005536
5537 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5538 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5539 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005540}
5541
Daniel Jasperf7935112012-12-03 18:12:45 +00005542TEST_F(FormatTest, UnderstandsTemplateParameters) {
5543 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005544 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005545 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5546 verifyFormat("bool x = a < 1 || 2 > a;");
5547 verifyFormat("bool x = 5 < f<int>();");
5548 verifyFormat("bool x = f<int>() > 5;");
5549 verifyFormat("bool x = 5 < a<int>::x;");
5550 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5551 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5552
5553 verifyGoogleFormat("A<A<int>> a;");
5554 verifyGoogleFormat("A<A<A<int>>> a;");
5555 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005556 verifyGoogleFormat("A<A<int> > a;");
5557 verifyGoogleFormat("A<A<A<int> > > a;");
5558 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005559 verifyGoogleFormat("A<::A<int>> a;");
5560 verifyGoogleFormat("A<::A> a;");
5561 verifyGoogleFormat("A< ::A> a;");
5562 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005563 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5564 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005565 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5566 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005567 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5568 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005569
Nico Weber7533b4d2014-09-24 17:17:32 +00005570 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5571
Daniel Jasperf7935112012-12-03 18:12:45 +00005572 verifyFormat("test >> a >> b;");
5573 verifyFormat("test << a >> b;");
5574
5575 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005576 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005577 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005578 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5579 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005580 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005581 verifyFormat("f(a.operator()<A>());");
5582 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5583 " .template operator()<A>());",
5584 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005585
5586 // Not template parameters.
5587 verifyFormat("return a < b && c > d;");
5588 verifyFormat("void f() {\n"
5589 " while (a < b && c > d) {\n"
5590 " }\n"
5591 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005592 verifyFormat("template <typename... Types>\n"
5593 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005594
5595 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5596 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5597 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005598 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005599 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005600 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005601}
5602
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005603TEST_F(FormatTest, BitshiftOperatorWidth) {
5604 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5605 " bar */",
5606 format("int a=1<<2; /* foo\n"
5607 " bar */"));
5608
5609 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5610 " bar */",
5611 format("int b =256>>1 ; /* foo\n"
5612 " bar */"));
5613}
5614
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005615TEST_F(FormatTest, UnderstandsBinaryOperators) {
5616 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005617 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005618}
5619
5620TEST_F(FormatTest, UnderstandsPointersToMembers) {
5621 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005622 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005623 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005624 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005625 verifyFormat("void f() {\n"
5626 " (a->*f)();\n"
5627 " a->*x;\n"
5628 " (a.*f)();\n"
5629 " ((*a).*f)();\n"
5630 " a.*x;\n"
5631 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005632 verifyFormat("void f() {\n"
5633 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5634 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5635 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005636 verifyFormat(
5637 "(aaaaaaaaaa->*bbbbbbb)(\n"
5638 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005639 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005640 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005641 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005642}
5643
Daniel Jasper8dd40472012-12-21 09:41:31 +00005644TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005645 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005646 verifyFormat("f(-1, -2, -3);");
5647 verifyFormat("a[-1] = 5;");
5648 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005649 verifyFormat("if (i == -1) {\n}");
5650 verifyFormat("if (i != -1) {\n}");
5651 verifyFormat("if (i > -1) {\n}");
5652 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005653 verifyFormat("++(a->f());");
5654 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005655 verifyFormat("(a->f())++;");
5656 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005657 verifyFormat("if (!(a->f())) {\n}");
Krasimir Georgiev446d6ec2018-03-06 13:56:28 +00005658 verifyFormat("if (!+i) {\n}");
5659 verifyFormat("~&a;");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005660
5661 verifyFormat("a-- > b;");
5662 verifyFormat("b ? -a : c;");
5663 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005664 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005665 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005666 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005667
5668 verifyFormat("return -1;");
5669 verifyFormat("switch (a) {\n"
5670 "case -1:\n"
5671 " break;\n"
5672 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005673 verifyFormat("#define X -1");
5674 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005675
Chandler Carruthf8b72662014-03-02 12:37:31 +00005676 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5677 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005678
5679 verifyFormat("int a = /* confusing comment */ -1;");
5680 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5681 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005682}
5683
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005684TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005685 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005686 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005687 "}");
5688 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005689 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005690 verifyFormat("*aaa = aaaaaaa( // break\n"
5691 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005692}
5693
Daniel Jasper8863ada2013-08-26 08:10:17 +00005694TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005695 verifyFormat("bool operator<();");
5696 verifyFormat("bool operator>();");
5697 verifyFormat("bool operator=();");
5698 verifyFormat("bool operator==();");
5699 verifyFormat("bool operator!=();");
5700 verifyFormat("int operator+();");
5701 verifyFormat("int operator++();");
Daniel Jasperbbf5f4e2017-11-06 12:11:51 +00005702 verifyFormat("int operator++(int) volatile noexcept;");
Daniel Jasper804a2762016-01-09 15:56:40 +00005703 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005704 verifyFormat("bool operator();");
5705 verifyFormat("bool operator()();");
5706 verifyFormat("bool operator[]();");
5707 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005708 verifyFormat("operator int();");
5709 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005710 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005711 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005712 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005713 verifyFormat("void *operator new(std::size_t size);");
5714 verifyFormat("void *operator new[](std::size_t size);");
5715 verifyFormat("void operator delete(void *ptr);");
5716 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005717 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5718 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005719 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005720 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005721
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005722 verifyFormat(
5723 "ostream &operator<<(ostream &OutputStream,\n"
5724 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005725 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5726 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5727 " return left.group < right.group;\n"
5728 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005729 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005730 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005731
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005732 verifyGoogleFormat("operator void*();");
5733 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005734 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005735
5736 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005737 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5738 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005739}
5740
Daniel Jasper1c220482015-02-25 10:30:06 +00005741TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005742 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5743 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5744 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5745 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5746 verifyFormat("Deleted &operator=(const Deleted &) &;");
5747 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5748 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5749 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5750 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5751 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5752 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005753 verifyFormat("void Fn(T const &) const &;");
5754 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005755 verifyFormat("template <typename T>\n"
5756 "void F(T) && = delete;",
5757 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005758
Daniel Jasperaf642c62015-08-25 13:40:51 +00005759 FormatStyle AlignLeft = getLLVMStyle();
5760 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005761 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005762 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5763 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5764 AlignLeft);
5765 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5766 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005767 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5768 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5769 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5770 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005771 verifyFormat("void Fn(T const&) const&;", AlignLeft);
5772 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005773
5774 FormatStyle Spaces = getLLVMStyle();
5775 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005776 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5777 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5778 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5779 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005780
5781 Spaces.SpacesInCStyleCastParentheses = false;
5782 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005783 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5784 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5785 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5786 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005787}
5788
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005789TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005790 verifyFormat("void f() {\n"
5791 " A *a = new A;\n"
5792 " A *a = new (placement) A;\n"
5793 " delete a;\n"
5794 " delete (A *)a;\n"
5795 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005796 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5797 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005798 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5799 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5800 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005801 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005802}
5803
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005804TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005805 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005806 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005807 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005808 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005809 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005810 verifyIndependentOfContext("int a = b * 10;");
5811 verifyIndependentOfContext("int a = 10 * b;");
5812 verifyIndependentOfContext("int a = b * c;");
5813 verifyIndependentOfContext("int a += b * c;");
5814 verifyIndependentOfContext("int a -= b * c;");
5815 verifyIndependentOfContext("int a *= b * c;");
5816 verifyIndependentOfContext("int a /= b * c;");
5817 verifyIndependentOfContext("int a = *b;");
5818 verifyIndependentOfContext("int a = *b * c;");
5819 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005820 verifyIndependentOfContext("int a = b * (10);");
5821 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005822 verifyIndependentOfContext("return 10 * b;");
5823 verifyIndependentOfContext("return *b * *c;");
5824 verifyIndependentOfContext("return a & ~b;");
5825 verifyIndependentOfContext("f(b ? *c : *d);");
5826 verifyIndependentOfContext("int a = b ? *c : *d;");
5827 verifyIndependentOfContext("*b = a;");
5828 verifyIndependentOfContext("a * ~b;");
5829 verifyIndependentOfContext("a * !b;");
5830 verifyIndependentOfContext("a * +b;");
5831 verifyIndependentOfContext("a * -b;");
5832 verifyIndependentOfContext("a * ++b;");
5833 verifyIndependentOfContext("a * --b;");
5834 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005835 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005836 verifyIndependentOfContext("f() * b;");
5837 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005838 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005839 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005840 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005841 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005842 verifyIndependentOfContext("return sizeof(int **);");
5843 verifyIndependentOfContext("return sizeof(int ******);");
5844 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005845 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005846 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005847 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005848 verifyGoogleFormat("return sizeof(int**);");
5849 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5850 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005851 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005852 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005853 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005854 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005855 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005856 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005857 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005858 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005859 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005860 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005861 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005862 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005863 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005864 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005865 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005866 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00005867 verifyFormat("void f(const MyOverride &override);");
5868 verifyFormat("void f(const MyFinal &final);");
5869 verifyIndependentOfContext("bool a = f() && override.f();");
5870 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00005871
Daniel Jasper5b49f472013-01-23 12:10:53 +00005872 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005873
Daniel Jasper5b49f472013-01-23 12:10:53 +00005874 verifyIndependentOfContext("A<int *> a;");
5875 verifyIndependentOfContext("A<int **> a;");
5876 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005877 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005878 verifyIndependentOfContext(
5879 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005880 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005881 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005882 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005883 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005884 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005885
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005886 verifyFormat(
5887 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5888 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5889
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005890 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005891 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005892 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005893 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005894 verifyGoogleFormat("A<int*> a;");
5895 verifyGoogleFormat("A<int**> a;");
5896 verifyGoogleFormat("A<int*, int*> a;");
5897 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005898 verifyGoogleFormat("f(b ? *c : *d);");
5899 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005900 verifyGoogleFormat("Type* t = **x;");
5901 verifyGoogleFormat("Type* t = *++*x;");
5902 verifyGoogleFormat("*++*x;");
5903 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5904 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005905 verifyGoogleFormat(
5906 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005907 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005908 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5909 verifyGoogleFormat("template <typename T>\n"
5910 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005911
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005912 FormatStyle Left = getLLVMStyle();
5913 Left.PointerAlignment = FormatStyle::PAS_Left;
5914 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005915 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005916 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00005917 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00005918 verifyFormat("delete *x;", Left);
5919 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
5920 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
5921 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005922
Daniel Jasper5b49f472013-01-23 12:10:53 +00005923 verifyIndependentOfContext("a = *(x + y);");
5924 verifyIndependentOfContext("a = &(x + y);");
5925 verifyIndependentOfContext("*(x + y).call();");
5926 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005927 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005928
Daniel Jasper5b49f472013-01-23 12:10:53 +00005929 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005930 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005931 "int *MyValues = {\n"
5932 " *A, // Operator detection might be confused by the '{'\n"
5933 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005934 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005935
Daniel Jasper5b49f472013-01-23 12:10:53 +00005936 verifyIndependentOfContext("if (int *a = &b)");
5937 verifyIndependentOfContext("if (int &a = *b)");
5938 verifyIndependentOfContext("if (a & b[i])");
5939 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5940 verifyIndependentOfContext("if (*b[i])");
5941 verifyIndependentOfContext("if (int *a = (&b))");
5942 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005943 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005944 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005945 verifyFormat("void f() {\n"
5946 " for (const int &v : Values) {\n"
5947 " }\n"
5948 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005949 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5950 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005951 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005952
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005953 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005954 verifyFormat("#define MACRO \\\n"
5955 " int *i = a * b; \\\n"
5956 " void f(a *b);",
5957 getLLVMStyleWithColumns(19));
5958
Daniel Jasper97b89482013-03-13 07:49:51 +00005959 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005960 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005961 verifyIndependentOfContext("T **t = new T *;");
5962 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005963 verifyGoogleFormat("A = new SomeType*[Length]();");
5964 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005965 verifyGoogleFormat("T** t = new T*;");
5966 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005967
Daniel Jaspera65e8872014-03-25 10:52:45 +00005968 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5969 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005970 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005971 "typename t::if<x && y>::type f() {}");
5972 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005973 verifyFormat("vector<int *> v;");
5974 verifyFormat("vector<int *const> v;");
5975 verifyFormat("vector<int *const **const *> v;");
5976 verifyFormat("vector<int *volatile> v;");
5977 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005978 verifyFormat("foo<b && false>();");
5979 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005980 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005981 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005982 "template <class T, class = typename std::enable_if<\n"
5983 " std::is_integral<T>::value &&\n"
5984 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
5985 "void F();",
5986 getLLVMStyleWithColumns(70));
5987 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005988 "template <class T,\n"
5989 " class = typename std::enable_if<\n"
5990 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005991 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
5992 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005993 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005994 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005995 verifyFormat(
5996 "template <class T,\n"
5997 " class = typename ::std::enable_if<\n"
5998 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5999 "void F();",
6000 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006001
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006002 verifyIndependentOfContext("MACRO(int *i);");
6003 verifyIndependentOfContext("MACRO(auto *a);");
6004 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00006005 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006006 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006007 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006008 // FIXME: Is there a way to make this work?
6009 // verifyIndependentOfContext("MACRO(A *a);");
6010
Daniel Jasper32ccb032014-06-23 07:36:18 +00006011 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006012 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006013
Daniel Jasper866468a2014-04-14 13:15:29 +00006014 EXPECT_EQ("#define OP(x) \\\n"
6015 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6016 " return s << a.DebugString(); \\\n"
6017 " }",
6018 format("#define OP(x) \\\n"
6019 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6020 " return s << a.DebugString(); \\\n"
6021 " }",
6022 getLLVMStyleWithColumns(50)));
6023
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006024 // FIXME: We cannot handle this case yet; we might be able to figure out that
6025 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006026 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006027
6028 FormatStyle PointerMiddle = getLLVMStyle();
6029 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6030 verifyFormat("delete *x;", PointerMiddle);
6031 verifyFormat("int * x;", PointerMiddle);
6032 verifyFormat("template <int * y> f() {}", PointerMiddle);
6033 verifyFormat("int * f(int * a) {}", PointerMiddle);
6034 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6035 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6036 verifyFormat("A<int *> a;", PointerMiddle);
6037 verifyFormat("A<int **> a;", PointerMiddle);
6038 verifyFormat("A<int *, int *> a;", PointerMiddle);
6039 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006040 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6041 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006042 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006043
6044 // Member function reference qualifiers aren't binary operators.
6045 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006046 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006047 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006048 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006049 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006050 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006051}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006052
Daniel Jasperee6d6502013-07-17 20:25:02 +00006053TEST_F(FormatTest, UnderstandsAttributes) {
6054 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006055 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6056 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006057 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006058 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006059 verifyFormat("__attribute__((nodebug)) void\n"
6060 "foo() {}\n",
6061 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006062}
6063
Daniel Jasper10cd5812013-05-06 06:35:44 +00006064TEST_F(FormatTest, UnderstandsEllipsis) {
6065 verifyFormat("int printf(const char *fmt, ...);");
6066 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006067 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6068
6069 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006070 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006071 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006072}
6073
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006074TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006075 EXPECT_EQ("int *a;\n"
6076 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006077 "int *a;",
6078 format("int *a;\n"
6079 "int* a;\n"
6080 "int *a;",
6081 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006082 EXPECT_EQ("int* a;\n"
6083 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006084 "int* a;",
6085 format("int* a;\n"
6086 "int* a;\n"
6087 "int *a;",
6088 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006089 EXPECT_EQ("int *a;\n"
6090 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006091 "int *a;",
6092 format("int *a;\n"
6093 "int * a;\n"
6094 "int * a;",
6095 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006096 EXPECT_EQ("auto x = [] {\n"
6097 " int *a;\n"
6098 " int *a;\n"
6099 " int *a;\n"
6100 "};",
6101 format("auto x=[]{int *a;\n"
6102 "int * a;\n"
6103 "int * a;};",
6104 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006105}
6106
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006107TEST_F(FormatTest, UnderstandsRvalueReferences) {
6108 verifyFormat("int f(int &&a) {}");
6109 verifyFormat("int f(int a, char &&b) {}");
6110 verifyFormat("void f() { int &&a = b; }");
6111 verifyGoogleFormat("int f(int a, char&& b) {}");
6112 verifyGoogleFormat("void f() { int&& a = b; }");
6113
Daniel Jasper1eff9082013-05-27 16:36:33 +00006114 verifyIndependentOfContext("A<int &&> a;");
6115 verifyIndependentOfContext("A<int &&, int &&> a;");
6116 verifyGoogleFormat("A<int&&> a;");
6117 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006118
6119 // Not rvalue references:
6120 verifyFormat("template <bool B, bool C> class A {\n"
6121 " static_assert(B && C, \"Something is wrong\");\n"
6122 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006123 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6124 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006125 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006126}
6127
Manuel Klimekc1237a82013-01-23 14:08:21 +00006128TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6129 verifyFormat("void f() {\n"
6130 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006131 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006132 "}",
6133 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006134}
6135
Daniel Jasperef906a92013-01-13 08:01:36 +00006136TEST_F(FormatTest, FormatsCasts) {
6137 verifyFormat("Type *A = static_cast<Type *>(P);");
6138 verifyFormat("Type *A = (Type *)P;");
6139 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6140 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006141 verifyFormat("int a = (int)2.0f;");
6142 verifyFormat("x[(int32)y];");
6143 verifyFormat("x = (int32)y;");
6144 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6145 verifyFormat("int a = (int)*b;");
6146 verifyFormat("int a = (int)2.0f;");
6147 verifyFormat("int a = (int)~0;");
6148 verifyFormat("int a = (int)++a;");
6149 verifyFormat("int a = (int)sizeof(int);");
6150 verifyFormat("int a = (int)+2;");
6151 verifyFormat("my_int a = (my_int)2.0f;");
6152 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006153 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006154 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006155 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006156 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006157 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006158
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006159 verifyFormat("void f() { my_int a = (my_int)*b; }");
6160 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6161 verifyFormat("my_int a = (my_int)~0;");
6162 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006163 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006164 verifyFormat("my_int a = (my_int)1;");
6165 verifyFormat("my_int a = (my_int *)1;");
6166 verifyFormat("my_int a = (const my_int)-1;");
6167 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006168 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006169 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006170 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006171 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006172
6173 // FIXME: single value wrapped with paren will be treated as cast.
6174 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006175
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006176 verifyFormat("{ (void)F; }");
6177
Daniel Jasper998cabc2013-07-18 14:46:07 +00006178 // Don't break after a cast's
6179 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6180 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6181 " bbbbbbbbbbbbbbbbbbbbbb);");
6182
Daniel Jasperef906a92013-01-13 08:01:36 +00006183 // These are not casts.
6184 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006185 verifyFormat("f(foo)->b;");
6186 verifyFormat("f(foo).b;");
6187 verifyFormat("f(foo)(b);");
6188 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006189 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006190 verifyFormat("(*funptr)(foo)[4];");
6191 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006192 verifyFormat("void f(int *);");
6193 verifyFormat("void f(int *) = 0;");
6194 verifyFormat("void f(SmallVector<int>) {}");
6195 verifyFormat("void f(SmallVector<int>);");
6196 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006197 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006198 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006199 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006200 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6201 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006202 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006203
Daniel Jasperba0bda92013-02-23 08:07:18 +00006204 // These are not casts, but at some point were confused with casts.
6205 verifyFormat("virtual void foo(int *) override;");
6206 verifyFormat("virtual void foo(char &) const;");
6207 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006208 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006209 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006210 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006211 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006212
6213 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6214 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006215 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006216 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006217 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6218 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6219 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006220}
6221
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006222TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006223 verifyFormat("A<bool()> a;");
6224 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006225 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006226 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006227 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006228 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006229 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006230 verifyFormat("template <class CallbackClass>\n"
6231 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006232
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006233 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6234 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006235 verifyGoogleFormat(
6236 "template <class CallbackClass>\n"
6237 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006238
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006239 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006240 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006241 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006242 verifyFormat("some_var = function(*some_pointer_var)[0];");
6243 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006244 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006245 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00006246 verifyFormat("std::function<\n"
6247 " LooooooooooongTemplatedType<\n"
6248 " SomeType>*(\n"
6249 " LooooooooooooooooongType type)>\n"
6250 " function;",
6251 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006252}
6253
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006254TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6255 verifyFormat("A (*foo_)[6];");
6256 verifyFormat("vector<int> (*foo_)[6];");
6257}
6258
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006259TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6260 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6261 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6262 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6263 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006264 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6265 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006266
6267 // Different ways of ()-initializiation.
6268 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6269 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6270 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6271 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6272 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6273 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006274 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6275 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006276
6277 // Lambdas should not confuse the variable declaration heuristic.
6278 verifyFormat("LooooooooooooooooongType\n"
6279 " variable(nullptr, [](A *a) {});",
6280 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006281}
6282
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006283TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006284 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006285 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006286 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006287 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006288 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006289 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006290 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6291 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006292 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6293 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006294 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6295 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006296 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6297 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006298 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6299 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006300 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6301 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6302 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6303 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006304 FormatStyle Indented = getLLVMStyle();
6305 Indented.IndentWrappedFunctionNames = true;
6306 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6307 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6308 Indented);
6309 verifyFormat(
6310 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6311 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6312 Indented);
6313 verifyFormat(
6314 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6315 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6316 Indented);
6317 verifyFormat(
6318 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6319 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6320 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006321
6322 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006323 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6324 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6325 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006326
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006327 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006328 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006329 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006330 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6331 " SourceLocation L, IdentifierIn *II,\n"
6332 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006333 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006334 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006335 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006336 " const SomeType<string, SomeOtherTemplateParameter>\n"
6337 " &ReallyReallyLongParameterName,\n"
6338 " const SomeType<string, SomeOtherTemplateParameter>\n"
6339 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006340 verifyFormat("template <typename A>\n"
6341 "SomeLoooooooooooooooooooooongType<\n"
6342 " typename some_namespace::SomeOtherType<A>::Type>\n"
6343 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006344
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006345 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006346 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6347 " aaaaaaaaaaaaaaaaaaaaaaa;");
6348 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006349 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6350 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006351 verifyGoogleFormat(
6352 "some_namespace::LongReturnType\n"
6353 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006354 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006355
6356 verifyGoogleFormat("template <typename T>\n"
6357 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006358 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006359 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6360 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006361
6362 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006363 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6364 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006365 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6366 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6367 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6368 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6369 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6370 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6371 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006372
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006373 verifyFormat("template <typename T> // Templates on own line.\n"
6374 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006375 "MyFunction(int a);",
6376 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006377}
6378
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006379TEST_F(FormatTest, FormatsArrays) {
6380 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6381 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006382 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6383 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006384 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6385 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006386 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6387 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6388 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6389 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6390 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6391 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6392 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6393 verifyFormat(
6394 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6395 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6396 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006397 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6398 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006399
6400 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6401 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006402 verifyFormat(
6403 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6404 " .aaaaaaa[0]\n"
6405 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006406 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006407
6408 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006409
6410 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6411 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006412}
6413
Daniel Jaspere9de2602012-12-06 09:56:08 +00006414TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6415 verifyFormat("(a)->b();");
6416 verifyFormat("--a;");
6417}
6418
Daniel Jasper8b529712012-12-04 13:02:32 +00006419TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006420 verifyFormat("#include <string>\n"
6421 "#include <a/b/c.h>\n"
6422 "#include \"a/b/string\"\n"
6423 "#include \"string.h\"\n"
6424 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006425 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006426 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006427 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006428 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006429 "#include \"some long include\" // with a comment\n"
Manuel Klimek45ab5592017-11-14 09:19:53 +00006430 "#include \"some very long include path\"\n"
6431 "#include <some/very/long/include/path>\n",
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006432 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006433 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6434 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006435
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006436 verifyFormat("#import <string>");
6437 verifyFormat("#import <a/b/c.h>");
6438 verifyFormat("#import \"a/b/string\"");
6439 verifyFormat("#import \"string.h\"");
6440 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006441 verifyFormat("#if __has_include(<strstream>)\n"
6442 "#include <strstream>\n"
6443 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006444
Daniel Jasper343643b2014-08-13 08:29:18 +00006445 verifyFormat("#define MY_IMPORT <a/b>");
6446
Nico Weber21088802017-02-10 19:36:52 +00006447 verifyFormat("#if __has_include(<a/b>)");
6448 verifyFormat("#if __has_include_next(<a/b>)");
6449 verifyFormat("#define F __has_include(<a/b>)");
6450 verifyFormat("#define F __has_include_next(<a/b>)");
6451
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006452 // Protocol buffer definition or missing "#".
6453 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6454 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006455
6456 FormatStyle Style = getLLVMStyle();
6457 Style.AlwaysBreakBeforeMultilineStrings = true;
6458 Style.ColumnLimit = 0;
6459 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006460
6461 // But 'import' might also be a regular C++ namespace.
6462 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6463 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006464}
6465
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006466//===----------------------------------------------------------------------===//
6467// Error recovery tests.
6468//===----------------------------------------------------------------------===//
6469
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006470TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006471 FormatStyle NoBinPacking = getLLVMStyle();
6472 NoBinPacking.BinPackParameters = false;
6473 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6474 " double *min_x,\n"
6475 " double *max_x,\n"
6476 " double *min_y,\n"
6477 " double *max_y,\n"
6478 " double *min_z,\n"
6479 " double *max_z, ) {}",
6480 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006481}
6482
Daniel Jasper83a54d22013-01-10 09:26:47 +00006483TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006484 verifyFormat("void f() { return; }\n42");
6485 verifyFormat("void f() {\n"
6486 " if (0)\n"
6487 " return;\n"
6488 "}\n"
6489 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006490 verifyFormat("void f() { return }\n42");
6491 verifyFormat("void f() {\n"
6492 " if (0)\n"
6493 " return\n"
6494 "}\n"
6495 "42");
6496}
6497
6498TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6499 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6500 EXPECT_EQ("void f() {\n"
6501 " if (a)\n"
6502 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006503 "}",
6504 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006505 EXPECT_EQ("namespace N {\n"
6506 "void f()\n"
6507 "}",
6508 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006509 EXPECT_EQ("namespace N {\n"
6510 "void f() {}\n"
6511 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006512 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006513 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006514}
6515
Daniel Jasper2df93312013-01-09 10:16:05 +00006516TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6517 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006518 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006519 " b;",
6520 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006521 verifyFormat("function(\n"
6522 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006523 " LoooooooooooongArgument);\n",
6524 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006525}
6526
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006527TEST_F(FormatTest, IncorrectAccessSpecifier) {
6528 verifyFormat("public:");
6529 verifyFormat("class A {\n"
6530 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006531 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006532 "};");
6533 verifyFormat("public\n"
6534 "int qwerty;");
6535 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006536 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006537 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006538 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006539 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006540 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006541}
Daniel Jasperf7935112012-12-03 18:12:45 +00006542
Daniel Jasper291f9362013-03-20 15:58:10 +00006543TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6544 verifyFormat("{");
6545 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006546 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006547}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006548
6549TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006550 verifyFormat("do {\n}");
6551 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006552 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006553 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006554 "wheeee(fun);");
6555 verifyFormat("do {\n"
6556 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006557 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006558}
6559
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006560TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006561 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006562 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006563 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006564 verifyFormat("while {\n foo;\n foo();\n}");
6565 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006566}
6567
Daniel Jasperc0880a92013-01-04 18:52:56 +00006568TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006569 verifyIncompleteFormat("namespace {\n"
6570 "class Foo { Foo (\n"
6571 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006572 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006573}
6574
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006575TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006576 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006577 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6578 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006579 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006580
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006581 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006582 " {\n"
6583 " breakme(\n"
6584 " qwe);\n"
6585 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006586 format("{\n"
6587 " {\n"
6588 " breakme(qwe);\n"
6589 "}\n",
6590 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006591}
6592
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006593TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006594 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006595 " avariable,\n"
6596 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006597 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006598}
6599
Manuel Klimek762dd182013-01-21 10:07:49 +00006600TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006601 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006602}
6603
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006604TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006605 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006606 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006607 " 1,\n"
6608 " 2,\n"
6609 " 3,\n"
6610 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006611 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006612 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6613 verifyFormat("f({1, 2});");
6614 verifyFormat("auto v = Foo{-1};");
6615 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6616 verifyFormat("Class::Class : member{1, 2, 3} {}");
6617 verifyFormat("new vector<int>{1, 2, 3};");
6618 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006619 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006620 verifyFormat("return {arg1, arg2};");
6621 verifyFormat("return {arg1, SomeType{parameter}};");
6622 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6623 verifyFormat("new T{arg1, arg2};");
6624 verifyFormat("f(MyMap[{composite, key}]);");
6625 verifyFormat("class Class {\n"
6626 " T member = {arg1, arg2};\n"
6627 "};");
6628 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006629 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6630 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006631 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6632 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006633
Daniel Jasper438059e2014-05-22 12:11:13 +00006634 verifyFormat("int foo(int i) { return fo1{}(i); }");
6635 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006636 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006637 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006638 verifyFormat("Node n{1, Node{1000}, //\n"
6639 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006640 verifyFormat("Aaaa aaaaaaa{\n"
6641 " {\n"
6642 " aaaa,\n"
6643 " },\n"
6644 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006645 verifyFormat("class C : public D {\n"
6646 " SomeClass SC{2};\n"
6647 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006648 verifyFormat("class C : public A {\n"
6649 " class D : public B {\n"
6650 " void f() { int i{2}; }\n"
6651 " };\n"
6652 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006653 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006654
Francois Ferrandd2130f52017-06-30 20:00:02 +00006655 // Binpacking only if there is no trailing comma
6656 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6657 " cccccccccc, dddddddddd};",
6658 getLLVMStyleWithColumns(50));
6659 verifyFormat("const Aaaaaa aaaaa = {\n"
6660 " aaaaaaaaaaa,\n"
6661 " bbbbbbbbbbb,\n"
6662 " ccccccccccc,\n"
6663 " ddddddddddd,\n"
6664 "};", getLLVMStyleWithColumns(50));
6665
Daniel Jaspere4ada022016-12-13 10:05:03 +00006666 // Cases where distinguising braced lists and blocks is hard.
6667 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6668 verifyFormat("void f() {\n"
6669 " return; // comment\n"
6670 "}\n"
6671 "SomeType t;");
6672 verifyFormat("void f() {\n"
6673 " if (a) {\n"
6674 " f();\n"
6675 " }\n"
6676 "}\n"
6677 "SomeType t;");
6678
Daniel Jasper08434342015-05-26 07:26:26 +00006679 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006680 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006681 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006682 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6683 " bbbbb,\n"
6684 " ccccc,\n"
6685 " ddddd,\n"
6686 " eeeee,\n"
6687 " ffffff,\n"
6688 " ggggg,\n"
6689 " hhhhhh,\n"
6690 " iiiiii,\n"
6691 " jjjjjj,\n"
6692 " kkkkkk};",
6693 NoBinPacking);
6694 verifyFormat("const Aaaaaa aaaaa = {\n"
6695 " aaaaa,\n"
6696 " bbbbb,\n"
6697 " ccccc,\n"
6698 " ddddd,\n"
6699 " eeeee,\n"
6700 " ffffff,\n"
6701 " ggggg,\n"
6702 " hhhhhh,\n"
6703 " iiiiii,\n"
6704 " jjjjjj,\n"
6705 " kkkkkk,\n"
6706 "};",
6707 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006708 verifyFormat(
6709 "const Aaaaaa aaaaa = {\n"
6710 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6711 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6712 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6713 "};",
6714 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006715
Chandler Carruthf8b72662014-03-02 12:37:31 +00006716 // FIXME: The alignment of these trailing comments might be bad. Then again,
6717 // this might be utterly useless in real code.
6718 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006719 " : some_value{ //\n"
6720 " aaaaaaa, //\n"
6721 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006722
Chandler Carruthf8b72662014-03-02 12:37:31 +00006723 // In braced lists, the first comment is always assumed to belong to the
6724 // first element. Thus, it can be moved to the next or previous line as
6725 // appropriate.
6726 EXPECT_EQ("function({// First element:\n"
6727 " 1,\n"
6728 " // Second element:\n"
6729 " 2});",
6730 format("function({\n"
6731 " // First element:\n"
6732 " 1,\n"
6733 " // Second element:\n"
6734 " 2});"));
6735 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6736 " // First element:\n"
6737 " 1,\n"
6738 " // Second element:\n"
6739 " 2};",
6740 format("std::vector<int> MyNumbers{// First element:\n"
6741 " 1,\n"
6742 " // Second element:\n"
6743 " 2};",
6744 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00006745 // A trailing comma should still lead to an enforced line break and no
6746 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00006747 EXPECT_EQ("vector<int> SomeVector = {\n"
6748 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006749 " 1,\n"
6750 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006751 "};",
6752 format("vector<int> SomeVector = { // aaa\n"
6753 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006754
Chandler Carruthf8b72662014-03-02 12:37:31 +00006755 FormatStyle ExtraSpaces = getLLVMStyle();
6756 ExtraSpaces.Cpp11BracedListStyle = false;
6757 ExtraSpaces.ColumnLimit = 75;
6758 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6759 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6760 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6761 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6762 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6763 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6764 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6765 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6766 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6767 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6768 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6769 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6770 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6771 verifyFormat("class Class {\n"
6772 " T member = { arg1, arg2 };\n"
6773 "};",
6774 ExtraSpaces);
6775 verifyFormat(
6776 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6777 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6778 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6779 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6780 ExtraSpaces);
6781 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006782 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006783 ExtraSpaces);
6784 verifyFormat(
6785 "someFunction(OtherParam,\n"
6786 " BracedList{ // comment 1 (Forcing interesting break)\n"
6787 " param1, param2,\n"
6788 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006789 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006790 ExtraSpaces);
6791 verifyFormat(
6792 "std::this_thread::sleep_for(\n"
6793 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6794 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006795 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006796 " aaaaaaa,\n"
6797 " aaaaaaaaaa,\n"
6798 " aaaaa,\n"
6799 " aaaaaaaaaaaaaaa,\n"
6800 " aaa,\n"
6801 " aaaaaaaaaa,\n"
6802 " a,\n"
6803 " aaaaaaaaaaaaaaaaaaaaa,\n"
6804 " aaaaaaaaaaaa,\n"
6805 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6806 " aaaaaaa,\n"
6807 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006808 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00006809 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
6810 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006811}
6812
Daniel Jasper33b909c2013-10-25 14:29:37 +00006813TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006814 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6815 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6816 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6817 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6818 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6819 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006820 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006821 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006822 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006823 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6824 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006825 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006826 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6827 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6828 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6829 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6830 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6831 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6832 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006833 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006834 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6835 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006836 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6837 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6838 " // Separating comment.\n"
6839 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6840 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6841 " // Leading comment\n"
6842 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6843 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006844 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6845 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006846 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006847 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6848 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006849 getLLVMStyleWithColumns(38));
6850 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006851 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6852 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006853 verifyFormat(
6854 "static unsigned SomeValues[10][3] = {\n"
6855 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6856 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6857 verifyFormat("static auto fields = new vector<string>{\n"
6858 " \"aaaaaaaaaaaaa\",\n"
6859 " \"aaaaaaaaaaaaa\",\n"
6860 " \"aaaaaaaaaaaa\",\n"
6861 " \"aaaaaaaaaaaaaa\",\n"
6862 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6863 " \"aaaaaaaaaaaa\",\n"
6864 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6865 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006866 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6867 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6868 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6869 " 3, cccccccccccccccccccccc};",
6870 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006871
6872 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006873 verifyFormat("vector<int> x = {\n"
6874 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6875 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006876 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006877 verifyFormat("vector<int> x = {\n"
6878 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006879 "};",
6880 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006881 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6882 " 1, 1, 1, 1,\n"
6883 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006884 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006885
Daniel Jasper60c27072015-05-13 08:16:00 +00006886 // Trailing comment in the first line.
6887 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6888 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6889 " 111111111, 222222222, 3333333333, 444444444, //\n"
6890 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006891 // Trailing comment in the last line.
6892 verifyFormat("int aaaaa[] = {\n"
6893 " 1, 2, 3, // comment\n"
6894 " 4, 5, 6 // comment\n"
6895 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006896
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006897 // With nested lists, we should either format one item per line or all nested
6898 // lists one on line.
6899 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006900 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6901 " {aaaaaaaaaaaaaaaaaaa},\n"
6902 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6903 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006904 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006905 verifyFormat(
6906 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006907 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6908 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6909 " {aaa, aaa},\n"
6910 " {aaa, aaa},\n"
6911 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6912 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6913 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006914
6915 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00006916 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006917 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006918
6919 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006920
Daniel Jaspereb65e912015-12-21 18:31:15 +00006921 // No braced initializer here.
6922 verifyFormat("void f() {\n"
6923 " struct Dummy {};\n"
6924 " f(v);\n"
6925 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006926
6927 // Long lists should be formatted in columns even if they are nested.
6928 verifyFormat(
6929 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6930 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6931 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6932 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6933 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6934 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006935
6936 // Allow "single-column" layout even if that violates the column limit. There
6937 // isn't going to be a better way.
6938 verifyFormat("std::vector<int> a = {\n"
6939 " aaaaaaaa,\n"
6940 " aaaaaaaa,\n"
6941 " aaaaaaaa,\n"
6942 " aaaaaaaa,\n"
6943 " aaaaaaaaaa,\n"
6944 " aaaaaaaa,\n"
6945 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6946 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006947 verifyFormat("vector<int> aaaa = {\n"
6948 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6949 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6950 " aaaaaa.aaaaaaa,\n"
6951 " aaaaaa.aaaaaaa,\n"
6952 " aaaaaa.aaaaaaa,\n"
6953 " aaaaaa.aaaaaaa,\n"
6954 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006955
6956 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006957 verifyFormat("someFunction(Param, {List1, List2,\n"
6958 " List3});",
6959 getLLVMStyleWithColumns(35));
6960 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006961 " {List1, List2,\n"
6962 " List3});",
6963 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006964 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6965 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006966}
6967
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006968TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006969 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006970 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006971
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006972 verifyFormat("void f() { return 42; }");
6973 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006974 " return 42;\n"
6975 "}",
6976 DoNotMerge);
6977 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006978 " // Comment\n"
6979 "}");
6980 verifyFormat("{\n"
6981 "#error {\n"
6982 " int a;\n"
6983 "}");
6984 verifyFormat("{\n"
6985 " int a;\n"
6986 "#error {\n"
6987 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006988 verifyFormat("void f() {} // comment");
6989 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006990 verifyFormat("void f() {\n"
6991 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006992 DoNotMerge);
6993 verifyFormat("void f() {\n"
6994 " int a;\n"
6995 "} // comment",
6996 DoNotMerge);
6997 verifyFormat("void f() {\n"
6998 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006999 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007000
7001 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7002 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7003
7004 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7005 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007006 verifyFormat("class C {\n"
7007 " C()\n"
7008 " : iiiiiiii(nullptr),\n"
7009 " kkkkkkk(nullptr),\n"
7010 " mmmmmmm(nullptr),\n"
7011 " nnnnnnn(nullptr) {}\n"
7012 "};",
7013 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007014
7015 FormatStyle NoColumnLimit = getLLVMStyle();
7016 NoColumnLimit.ColumnLimit = 0;
7017 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7018 EXPECT_EQ("class C {\n"
7019 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007020 "};",
7021 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007022 EXPECT_EQ("A()\n"
7023 " : b(0) {\n"
7024 "}",
7025 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7026
7027 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007028 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7029 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007030 EXPECT_EQ("A()\n"
7031 " : b(0) {\n"
7032 "}",
7033 format("A():b(0){}", DoNotMergeNoColumnLimit));
7034 EXPECT_EQ("A()\n"
7035 " : b(0) {\n"
7036 "}",
7037 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007038
7039 verifyFormat("#define A \\\n"
7040 " void f() { \\\n"
7041 " int i; \\\n"
7042 " }",
7043 getLLVMStyleWithColumns(20));
7044 verifyFormat("#define A \\\n"
7045 " void f() { int i; }",
7046 getLLVMStyleWithColumns(21));
7047 verifyFormat("#define A \\\n"
7048 " void f() { \\\n"
7049 " int i; \\\n"
7050 " } \\\n"
7051 " int j;",
7052 getLLVMStyleWithColumns(22));
7053 verifyFormat("#define A \\\n"
7054 " void f() { int i; } \\\n"
7055 " int j;",
7056 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007057}
7058
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007059TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
7060 FormatStyle MergeEmptyOnly = getLLVMStyle();
7061 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7062 verifyFormat("class C {\n"
7063 " int f() {}\n"
7064 "};",
7065 MergeEmptyOnly);
7066 verifyFormat("class C {\n"
7067 " int f() {\n"
7068 " return 42;\n"
7069 " }\n"
7070 "};",
7071 MergeEmptyOnly);
7072 verifyFormat("int f() {}", MergeEmptyOnly);
7073 verifyFormat("int f() {\n"
7074 " return 42;\n"
7075 "}",
7076 MergeEmptyOnly);
7077
7078 // Also verify behavior when BraceWrapping.AfterFunction = true
7079 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7080 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
7081 verifyFormat("int f() {}", MergeEmptyOnly);
7082 verifyFormat("class C {\n"
7083 " int f() {}\n"
7084 "};",
7085 MergeEmptyOnly);
7086}
7087
Daniel Jasperd74cf402014-04-08 12:46:38 +00007088TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7089 FormatStyle MergeInlineOnly = getLLVMStyle();
7090 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7091 verifyFormat("class C {\n"
7092 " int f() { return 42; }\n"
7093 "};",
7094 MergeInlineOnly);
7095 verifyFormat("int f() {\n"
7096 " return 42;\n"
7097 "}",
7098 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007099
7100 // SFS_Inline implies SFS_Empty
7101 verifyFormat("class C {\n"
7102 " int f() {}\n"
7103 "};",
7104 MergeInlineOnly);
7105 verifyFormat("int f() {}", MergeInlineOnly);
7106
7107 // Also verify behavior when BraceWrapping.AfterFunction = true
7108 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7109 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7110 verifyFormat("class C {\n"
7111 " int f() { return 42; }\n"
7112 "};",
7113 MergeInlineOnly);
7114 verifyFormat("int f()\n"
7115 "{\n"
7116 " return 42;\n"
7117 "}",
7118 MergeInlineOnly);
7119
7120 // SFS_Inline implies SFS_Empty
7121 verifyFormat("int f() {}", MergeInlineOnly);
7122 verifyFormat("class C {\n"
7123 " int f() {}\n"
7124 "};",
7125 MergeInlineOnly);
7126}
7127
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00007128TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
7129 FormatStyle MergeInlineOnly = getLLVMStyle();
7130 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
7131 FormatStyle::SFS_InlineOnly;
7132 verifyFormat("class C {\n"
7133 " int f() { return 42; }\n"
7134 "};",
7135 MergeInlineOnly);
7136 verifyFormat("int f() {\n"
7137 " return 42;\n"
7138 "}",
7139 MergeInlineOnly);
7140
7141 // SFS_InlineOnly does not imply SFS_Empty
7142 verifyFormat("class C {\n"
7143 " int f() {}\n"
7144 "};",
7145 MergeInlineOnly);
7146 verifyFormat("int f() {\n"
7147 "}",
7148 MergeInlineOnly);
7149
7150 // Also verify behavior when BraceWrapping.AfterFunction = true
7151 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7152 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7153 verifyFormat("class C {\n"
7154 " int f() { return 42; }\n"
7155 "};",
7156 MergeInlineOnly);
7157 verifyFormat("int f()\n"
7158 "{\n"
7159 " return 42;\n"
7160 "}",
7161 MergeInlineOnly);
7162
7163 // SFS_InlineOnly does not imply SFS_Empty
7164 verifyFormat("int f()\n"
7165 "{\n"
7166 "}",
7167 MergeInlineOnly);
7168 verifyFormat("class C {\n"
7169 " int f() {}\n"
7170 "};",
7171 MergeInlineOnly);
7172}
7173
Francois Ferrandad722562017-06-30 20:25:55 +00007174TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007175 FormatStyle Style = getLLVMStyle();
7176 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7177 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7178 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00007179 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007180 Style.ColumnLimit = 40;
7181
7182 verifyFormat("int f()\n"
7183 "{}",
7184 Style);
7185 verifyFormat("int f()\n"
7186 "{\n"
7187 " return 42;\n"
7188 "}",
7189 Style);
7190 verifyFormat("int f()\n"
7191 "{\n"
7192 " // some comment\n"
7193 "}",
7194 Style);
7195
7196 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7197 verifyFormat("int f() {}", Style);
7198 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7199 "{}",
7200 Style);
7201 verifyFormat("int f()\n"
7202 "{\n"
7203 " return 0;\n"
7204 "}",
7205 Style);
7206
7207 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7208 verifyFormat("class Foo {\n"
7209 " int f() {}\n"
7210 "};\n",
7211 Style);
7212 verifyFormat("class Foo {\n"
7213 " int f() { return 0; }\n"
7214 "};\n",
7215 Style);
7216 verifyFormat("class Foo {\n"
7217 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7218 " {}\n"
7219 "};\n",
7220 Style);
7221 verifyFormat("class Foo {\n"
7222 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7223 " {\n"
7224 " return 0;\n"
7225 " }\n"
7226 "};\n",
7227 Style);
7228
7229 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7230 verifyFormat("int f() {}", Style);
7231 verifyFormat("int f() { return 0; }", Style);
7232 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7233 "{}",
7234 Style);
7235 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7236 "{\n"
7237 " return 0;\n"
7238 "}",
7239 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00007240}
Krasimir Georgiev6a1c9d52017-10-02 15:53:37 +00007241TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
7242 FormatStyle Style = getLLVMStyle();
7243 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7244 verifyFormat("#ifdef A\n"
7245 "int f() {}\n"
7246 "#else\n"
7247 "int g() {}\n"
7248 "#endif",
7249 Style);
7250}
Daniel Jasperd74cf402014-04-08 12:46:38 +00007251
Francois Ferrandad722562017-06-30 20:25:55 +00007252TEST_F(FormatTest, SplitEmptyClass) {
7253 FormatStyle Style = getLLVMStyle();
7254 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7255 Style.BraceWrapping.AfterClass = true;
7256 Style.BraceWrapping.SplitEmptyRecord = false;
7257
7258 verifyFormat("class Foo\n"
7259 "{};",
7260 Style);
7261 verifyFormat("/* something */ class Foo\n"
7262 "{};",
7263 Style);
7264 verifyFormat("template <typename X> class Foo\n"
7265 "{};",
7266 Style);
7267 verifyFormat("class Foo\n"
7268 "{\n"
7269 " Foo();\n"
7270 "};",
7271 Style);
7272 verifyFormat("typedef class Foo\n"
7273 "{\n"
7274 "} Foo_t;",
7275 Style);
7276}
7277
7278TEST_F(FormatTest, SplitEmptyStruct) {
7279 FormatStyle Style = getLLVMStyle();
7280 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7281 Style.BraceWrapping.AfterStruct = true;
7282 Style.BraceWrapping.SplitEmptyRecord = false;
7283
7284 verifyFormat("struct Foo\n"
7285 "{};",
7286 Style);
7287 verifyFormat("/* something */ struct Foo\n"
7288 "{};",
7289 Style);
7290 verifyFormat("template <typename X> struct Foo\n"
7291 "{};",
7292 Style);
7293 verifyFormat("struct Foo\n"
7294 "{\n"
7295 " Foo();\n"
7296 "};",
7297 Style);
7298 verifyFormat("typedef struct Foo\n"
7299 "{\n"
7300 "} Foo_t;",
7301 Style);
7302 //typedef struct Bar {} Bar_t;
7303}
7304
7305TEST_F(FormatTest, SplitEmptyUnion) {
7306 FormatStyle Style = getLLVMStyle();
7307 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7308 Style.BraceWrapping.AfterUnion = true;
7309 Style.BraceWrapping.SplitEmptyRecord = false;
7310
7311 verifyFormat("union Foo\n"
7312 "{};",
7313 Style);
7314 verifyFormat("/* something */ union Foo\n"
7315 "{};",
7316 Style);
7317 verifyFormat("union Foo\n"
7318 "{\n"
7319 " A,\n"
7320 "};",
7321 Style);
7322 verifyFormat("typedef union Foo\n"
7323 "{\n"
7324 "} Foo_t;",
7325 Style);
7326}
7327
7328TEST_F(FormatTest, SplitEmptyNamespace) {
7329 FormatStyle Style = getLLVMStyle();
7330 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7331 Style.BraceWrapping.AfterNamespace = true;
7332 Style.BraceWrapping.SplitEmptyNamespace = false;
7333
7334 verifyFormat("namespace Foo\n"
7335 "{};",
7336 Style);
7337 verifyFormat("/* something */ namespace Foo\n"
7338 "{};",
7339 Style);
7340 verifyFormat("inline namespace Foo\n"
7341 "{};",
7342 Style);
7343 verifyFormat("namespace Foo\n"
7344 "{\n"
7345 "void Bar();\n"
7346 "};",
7347 Style);
7348}
7349
7350TEST_F(FormatTest, NeverMergeShortRecords) {
7351 FormatStyle Style = getLLVMStyle();
7352
7353 verifyFormat("class Foo {\n"
7354 " Foo();\n"
7355 "};",
7356 Style);
7357 verifyFormat("typedef class Foo {\n"
7358 " Foo();\n"
7359 "} Foo_t;",
7360 Style);
7361 verifyFormat("struct Foo {\n"
7362 " Foo();\n"
7363 "};",
7364 Style);
7365 verifyFormat("typedef struct Foo {\n"
7366 " Foo();\n"
7367 "} Foo_t;",
7368 Style);
7369 verifyFormat("union Foo {\n"
7370 " A,\n"
7371 "};",
7372 Style);
7373 verifyFormat("typedef union Foo {\n"
7374 " A,\n"
7375 "} Foo_t;",
7376 Style);
7377 verifyFormat("namespace Foo {\n"
7378 "void Bar();\n"
7379 "};",
7380 Style);
7381
7382 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7383 Style.BraceWrapping.AfterClass = true;
7384 Style.BraceWrapping.AfterStruct = true;
7385 Style.BraceWrapping.AfterUnion = true;
7386 Style.BraceWrapping.AfterNamespace = true;
7387 verifyFormat("class Foo\n"
7388 "{\n"
7389 " Foo();\n"
7390 "};",
7391 Style);
7392 verifyFormat("typedef class Foo\n"
7393 "{\n"
7394 " Foo();\n"
7395 "} Foo_t;",
7396 Style);
7397 verifyFormat("struct Foo\n"
7398 "{\n"
7399 " Foo();\n"
7400 "};",
7401 Style);
7402 verifyFormat("typedef struct Foo\n"
7403 "{\n"
7404 " Foo();\n"
7405 "} Foo_t;",
7406 Style);
7407 verifyFormat("union Foo\n"
7408 "{\n"
7409 " A,\n"
7410 "};",
7411 Style);
7412 verifyFormat("typedef union Foo\n"
7413 "{\n"
7414 " A,\n"
7415 "} Foo_t;",
7416 Style);
7417 verifyFormat("namespace Foo\n"
7418 "{\n"
7419 "void Bar();\n"
7420 "};",
7421 Style);
7422}
7423
Manuel Klimeke01bab52013-01-15 13:38:33 +00007424TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7425 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007426 verifyFormat("struct foo a = {bar};\nint n;");
7427 verifyFormat("class foo a = {bar};\nint n;");
7428 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007429
7430 // Elaborate types inside function definitions.
7431 verifyFormat("struct foo f() {}\nint n;");
7432 verifyFormat("class foo f() {}\nint n;");
7433 verifyFormat("union foo f() {}\nint n;");
7434
7435 // Templates.
7436 verifyFormat("template <class X> void f() {}\nint n;");
7437 verifyFormat("template <struct X> void f() {}\nint n;");
7438 verifyFormat("template <union X> void f() {}\nint n;");
7439
7440 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007441 verifyFormat("struct {\n} n;");
7442 verifyFormat(
7443 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007444 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007445 verifyFormat("class MACRO Z {\n} n;");
7446 verifyFormat("class MACRO(X) Z {\n} n;");
7447 verifyFormat("class __attribute__(X) Z {\n} n;");
7448 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007449 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007450 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007451 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7452 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007453
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007454 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007455 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007456
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007457 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007458 verifyFormat(
7459 "template <typename F>\n"
7460 "Matcher(const Matcher<F> &Other,\n"
7461 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7462 " !is_same<F, T>::value>::type * = 0)\n"
7463 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7464
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007465 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007466 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007467 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007468
7469 // FIXME:
7470 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007471 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007472
Manuel Klimeke01bab52013-01-15 13:38:33 +00007473 // Elaborate types where incorrectly parsing the structural element would
7474 // break the indent.
7475 verifyFormat("if (true)\n"
7476 " class X x;\n"
7477 "else\n"
7478 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007479
7480 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007481 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007482}
7483
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007484TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007485 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7486 format("#error Leave all white!!!!! space* alone!\n"));
7487 EXPECT_EQ(
7488 "#warning Leave all white!!!!! space* alone!\n",
7489 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007490 EXPECT_EQ("#error 1", format(" # error 1"));
7491 EXPECT_EQ("#warning 1", format(" # warning 1"));
7492}
7493
Daniel Jasper4431aa92013-04-23 13:54:04 +00007494TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007495 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007496 verifyFormat("#if (AAAA && BBBB)");
7497 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007498 // FIXME: Come up with a better indentation for #elif.
7499 verifyFormat(
7500 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7501 " defined(BBBBBBBB)\n"
7502 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7503 " defined(BBBBBBBB)\n"
7504 "#endif",
7505 getLLVMStyleWithColumns(65));
7506}
7507
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007508TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7509 FormatStyle AllowsMergedIf = getGoogleStyle();
7510 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7511 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7512 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007513 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7514 EXPECT_EQ("if (true) return 42;",
7515 format("if (true)\nreturn 42;", AllowsMergedIf));
7516 FormatStyle ShortMergedIf = AllowsMergedIf;
7517 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007518 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007519 " if (true) return 42;",
7520 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007521 verifyFormat("#define A \\\n"
7522 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007523 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007524 "#define B",
7525 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007526 verifyFormat("#define A \\\n"
7527 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007528 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007529 "g();",
7530 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007531 verifyFormat("{\n"
7532 "#ifdef A\n"
7533 " // Comment\n"
7534 " if (true) continue;\n"
7535 "#endif\n"
7536 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007537 " if (true) continue;\n"
7538 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007539 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007540 ShortMergedIf.ColumnLimit = 33;
7541 verifyFormat("#define A \\\n"
7542 " if constexpr (true) return 42;",
7543 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007544 ShortMergedIf.ColumnLimit = 29;
7545 verifyFormat("#define A \\\n"
7546 " if (aaaaaaaaaa) return 1; \\\n"
7547 " return 2;",
7548 ShortMergedIf);
7549 ShortMergedIf.ColumnLimit = 28;
7550 verifyFormat("#define A \\\n"
7551 " if (aaaaaaaaaa) \\\n"
7552 " return 1; \\\n"
7553 " return 2;",
7554 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007555 verifyFormat("#define A \\\n"
7556 " if constexpr (aaaaaaa) \\\n"
7557 " return 1; \\\n"
7558 " return 2;",
7559 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007560}
7561
Manuel Klimekd33516e2013-01-23 10:09:28 +00007562TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007563 verifyFormat("void f(int *a);");
7564 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007565 verifyFormat("class A {\n void f(int *a);\n};");
7566 verifyFormat("class A {\n int *a;\n};");
7567 verifyFormat("namespace a {\n"
7568 "namespace b {\n"
7569 "class A {\n"
7570 " void f() {}\n"
7571 " int *a;\n"
7572 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00007573 "} // namespace b\n"
7574 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007575}
7576
Manuel Klimekd33516e2013-01-23 10:09:28 +00007577TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7578 verifyFormat("while");
7579 verifyFormat("operator");
7580}
7581
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007582TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7583 // This code would be painfully slow to format if we didn't skip it.
7584 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
7585 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7586 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7587 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7588 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7589 "A(1, 1)\n"
7590 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7591 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7592 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7593 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7594 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7595 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7596 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7597 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7598 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7599 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7600 // Deeply nested part is untouched, rest is formatted.
7601 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7602 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00007603 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007604}
7605
Nico Weber7e6a7a12013-01-08 17:56:31 +00007606//===----------------------------------------------------------------------===//
7607// Objective-C tests.
7608//===----------------------------------------------------------------------===//
7609
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007610TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7611 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7612 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7613 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007614 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007615 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7616 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7617 format("-(NSInteger)Method3:(id)anObject;"));
7618 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7619 format("-(NSInteger)Method4:(id)anObject;"));
7620 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7621 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7622 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7623 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007624 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7625 "forAllCells:(BOOL)flag;",
7626 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7627 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007628
7629 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007630 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7631 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007632 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7633 " inRange:(NSRange)range\n"
7634 " outRange:(NSRange)out_range\n"
7635 " outRange1:(NSRange)out_range1\n"
7636 " outRange2:(NSRange)out_range2\n"
7637 " outRange3:(NSRange)out_range3\n"
7638 " outRange4:(NSRange)out_range4\n"
7639 " outRange5:(NSRange)out_range5\n"
7640 " outRange6:(NSRange)out_range6\n"
7641 " outRange7:(NSRange)out_range7\n"
7642 " outRange8:(NSRange)out_range8\n"
7643 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007644
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007645 // When the function name has to be wrapped.
7646 FormatStyle Style = getLLVMStyle();
7647 Style.IndentWrappedFunctionNames = false;
7648 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7649 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7650 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7651 "}",
7652 Style);
7653 Style.IndentWrappedFunctionNames = true;
7654 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7655 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7656 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7657 "}",
7658 Style);
7659
Nico Weberd6f962f2013-01-10 20:18:33 +00007660 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007661 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007662 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7663 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007664 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007665
Daniel Jasper37194282013-05-28 08:33:00 +00007666 verifyFormat("- (int (*)())foo:(int (*)())f;");
7667 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007668
7669 // If there's no return type (very rare in practice!), LLVM and Google style
7670 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007671 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007672 verifyFormat("- foo:(int)f;");
7673 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007674}
7675
Nico Weber0588b502013-02-07 00:19:29 +00007676
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007677TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007678 EXPECT_EQ("\"some text \"\n"
7679 "\"other\";",
7680 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007681 EXPECT_EQ("\"some text \"\n"
7682 "\"other\";",
7683 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007684 EXPECT_EQ(
7685 "#define A \\\n"
7686 " \"some \" \\\n"
7687 " \"text \" \\\n"
7688 " \"other\";",
7689 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7690 EXPECT_EQ(
7691 "#define A \\\n"
7692 " \"so \" \\\n"
7693 " \"text \" \\\n"
7694 " \"other\";",
7695 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7696
7697 EXPECT_EQ("\"some text\"",
7698 format("\"some text\"", getLLVMStyleWithColumns(1)));
7699 EXPECT_EQ("\"some text\"",
7700 format("\"some text\"", getLLVMStyleWithColumns(11)));
7701 EXPECT_EQ("\"some \"\n"
7702 "\"text\"",
7703 format("\"some text\"", getLLVMStyleWithColumns(10)));
7704 EXPECT_EQ("\"some \"\n"
7705 "\"text\"",
7706 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007707 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007708 "\" tex\"\n"
7709 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007710 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007711 EXPECT_EQ("\"some\"\n"
7712 "\" tex\"\n"
7713 "\" and\"",
7714 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7715 EXPECT_EQ("\"some\"\n"
7716 "\"/tex\"\n"
7717 "\"/and\"",
7718 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007719
7720 EXPECT_EQ("variable =\n"
7721 " \"long string \"\n"
7722 " \"literal\";",
7723 format("variable = \"long string literal\";",
7724 getLLVMStyleWithColumns(20)));
7725
7726 EXPECT_EQ("variable = f(\n"
7727 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007728 " \"literal\",\n"
7729 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007730 " loooooooooooooooooooong);",
7731 format("variable = f(\"long string literal\", short, "
7732 "loooooooooooooooooooong);",
7733 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007734
Daniel Jaspera44991332015-04-29 13:06:49 +00007735 EXPECT_EQ(
7736 "f(g(\"long string \"\n"
7737 " \"literal\"),\n"
7738 " b);",
7739 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007740 EXPECT_EQ("f(g(\"long string \"\n"
7741 " \"literal\",\n"
7742 " a),\n"
7743 " b);",
7744 format("f(g(\"long string literal\", a), b);",
7745 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007746 EXPECT_EQ(
7747 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007748 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007749 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7750 EXPECT_EQ("f(\"one two three four five six \"\n"
7751 " \"seven\".split(\n"
7752 " really_looooong_variable));",
7753 format("f(\"one two three four five six seven\"."
7754 "split(really_looooong_variable));",
7755 getLLVMStyleWithColumns(33)));
7756
7757 EXPECT_EQ("f(\"some \"\n"
7758 " \"text\",\n"
7759 " other);",
7760 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007761
7762 // Only break as a last resort.
7763 verifyFormat(
7764 "aaaaaaaaaaaaaaaaaaaa(\n"
7765 " aaaaaaaaaaaaaaaaaaaa,\n"
7766 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007767
Daniel Jaspera44991332015-04-29 13:06:49 +00007768 EXPECT_EQ("\"splitmea\"\n"
7769 "\"trandomp\"\n"
7770 "\"oint\"",
7771 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007772
Daniel Jaspera44991332015-04-29 13:06:49 +00007773 EXPECT_EQ("\"split/\"\n"
7774 "\"pathat/\"\n"
7775 "\"slashes\"",
7776 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007777
Daniel Jaspera44991332015-04-29 13:06:49 +00007778 EXPECT_EQ("\"split/\"\n"
7779 "\"pathat/\"\n"
7780 "\"slashes\"",
7781 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007782 EXPECT_EQ("\"split at \"\n"
7783 "\"spaces/at/\"\n"
7784 "\"slashes.at.any$\"\n"
7785 "\"non-alphanumeric%\"\n"
7786 "\"1111111111characte\"\n"
7787 "\"rs\"",
7788 format("\"split at "
7789 "spaces/at/"
7790 "slashes.at."
7791 "any$non-"
7792 "alphanumeric%"
7793 "1111111111characte"
7794 "rs\"",
7795 getLLVMStyleWithColumns(20)));
7796
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007797 // Verify that splitting the strings understands
7798 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007799 EXPECT_EQ(
7800 "aaaaaaaaaaaa(\n"
7801 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7802 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7803 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7804 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7805 "aaaaaaaaaaaaaaaaaaaaaa\");",
7806 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007807 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7808 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7809 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7810 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7811 "aaaaaaaaaaaaaaaaaaaaaa\";",
7812 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007813 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7814 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7815 format("llvm::outs() << "
7816 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7817 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007818 EXPECT_EQ("ffff(\n"
7819 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7820 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7821 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7822 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7823 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007824
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007825 FormatStyle Style = getLLVMStyleWithColumns(12);
7826 Style.BreakStringLiterals = false;
7827 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7828
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007829 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007830 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00007831 EXPECT_EQ("#define A \\\n"
7832 " \"some \" \\\n"
7833 " \"text \" \\\n"
7834 " \"other\";",
7835 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007836}
7837
Manuel Klimek93699f42017-11-29 14:29:43 +00007838TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
7839 EXPECT_EQ("C a = \"some more \"\n"
7840 " \"text\";",
7841 format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
7842}
7843
Manuel Klimek9e321992015-07-28 15:50:24 +00007844TEST_F(FormatTest, FullyRemoveEmptyLines) {
7845 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7846 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7847 EXPECT_EQ("int i = a(b());",
7848 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7849}
7850
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007851TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7852 EXPECT_EQ(
7853 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7854 "(\n"
7855 " \"x\t\");",
7856 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7857 "aaaaaaa("
7858 "\"x\t\");"));
7859}
7860
Daniel Jasper174b0122014-01-09 14:18:12 +00007861TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007862 EXPECT_EQ(
7863 "u8\"utf8 string \"\n"
7864 "u8\"literal\";",
7865 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7866 EXPECT_EQ(
7867 "u\"utf16 string \"\n"
7868 "u\"literal\";",
7869 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7870 EXPECT_EQ(
7871 "U\"utf32 string \"\n"
7872 "U\"literal\";",
7873 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7874 EXPECT_EQ("L\"wide string \"\n"
7875 "L\"literal\";",
7876 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007877 EXPECT_EQ("@\"NSString \"\n"
7878 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007879 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00007880 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007881
7882 // This input makes clang-format try to split the incomplete unicode escape
7883 // sequence, which used to lead to a crasher.
7884 verifyNoCrash(
7885 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7886 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007887}
7888
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007889TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7890 FormatStyle Style = getGoogleStyleWithColumns(15);
7891 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7892 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7893 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7894 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7895 EXPECT_EQ("u8R\"x(raw literal)x\";",
7896 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007897}
7898
7899TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7900 FormatStyle Style = getLLVMStyleWithColumns(20);
7901 EXPECT_EQ(
7902 "_T(\"aaaaaaaaaaaaaa\")\n"
7903 "_T(\"aaaaaaaaaaaaaa\")\n"
7904 "_T(\"aaaaaaaaaaaa\")",
7905 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007906 EXPECT_EQ("f(x,\n"
7907 " _T(\"aaaaaaaaaaaa\")\n"
7908 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00007909 " z);",
7910 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7911
7912 // FIXME: Handle embedded spaces in one iteration.
7913 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7914 // "_T(\"aaaaaaaaaaaaa\")\n"
7915 // "_T(\"aaaaaaaaaaaaa\")\n"
7916 // "_T(\"a\")",
7917 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7918 // getLLVMStyleWithColumns(20)));
7919 EXPECT_EQ(
7920 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7921 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007922 EXPECT_EQ("f(\n"
7923 "#if !TEST\n"
7924 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7925 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00007926 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007927 format("f(\n"
7928 "#if !TEST\n"
7929 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7930 "#endif\n"
7931 ");"));
7932 EXPECT_EQ("f(\n"
7933 "\n"
7934 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7935 format("f(\n"
7936 "\n"
7937 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007938}
7939
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007940TEST_F(FormatTest, BreaksStringLiteralOperands) {
7941 // In a function call with two operands, the second can be broken with no line
7942 // break before it.
7943 EXPECT_EQ("func(a, \"long long \"\n"
7944 " \"long long\");",
7945 format("func(a, \"long long long long\");",
7946 getLLVMStyleWithColumns(24)));
7947 // In a function call with three operands, the second must be broken with a
7948 // line break before it.
7949 EXPECT_EQ("func(a,\n"
7950 " \"long long long \"\n"
7951 " \"long\",\n"
7952 " c);",
7953 format("func(a, \"long long long long\", c);",
7954 getLLVMStyleWithColumns(24)));
7955 // In a function call with three operands, the third must be broken with a
7956 // line break before it.
7957 EXPECT_EQ("func(a, b,\n"
7958 " \"long long long \"\n"
7959 " \"long\");",
7960 format("func(a, b, \"long long long long\");",
7961 getLLVMStyleWithColumns(24)));
7962 // In a function call with three operands, both the second and the third must
7963 // be broken with a line break before them.
7964 EXPECT_EQ("func(a,\n"
7965 " \"long long long \"\n"
7966 " \"long\",\n"
7967 " \"long long long \"\n"
7968 " \"long\");",
7969 format("func(a, \"long long long long\", \"long long long long\");",
7970 getLLVMStyleWithColumns(24)));
7971 // In a chain of << with two operands, the second can be broken with no line
7972 // break before it.
7973 EXPECT_EQ("a << \"line line \"\n"
7974 " \"line\";",
7975 format("a << \"line line line\";",
7976 getLLVMStyleWithColumns(20)));
7977 // In a chain of << with three operands, the second can be broken with no line
7978 // break before it.
7979 EXPECT_EQ("abcde << \"line \"\n"
7980 " \"line line\"\n"
7981 " << c;",
7982 format("abcde << \"line line line\" << c;",
7983 getLLVMStyleWithColumns(20)));
7984 // In a chain of << with three operands, the third must be broken with a line
7985 // break before it.
7986 EXPECT_EQ("a << b\n"
7987 " << \"line line \"\n"
7988 " \"line\";",
7989 format("a << b << \"line line line\";",
7990 getLLVMStyleWithColumns(20)));
7991 // In a chain of << with three operands, the second can be broken with no line
7992 // break before it and the third must be broken with a line break before it.
7993 EXPECT_EQ("abcd << \"line line \"\n"
7994 " \"line\"\n"
7995 " << \"line line \"\n"
7996 " \"line\";",
7997 format("abcd << \"line line line\" << \"line line line\";",
7998 getLLVMStyleWithColumns(20)));
7999 // In a chain of binary operators with two operands, the second can be broken
8000 // with no line break before it.
8001 EXPECT_EQ("abcd + \"line line \"\n"
8002 " \"line line\";",
8003 format("abcd + \"line line line line\";",
8004 getLLVMStyleWithColumns(20)));
8005 // In a chain of binary operators with three operands, the second must be
8006 // broken with a line break before it.
8007 EXPECT_EQ("abcd +\n"
8008 " \"line line \"\n"
8009 " \"line line\" +\n"
8010 " e;",
8011 format("abcd + \"line line line line\" + e;",
8012 getLLVMStyleWithColumns(20)));
8013 // In a function call with two operands, with AlignAfterOpenBracket enabled,
8014 // the first must be broken with a line break before it.
8015 FormatStyle Style = getLLVMStyleWithColumns(25);
8016 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8017 EXPECT_EQ("someFunction(\n"
8018 " \"long long long \"\n"
8019 " \"long\",\n"
8020 " a);",
8021 format("someFunction(\"long long long long\", a);", Style));
8022}
8023
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008024TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008025 EXPECT_EQ(
8026 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8027 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8028 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8029 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8030 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8031 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8032}
8033
8034TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8035 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008036 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008037 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8038 "multiline raw string literal xxxxxxxxxxxxxx\n"
8039 ")x\",\n"
8040 " a),\n"
8041 " b);",
8042 format("fffffffffff(g(R\"x(\n"
8043 "multiline raw string literal xxxxxxxxxxxxxx\n"
8044 ")x\", a), b);",
8045 getGoogleStyleWithColumns(20)));
8046 EXPECT_EQ("fffffffffff(\n"
8047 " g(R\"x(qqq\n"
8048 "multiline raw string literal xxxxxxxxxxxxxx\n"
8049 ")x\",\n"
8050 " a),\n"
8051 " b);",
8052 format("fffffffffff(g(R\"x(qqq\n"
8053 "multiline raw string literal xxxxxxxxxxxxxx\n"
8054 ")x\", a), b);",
8055 getGoogleStyleWithColumns(20)));
8056
8057 EXPECT_EQ("fffffffffff(R\"x(\n"
8058 "multiline raw string literal xxxxxxxxxxxxxx\n"
8059 ")x\");",
8060 format("fffffffffff(R\"x(\n"
8061 "multiline raw string literal xxxxxxxxxxxxxx\n"
8062 ")x\");",
8063 getGoogleStyleWithColumns(20)));
8064 EXPECT_EQ("fffffffffff(R\"x(\n"
8065 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008066 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008067 format("fffffffffff(R\"x(\n"
8068 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008069 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008070 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008071 EXPECT_EQ("fffffffffff(\n"
8072 " R\"x(\n"
8073 "multiline raw string literal xxxxxxxxxxxxxx\n"
8074 ")x\" +\n"
8075 " bbbbbb);",
8076 format("fffffffffff(\n"
8077 " R\"x(\n"
8078 "multiline raw string literal xxxxxxxxxxxxxx\n"
8079 ")x\" + bbbbbb);",
8080 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008081}
8082
Alexander Kornienkobe633902013-06-14 11:46:10 +00008083TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008084 verifyFormat("string a = \"unterminated;");
8085 EXPECT_EQ("function(\"unterminated,\n"
8086 " OtherParameter);",
8087 format("function( \"unterminated,\n"
8088 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008089}
8090
8091TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008092 FormatStyle Style = getLLVMStyle();
8093 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008094 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008095 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008096}
8097
Daniel Jaspera44991332015-04-29 13:06:49 +00008098TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008099
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008100TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8101 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8102 " \"ddeeefff\");",
8103 format("someFunction(\"aaabbbcccdddeeefff\");",
8104 getLLVMStyleWithColumns(25)));
8105 EXPECT_EQ("someFunction1234567890(\n"
8106 " \"aaabbbcccdddeeefff\");",
8107 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8108 getLLVMStyleWithColumns(26)));
8109 EXPECT_EQ("someFunction1234567890(\n"
8110 " \"aaabbbcccdddeeeff\"\n"
8111 " \"f\");",
8112 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8113 getLLVMStyleWithColumns(25)));
8114 EXPECT_EQ("someFunction1234567890(\n"
8115 " \"aaabbbcccdddeeeff\"\n"
8116 " \"f\");",
8117 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8118 getLLVMStyleWithColumns(24)));
Manuel Klimek77866142017-11-17 11:17:15 +00008119 EXPECT_EQ("someFunction(\n"
8120 " \"aaabbbcc ddde \"\n"
8121 " \"efff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008122 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008123 getLLVMStyleWithColumns(25)));
8124 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8125 " \"ddeeefff\");",
8126 format("someFunction(\"aaabbbccc ddeeefff\");",
8127 getLLVMStyleWithColumns(25)));
8128 EXPECT_EQ("someFunction1234567890(\n"
8129 " \"aaabb \"\n"
8130 " \"cccdddeeefff\");",
8131 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8132 getLLVMStyleWithColumns(25)));
8133 EXPECT_EQ("#define A \\\n"
8134 " string s = \\\n"
8135 " \"123456789\" \\\n"
8136 " \"0\"; \\\n"
8137 " int i;",
8138 format("#define A string s = \"1234567890\"; int i;",
8139 getLLVMStyleWithColumns(20)));
Manuel Klimek77866142017-11-17 11:17:15 +00008140 EXPECT_EQ("someFunction(\n"
8141 " \"aaabbbcc \"\n"
8142 " \"dddeeefff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008143 format("someFunction(\"aaabbbcc dddeeefff\");",
8144 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008145}
8146
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008147TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008148 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8149 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008150 EXPECT_EQ("\"test\"\n"
8151 "\"\\n\"",
8152 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8153 EXPECT_EQ("\"tes\\\\\"\n"
8154 "\"n\"",
8155 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8156 EXPECT_EQ("\"\\\\\\\\\"\n"
8157 "\"\\n\"",
8158 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008159 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008160 EXPECT_EQ("\"\\uff01\"\n"
8161 "\"test\"",
8162 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8163 EXPECT_EQ("\"\\Uff01ff02\"",
8164 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8165 EXPECT_EQ("\"\\x000000000001\"\n"
8166 "\"next\"",
8167 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8168 EXPECT_EQ("\"\\x000000000001next\"",
8169 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8170 EXPECT_EQ("\"\\x000000000001\"",
8171 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8172 EXPECT_EQ("\"test\"\n"
8173 "\"\\000000\"\n"
8174 "\"000001\"",
8175 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8176 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008177 "\"00000000\"\n"
8178 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008179 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008180}
8181
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008182TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8183 verifyFormat("void f() {\n"
8184 " return g() {}\n"
8185 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008186 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008187 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008188 "}");
8189}
8190
Manuel Klimek421147e2014-01-24 09:25:23 +00008191TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8192 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008193 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008194}
8195
Manuel Klimek13b97d82013-05-13 08:42:42 +00008196TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8197 verifyFormat("class X {\n"
8198 " void f() {\n"
8199 " }\n"
8200 "};",
8201 getLLVMStyleWithColumns(12));
8202}
8203
8204TEST_F(FormatTest, ConfigurableIndentWidth) {
8205 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8206 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008207 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008208 verifyFormat("void f() {\n"
8209 " someFunction();\n"
8210 " if (true) {\n"
8211 " f();\n"
8212 " }\n"
8213 "}",
8214 EightIndent);
8215 verifyFormat("class X {\n"
8216 " void f() {\n"
8217 " }\n"
8218 "};",
8219 EightIndent);
8220 verifyFormat("int x[] = {\n"
8221 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008222 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008223 EightIndent);
8224}
8225
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008226TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008227 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008228 "f();",
8229 getLLVMStyleWithColumns(8));
8230}
8231
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008232TEST_F(FormatTest, ConfigurableUseOfTab) {
8233 FormatStyle Tab = getLLVMStyleWithColumns(42);
8234 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008235 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008236 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008237
8238 EXPECT_EQ("if (aaaaaaaa && // q\n"
8239 " bb)\t\t// w\n"
8240 "\t;",
8241 format("if (aaaaaaaa &&// q\n"
8242 "bb)// w\n"
8243 ";",
8244 Tab));
8245 EXPECT_EQ("if (aaa && bbb) // w\n"
8246 "\t;",
8247 format("if(aaa&&bbb)// w\n"
8248 ";",
8249 Tab));
8250
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008251 verifyFormat("class X {\n"
8252 "\tvoid f() {\n"
8253 "\t\tsomeFunction(parameter1,\n"
8254 "\t\t\t parameter2);\n"
8255 "\t}\n"
8256 "};",
8257 Tab);
8258 verifyFormat("#define A \\\n"
8259 "\tvoid f() { \\\n"
8260 "\t\tsomeFunction( \\\n"
8261 "\t\t parameter1, \\\n"
8262 "\t\t parameter2); \\\n"
8263 "\t}",
8264 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008265
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008266 Tab.TabWidth = 4;
8267 Tab.IndentWidth = 8;
8268 verifyFormat("class TabWidth4Indent8 {\n"
8269 "\t\tvoid f() {\n"
8270 "\t\t\t\tsomeFunction(parameter1,\n"
8271 "\t\t\t\t\t\t\t parameter2);\n"
8272 "\t\t}\n"
8273 "};",
8274 Tab);
8275
8276 Tab.TabWidth = 4;
8277 Tab.IndentWidth = 4;
8278 verifyFormat("class TabWidth4Indent4 {\n"
8279 "\tvoid f() {\n"
8280 "\t\tsomeFunction(parameter1,\n"
8281 "\t\t\t\t\t parameter2);\n"
8282 "\t}\n"
8283 "};",
8284 Tab);
8285
8286 Tab.TabWidth = 8;
8287 Tab.IndentWidth = 4;
8288 verifyFormat("class TabWidth8Indent4 {\n"
8289 " void f() {\n"
8290 "\tsomeFunction(parameter1,\n"
8291 "\t\t parameter2);\n"
8292 " }\n"
8293 "};",
8294 Tab);
8295
Alexander Kornienko39856b72013-09-10 09:38:25 +00008296 Tab.TabWidth = 8;
8297 Tab.IndentWidth = 8;
8298 EXPECT_EQ("/*\n"
8299 "\t a\t\tcomment\n"
8300 "\t in multiple lines\n"
8301 " */",
8302 format(" /*\t \t \n"
8303 " \t \t a\t\tcomment\t \t\n"
8304 " \t \t in multiple lines\t\n"
8305 " \t */",
8306 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008307
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008308 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008309 verifyFormat("{\n"
8310 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8311 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8312 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8313 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8314 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8315 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008316 "};",
8317 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008318 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008319 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008320 "\ta2,\n"
8321 "\ta3\n"
8322 "};",
8323 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008324 EXPECT_EQ("if (aaaaaaaa && // q\n"
8325 " bb) // w\n"
8326 "\t;",
8327 format("if (aaaaaaaa &&// q\n"
8328 "bb)// w\n"
8329 ";",
8330 Tab));
8331 verifyFormat("class X {\n"
8332 "\tvoid f() {\n"
8333 "\t\tsomeFunction(parameter1,\n"
8334 "\t\t parameter2);\n"
8335 "\t}\n"
8336 "};",
8337 Tab);
8338 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008339 "\tQ(\n"
8340 "\t {\n"
8341 "\t\t int a;\n"
8342 "\t\t someFunction(aaaaaaaa,\n"
8343 "\t\t bbbbbbb);\n"
8344 "\t },\n"
8345 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008346 "}",
8347 Tab);
8348 EXPECT_EQ("{\n"
8349 "\t/* aaaa\n"
8350 "\t bbbb */\n"
8351 "}",
8352 format("{\n"
8353 "/* aaaa\n"
8354 " bbbb */\n"
8355 "}",
8356 Tab));
8357 EXPECT_EQ("{\n"
8358 "\t/*\n"
8359 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8360 "\t bbbbbbbbbbbbb\n"
8361 "\t*/\n"
8362 "}",
8363 format("{\n"
8364 "/*\n"
8365 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8366 "*/\n"
8367 "}",
8368 Tab));
8369 EXPECT_EQ("{\n"
8370 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8371 "\t// bbbbbbbbbbbbb\n"
8372 "}",
8373 format("{\n"
8374 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8375 "}",
8376 Tab));
8377 EXPECT_EQ("{\n"
8378 "\t/*\n"
8379 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8380 "\t bbbbbbbbbbbbb\n"
8381 "\t*/\n"
8382 "}",
8383 format("{\n"
8384 "\t/*\n"
8385 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8386 "\t*/\n"
8387 "}",
8388 Tab));
8389 EXPECT_EQ("{\n"
8390 "\t/*\n"
8391 "\n"
8392 "\t*/\n"
8393 "}",
8394 format("{\n"
8395 "\t/*\n"
8396 "\n"
8397 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008398 "}",
8399 Tab));
8400 EXPECT_EQ("{\n"
8401 "\t/*\n"
8402 " asdf\n"
8403 "\t*/\n"
8404 "}",
8405 format("{\n"
8406 "\t/*\n"
8407 " asdf\n"
8408 "\t*/\n"
8409 "}",
8410 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008411
8412 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008413 EXPECT_EQ("/*\n"
8414 " a\t\tcomment\n"
8415 " in multiple lines\n"
8416 " */",
8417 format(" /*\t \t \n"
8418 " \t \t a\t\tcomment\t \t\n"
8419 " \t \t in multiple lines\t\n"
8420 " \t */",
8421 Tab));
8422 EXPECT_EQ("/* some\n"
8423 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008424 format(" \t \t /* some\n"
8425 " \t \t comment */",
8426 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008427 EXPECT_EQ("int a; /* some\n"
8428 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008429 format(" \t \t int a; /* some\n"
8430 " \t \t comment */",
8431 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008432
Alexander Kornienko39856b72013-09-10 09:38:25 +00008433 EXPECT_EQ("int a; /* some\n"
8434 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008435 format(" \t \t int\ta; /* some\n"
8436 " \t \t comment */",
8437 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008438 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8439 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008440 format(" \t \t f(\"\t\t\"); /* some\n"
8441 " \t \t comment */",
8442 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008443 EXPECT_EQ("{\n"
8444 " /*\n"
8445 " * Comment\n"
8446 " */\n"
8447 " int i;\n"
8448 "}",
8449 format("{\n"
8450 "\t/*\n"
8451 "\t * Comment\n"
8452 "\t */\n"
8453 "\t int i;\n"
8454 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008455
8456 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8457 Tab.TabWidth = 8;
8458 Tab.IndentWidth = 8;
8459 EXPECT_EQ("if (aaaaaaaa && // q\n"
8460 " bb) // w\n"
8461 "\t;",
8462 format("if (aaaaaaaa &&// q\n"
8463 "bb)// w\n"
8464 ";",
8465 Tab));
8466 EXPECT_EQ("if (aaa && bbb) // w\n"
8467 "\t;",
8468 format("if(aaa&&bbb)// w\n"
8469 ";",
8470 Tab));
8471 verifyFormat("class X {\n"
8472 "\tvoid f() {\n"
8473 "\t\tsomeFunction(parameter1,\n"
8474 "\t\t\t parameter2);\n"
8475 "\t}\n"
8476 "};",
8477 Tab);
8478 verifyFormat("#define A \\\n"
8479 "\tvoid f() { \\\n"
8480 "\t\tsomeFunction( \\\n"
8481 "\t\t parameter1, \\\n"
8482 "\t\t parameter2); \\\n"
8483 "\t}",
8484 Tab);
8485 Tab.TabWidth = 4;
8486 Tab.IndentWidth = 8;
8487 verifyFormat("class TabWidth4Indent8 {\n"
8488 "\t\tvoid f() {\n"
8489 "\t\t\t\tsomeFunction(parameter1,\n"
8490 "\t\t\t\t\t\t\t parameter2);\n"
8491 "\t\t}\n"
8492 "};",
8493 Tab);
8494 Tab.TabWidth = 4;
8495 Tab.IndentWidth = 4;
8496 verifyFormat("class TabWidth4Indent4 {\n"
8497 "\tvoid f() {\n"
8498 "\t\tsomeFunction(parameter1,\n"
8499 "\t\t\t\t\t parameter2);\n"
8500 "\t}\n"
8501 "};",
8502 Tab);
8503 Tab.TabWidth = 8;
8504 Tab.IndentWidth = 4;
8505 verifyFormat("class TabWidth8Indent4 {\n"
8506 " void f() {\n"
8507 "\tsomeFunction(parameter1,\n"
8508 "\t\t parameter2);\n"
8509 " }\n"
8510 "};",
8511 Tab);
8512 Tab.TabWidth = 8;
8513 Tab.IndentWidth = 8;
8514 EXPECT_EQ("/*\n"
8515 "\t a\t\tcomment\n"
8516 "\t in multiple lines\n"
8517 " */",
8518 format(" /*\t \t \n"
8519 " \t \t a\t\tcomment\t \t\n"
8520 " \t \t in multiple lines\t\n"
8521 " \t */",
8522 Tab));
8523 verifyFormat("{\n"
8524 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8525 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8526 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8527 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8528 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8529 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8530 "};",
8531 Tab);
8532 verifyFormat("enum AA {\n"
8533 "\ta1, // Force multiple lines\n"
8534 "\ta2,\n"
8535 "\ta3\n"
8536 "};",
8537 Tab);
8538 EXPECT_EQ("if (aaaaaaaa && // q\n"
8539 " bb) // w\n"
8540 "\t;",
8541 format("if (aaaaaaaa &&// q\n"
8542 "bb)// w\n"
8543 ";",
8544 Tab));
8545 verifyFormat("class X {\n"
8546 "\tvoid f() {\n"
8547 "\t\tsomeFunction(parameter1,\n"
8548 "\t\t\t parameter2);\n"
8549 "\t}\n"
8550 "};",
8551 Tab);
8552 verifyFormat("{\n"
8553 "\tQ(\n"
8554 "\t {\n"
8555 "\t\t int a;\n"
8556 "\t\t someFunction(aaaaaaaa,\n"
8557 "\t\t\t\t bbbbbbb);\n"
8558 "\t },\n"
8559 "\t p);\n"
8560 "}",
8561 Tab);
8562 EXPECT_EQ("{\n"
8563 "\t/* aaaa\n"
8564 "\t bbbb */\n"
8565 "}",
8566 format("{\n"
8567 "/* aaaa\n"
8568 " bbbb */\n"
8569 "}",
8570 Tab));
8571 EXPECT_EQ("{\n"
8572 "\t/*\n"
8573 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8574 "\t bbbbbbbbbbbbb\n"
8575 "\t*/\n"
8576 "}",
8577 format("{\n"
8578 "/*\n"
8579 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8580 "*/\n"
8581 "}",
8582 Tab));
8583 EXPECT_EQ("{\n"
8584 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8585 "\t// bbbbbbbbbbbbb\n"
8586 "}",
8587 format("{\n"
8588 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8589 "}",
8590 Tab));
8591 EXPECT_EQ("{\n"
8592 "\t/*\n"
8593 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8594 "\t bbbbbbbbbbbbb\n"
8595 "\t*/\n"
8596 "}",
8597 format("{\n"
8598 "\t/*\n"
8599 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8600 "\t*/\n"
8601 "}",
8602 Tab));
8603 EXPECT_EQ("{\n"
8604 "\t/*\n"
8605 "\n"
8606 "\t*/\n"
8607 "}",
8608 format("{\n"
8609 "\t/*\n"
8610 "\n"
8611 "\t*/\n"
8612 "}",
8613 Tab));
8614 EXPECT_EQ("{\n"
8615 "\t/*\n"
8616 " asdf\n"
8617 "\t*/\n"
8618 "}",
8619 format("{\n"
8620 "\t/*\n"
8621 " asdf\n"
8622 "\t*/\n"
8623 "}",
8624 Tab));
8625 EXPECT_EQ("/*\n"
8626 "\t a\t\tcomment\n"
8627 "\t in multiple lines\n"
8628 " */",
8629 format(" /*\t \t \n"
8630 " \t \t a\t\tcomment\t \t\n"
8631 " \t \t in multiple lines\t\n"
8632 " \t */",
8633 Tab));
8634 EXPECT_EQ("/* some\n"
8635 " comment */",
8636 format(" \t \t /* some\n"
8637 " \t \t comment */",
8638 Tab));
8639 EXPECT_EQ("int a; /* some\n"
8640 " comment */",
8641 format(" \t \t int a; /* some\n"
8642 " \t \t comment */",
8643 Tab));
8644 EXPECT_EQ("int a; /* some\n"
8645 "comment */",
8646 format(" \t \t int\ta; /* some\n"
8647 " \t \t comment */",
8648 Tab));
8649 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8650 " comment */",
8651 format(" \t \t f(\"\t\t\"); /* some\n"
8652 " \t \t comment */",
8653 Tab));
8654 EXPECT_EQ("{\n"
8655 " /*\n"
8656 " * Comment\n"
8657 " */\n"
8658 " int i;\n"
8659 "}",
8660 format("{\n"
8661 "\t/*\n"
8662 "\t * Comment\n"
8663 "\t */\n"
8664 "\t int i;\n"
8665 "}"));
8666 Tab.AlignConsecutiveAssignments = true;
8667 Tab.AlignConsecutiveDeclarations = true;
8668 Tab.TabWidth = 4;
8669 Tab.IndentWidth = 4;
8670 verifyFormat("class Assign {\n"
8671 "\tvoid f() {\n"
8672 "\t\tint x = 123;\n"
8673 "\t\tint random = 4;\n"
8674 "\t\tstd::string alphabet =\n"
8675 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8676 "\t}\n"
8677 "};",
8678 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008679}
8680
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008681TEST_F(FormatTest, CalculatesOriginalColumn) {
8682 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8683 "q\"; /* some\n"
8684 " comment */",
8685 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8686 "q\"; /* some\n"
8687 " comment */",
8688 getLLVMStyle()));
8689 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8690 "/* some\n"
8691 " comment */",
8692 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8693 " /* some\n"
8694 " comment */",
8695 getLLVMStyle()));
8696 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8697 "qqq\n"
8698 "/* some\n"
8699 " comment */",
8700 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8701 "qqq\n"
8702 " /* some\n"
8703 " comment */",
8704 getLLVMStyle()));
8705 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8706 "wwww; /* some\n"
8707 " comment */",
8708 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8709 "wwww; /* some\n"
8710 " comment */",
8711 getLLVMStyle()));
8712}
8713
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008714TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008715 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008716 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008717
8718 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008719 " continue;",
8720 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008721 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008722 " continue;",
8723 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008724 verifyFormat("if(true)\n"
8725 " f();\n"
8726 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008727 " f();",
8728 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008729 verifyFormat("do {\n"
8730 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008731 "} while(something());",
8732 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008733 verifyFormat("switch(x) {\n"
8734 "default:\n"
8735 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008736 "}",
8737 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008738 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008739 verifyFormat("size_t x = sizeof(x);", NoSpace);
8740 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8741 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8742 verifyFormat("alignas(128) char a[128];", NoSpace);
8743 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8744 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8745 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008746 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008747 verifyFormat("T A::operator()();", NoSpace);
8748 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008749
8750 FormatStyle Space = getLLVMStyle();
8751 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8752
8753 verifyFormat("int f ();", Space);
8754 verifyFormat("void f (int a, T b) {\n"
8755 " while (true)\n"
8756 " continue;\n"
8757 "}",
8758 Space);
8759 verifyFormat("if (true)\n"
8760 " f ();\n"
8761 "else if (true)\n"
8762 " f ();",
8763 Space);
8764 verifyFormat("do {\n"
8765 " do_something ();\n"
8766 "} while (something ());",
8767 Space);
8768 verifyFormat("switch (x) {\n"
8769 "default:\n"
8770 " break;\n"
8771 "}",
8772 Space);
8773 verifyFormat("A::A () : a (1) {}", Space);
8774 verifyFormat("void f () __attribute__ ((asdf));", Space);
8775 verifyFormat("*(&a + 1);\n"
8776 "&((&a)[1]);\n"
8777 "a[(b + c) * d];\n"
8778 "(((a + 1) * 2) + 3) * 4;",
8779 Space);
8780 verifyFormat("#define A(x) x", Space);
8781 verifyFormat("#define A (x) x", Space);
8782 verifyFormat("#if defined(x)\n"
8783 "#endif",
8784 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008785 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008786 verifyFormat("size_t x = sizeof (x);", Space);
8787 verifyFormat("auto f (int x) -> decltype (x);", Space);
8788 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8789 verifyFormat("alignas (128) char a[128];", Space);
8790 verifyFormat("size_t x = alignof (MyType);", Space);
8791 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8792 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008793 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008794 verifyFormat("T A::operator() ();", Space);
8795 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008796}
8797
8798TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8799 FormatStyle Spaces = getLLVMStyle();
8800
8801 Spaces.SpacesInParentheses = true;
8802 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008803 verifyFormat("call();", Spaces);
8804 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008805 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8806 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008807 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008808 " continue;",
8809 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008810 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008811 " continue;",
8812 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008813 verifyFormat("if ( true )\n"
8814 " f();\n"
8815 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008816 " f();",
8817 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008818 verifyFormat("do {\n"
8819 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008820 "} while ( something() );",
8821 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008822 verifyFormat("switch ( x ) {\n"
8823 "default:\n"
8824 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008825 "}",
8826 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008827
8828 Spaces.SpacesInParentheses = false;
8829 Spaces.SpacesInCStyleCastParentheses = true;
8830 verifyFormat("Type *A = ( Type * )P;", Spaces);
8831 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8832 verifyFormat("x = ( int32 )y;", Spaces);
8833 verifyFormat("int a = ( int )(2.0f);", Spaces);
8834 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8835 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8836 verifyFormat("#define x (( int )-1)", Spaces);
8837
Daniel Jasper92e09822015-03-18 12:59:19 +00008838 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008839 Spaces.SpacesInParentheses = false;
8840 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008841 Spaces.SpacesInCStyleCastParentheses = true;
8842 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008843 verifyFormat("call( );", Spaces);
8844 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008845 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008846 " continue;",
8847 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008848 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008849 " continue;",
8850 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008851 verifyFormat("if (true)\n"
8852 " f( );\n"
8853 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008854 " f( );",
8855 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008856 verifyFormat("do {\n"
8857 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008858 "} while (something( ));",
8859 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008860 verifyFormat("switch (x) {\n"
8861 "default:\n"
8862 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008863 "}",
8864 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008865
Daniel Jasper92e09822015-03-18 12:59:19 +00008866 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008867 Spaces.SpaceAfterCStyleCast = true;
8868 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008869 verifyFormat("call( );", Spaces);
8870 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008871 verifyFormat("while (( bool ) 1)\n"
8872 " continue;",
8873 Spaces);
8874 verifyFormat("for (;;)\n"
8875 " continue;",
8876 Spaces);
8877 verifyFormat("if (true)\n"
8878 " f( );\n"
8879 "else if (true)\n"
8880 " f( );",
8881 Spaces);
8882 verifyFormat("do {\n"
8883 " do_something(( int ) i);\n"
8884 "} while (something( ));",
8885 Spaces);
8886 verifyFormat("switch (x) {\n"
8887 "default:\n"
8888 " break;\n"
8889 "}",
8890 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008891
8892 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008893 Spaces.SpacesInCStyleCastParentheses = false;
8894 Spaces.SpaceAfterCStyleCast = true;
8895 verifyFormat("while ((bool) 1)\n"
8896 " continue;",
8897 Spaces);
8898 verifyFormat("do {\n"
8899 " do_something((int) i);\n"
8900 "} while (something( ));",
8901 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008902}
8903
Daniel Jasperad981f82014-08-26 11:41:14 +00008904TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8905 verifyFormat("int a[5];");
8906 verifyFormat("a[3] += 42;");
8907
8908 FormatStyle Spaces = getLLVMStyle();
8909 Spaces.SpacesInSquareBrackets = true;
8910 // Lambdas unchanged.
8911 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8912 verifyFormat("return [i, args...] {};", Spaces);
8913
8914 // Not lambdas.
8915 verifyFormat("int a[ 5 ];", Spaces);
8916 verifyFormat("a[ 3 ] += 42;", Spaces);
8917 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8918 verifyFormat("double &operator[](int i) { return 0; }\n"
8919 "int i;",
8920 Spaces);
8921 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8922 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8923 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8924}
8925
Daniel Jasperd94bff32013-09-25 15:15:02 +00008926TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8927 verifyFormat("int a = 5;");
8928 verifyFormat("a += 42;");
8929 verifyFormat("a or_eq 8;");
8930
8931 FormatStyle Spaces = getLLVMStyle();
8932 Spaces.SpaceBeforeAssignmentOperators = false;
8933 verifyFormat("int a= 5;", Spaces);
8934 verifyFormat("a+= 42;", Spaces);
8935 verifyFormat("a or_eq 8;", Spaces);
8936}
8937
Francois Ferrand2a9ea782018-03-01 10:09:13 +00008938TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
8939 verifyFormat("class Foo : public Bar {};");
8940 verifyFormat("Foo::Foo() : foo(1) {}");
8941 verifyFormat("for (auto a : b) {\n}");
8942 verifyFormat("int x = a ? b : c;");
8943 verifyFormat("{\n"
8944 "label0:\n"
8945 " int x = 0;\n"
8946 "}");
8947 verifyFormat("switch (x) {\n"
8948 "case 1:\n"
8949 "default:\n"
8950 "}");
8951
8952 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
8953 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
8954 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
8955 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
8956 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
8957 verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
8958 verifyFormat("{\n"
8959 "label1:\n"
8960 " int x = 0;\n"
8961 "}",
8962 CtorInitializerStyle);
8963 verifyFormat("switch (x) {\n"
8964 "case 1:\n"
8965 "default:\n"
8966 "}",
8967 CtorInitializerStyle);
8968 CtorInitializerStyle.BreakConstructorInitializers =
8969 FormatStyle::BCIS_AfterColon;
8970 verifyFormat("Fooooooooooo::Fooooooooooo():\n"
8971 " aaaaaaaaaaaaaaaa(1),\n"
8972 " bbbbbbbbbbbbbbbb(2) {}",
8973 CtorInitializerStyle);
8974 CtorInitializerStyle.BreakConstructorInitializers =
8975 FormatStyle::BCIS_BeforeComma;
8976 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
8977 " : aaaaaaaaaaaaaaaa(1)\n"
8978 " , bbbbbbbbbbbbbbbb(2) {}",
8979 CtorInitializerStyle);
8980 CtorInitializerStyle.BreakConstructorInitializers =
8981 FormatStyle::BCIS_BeforeColon;
8982 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
8983 " : aaaaaaaaaaaaaaaa(1),\n"
8984 " bbbbbbbbbbbbbbbb(2) {}",
8985 CtorInitializerStyle);
8986 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
8987 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
8988 ": aaaaaaaaaaaaaaaa(1),\n"
8989 " bbbbbbbbbbbbbbbb(2) {}",
8990 CtorInitializerStyle);
8991
8992 FormatStyle InheritanceStyle = getLLVMStyle();
8993 InheritanceStyle.SpaceBeforeInheritanceColon = false;
8994 verifyFormat("class Foo: public Bar {};", InheritanceStyle);
8995 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
8996 verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
8997 verifyFormat("int x = a ? b : c;", InheritanceStyle);
8998 verifyFormat("{\n"
8999 "label2:\n"
9000 " int x = 0;\n"
9001 "}",
9002 InheritanceStyle);
9003 verifyFormat("switch (x) {\n"
9004 "case 1:\n"
9005 "default:\n"
9006 "}",
9007 InheritanceStyle);
9008
9009 FormatStyle ForLoopStyle = getLLVMStyle();
9010 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
9011 verifyFormat("class Foo : public Bar {};", ForLoopStyle);
9012 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
9013 verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
9014 verifyFormat("int x = a ? b : c;", ForLoopStyle);
9015 verifyFormat("{\n"
9016 "label2:\n"
9017 " int x = 0;\n"
9018 "}",
9019 ForLoopStyle);
9020 verifyFormat("switch (x) {\n"
9021 "case 1:\n"
9022 "default:\n"
9023 "}",
9024 ForLoopStyle);
9025
9026 FormatStyle NoSpaceStyle = getLLVMStyle();
9027 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
9028 NoSpaceStyle.SpaceBeforeInheritanceColon = false;
9029 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
9030 verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
9031 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
9032 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
9033 verifyFormat("int x = a ? b : c;", NoSpaceStyle);
9034 verifyFormat("{\n"
9035 "label3:\n"
9036 " int x = 0;\n"
9037 "}",
9038 NoSpaceStyle);
9039 verifyFormat("switch (x) {\n"
9040 "case 1:\n"
9041 "default:\n"
9042 "}",
9043 NoSpaceStyle);
9044}
9045
Daniel Jaspera44991332015-04-29 13:06:49 +00009046TEST_F(FormatTest, AlignConsecutiveAssignments) {
9047 FormatStyle Alignment = getLLVMStyle();
9048 Alignment.AlignConsecutiveAssignments = false;
9049 verifyFormat("int a = 5;\n"
9050 "int oneTwoThree = 123;",
9051 Alignment);
9052 verifyFormat("int a = 5;\n"
9053 "int oneTwoThree = 123;",
9054 Alignment);
9055
9056 Alignment.AlignConsecutiveAssignments = true;
9057 verifyFormat("int a = 5;\n"
9058 "int oneTwoThree = 123;",
9059 Alignment);
9060 verifyFormat("int a = method();\n"
9061 "int oneTwoThree = 133;",
9062 Alignment);
9063 verifyFormat("a &= 5;\n"
9064 "bcd *= 5;\n"
9065 "ghtyf += 5;\n"
9066 "dvfvdb -= 5;\n"
9067 "a /= 5;\n"
9068 "vdsvsv %= 5;\n"
9069 "sfdbddfbdfbb ^= 5;\n"
9070 "dvsdsv |= 5;\n"
9071 "int dsvvdvsdvvv = 123;",
9072 Alignment);
9073 verifyFormat("int i = 1, j = 10;\n"
9074 "something = 2000;",
9075 Alignment);
9076 verifyFormat("something = 2000;\n"
9077 "int i = 1, j = 10;\n",
9078 Alignment);
9079 verifyFormat("something = 2000;\n"
9080 "another = 911;\n"
9081 "int i = 1, j = 10;\n"
9082 "oneMore = 1;\n"
9083 "i = 2;",
9084 Alignment);
9085 verifyFormat("int a = 5;\n"
9086 "int one = 1;\n"
9087 "method();\n"
9088 "int oneTwoThree = 123;\n"
9089 "int oneTwo = 12;",
9090 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009091 verifyFormat("int oneTwoThree = 123;\n"
9092 "int oneTwo = 12;\n"
9093 "method();\n",
9094 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009095 verifyFormat("int oneTwoThree = 123; // comment\n"
9096 "int oneTwo = 12; // comment",
9097 Alignment);
9098 EXPECT_EQ("int a = 5;\n"
9099 "\n"
9100 "int oneTwoThree = 123;",
9101 format("int a = 5;\n"
9102 "\n"
9103 "int oneTwoThree= 123;",
9104 Alignment));
9105 EXPECT_EQ("int a = 5;\n"
9106 "int one = 1;\n"
9107 "\n"
9108 "int oneTwoThree = 123;",
9109 format("int a = 5;\n"
9110 "int one = 1;\n"
9111 "\n"
9112 "int oneTwoThree = 123;",
9113 Alignment));
9114 EXPECT_EQ("int a = 5;\n"
9115 "int one = 1;\n"
9116 "\n"
9117 "int oneTwoThree = 123;\n"
9118 "int oneTwo = 12;",
9119 format("int a = 5;\n"
9120 "int one = 1;\n"
9121 "\n"
9122 "int oneTwoThree = 123;\n"
9123 "int oneTwo = 12;",
9124 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009125 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9126 verifyFormat("#define A \\\n"
9127 " int aaaa = 12; \\\n"
9128 " int b = 23; \\\n"
9129 " int ccc = 234; \\\n"
9130 " int dddddddddd = 2345;",
9131 Alignment);
9132 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00009133 verifyFormat("#define A \\\n"
9134 " int aaaa = 12; \\\n"
9135 " int b = 23; \\\n"
9136 " int ccc = 234; \\\n"
9137 " int dddddddddd = 2345;",
9138 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009139 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00009140 verifyFormat("#define A "
9141 " \\\n"
9142 " int aaaa = 12; "
9143 " \\\n"
9144 " int b = 23; "
9145 " \\\n"
9146 " int ccc = 234; "
9147 " \\\n"
9148 " int dddddddddd = 2345;",
9149 Alignment);
9150 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9151 "k = 4, int l = 5,\n"
9152 " int m = 6) {\n"
9153 " int j = 10;\n"
9154 " otherThing = 1;\n"
9155 "}",
9156 Alignment);
9157 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9158 " int i = 1;\n"
9159 " int j = 2;\n"
9160 " int big = 10000;\n"
9161 "}",
9162 Alignment);
9163 verifyFormat("class C {\n"
9164 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009165 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009166 " virtual void f() = 0;\n"
9167 "};",
9168 Alignment);
9169 verifyFormat("int i = 1;\n"
9170 "if (SomeType t = getSomething()) {\n"
9171 "}\n"
9172 "int j = 2;\n"
9173 "int big = 10000;",
9174 Alignment);
9175 verifyFormat("int j = 7;\n"
9176 "for (int k = 0; k < N; ++k) {\n"
9177 "}\n"
9178 "int j = 2;\n"
9179 "int big = 10000;\n"
9180 "}",
9181 Alignment);
9182 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9183 verifyFormat("int i = 1;\n"
9184 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9185 " = someLooooooooooooooooongFunction();\n"
9186 "int j = 2;",
9187 Alignment);
9188 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9189 verifyFormat("int i = 1;\n"
9190 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9191 " someLooooooooooooooooongFunction();\n"
9192 "int j = 2;",
9193 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009194
9195 verifyFormat("auto lambda = []() {\n"
9196 " auto i = 0;\n"
9197 " return 0;\n"
9198 "};\n"
9199 "int i = 0;\n"
9200 "auto v = type{\n"
9201 " i = 1, //\n"
9202 " (i = 2), //\n"
9203 " i = 3 //\n"
9204 "};",
9205 Alignment);
9206
Daniel Jaspera44991332015-04-29 13:06:49 +00009207 verifyFormat(
9208 "int i = 1;\n"
9209 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9210 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009211 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00009212 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009213
9214 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9215 " typename B = very_long_type_name_1,\n"
9216 " typename T_2 = very_long_type_name_2>\n"
9217 "auto foo() {}\n",
9218 Alignment);
9219 verifyFormat("int a, b = 1;\n"
9220 "int c = 2;\n"
9221 "int dd = 3;\n",
9222 Alignment);
9223 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9224 "float b[1][] = {{3.f}};\n",
9225 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009226 verifyFormat("for (int i = 0; i < 1; i++)\n"
9227 " int x = 1;\n",
9228 Alignment);
9229 verifyFormat("for (i = 0; i < 1; i++)\n"
9230 " x = 1;\n"
9231 "y = 1;\n",
9232 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009233}
9234
Daniel Jaspere12597c2015-10-01 10:06:54 +00009235TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9236 FormatStyle Alignment = getLLVMStyle();
9237 Alignment.AlignConsecutiveDeclarations = false;
9238 verifyFormat("float const a = 5;\n"
9239 "int oneTwoThree = 123;",
9240 Alignment);
9241 verifyFormat("int a = 5;\n"
9242 "float const oneTwoThree = 123;",
9243 Alignment);
9244
9245 Alignment.AlignConsecutiveDeclarations = true;
9246 verifyFormat("float const a = 5;\n"
9247 "int oneTwoThree = 123;",
9248 Alignment);
9249 verifyFormat("int a = method();\n"
9250 "float const oneTwoThree = 133;",
9251 Alignment);
9252 verifyFormat("int i = 1, j = 10;\n"
9253 "something = 2000;",
9254 Alignment);
9255 verifyFormat("something = 2000;\n"
9256 "int i = 1, j = 10;\n",
9257 Alignment);
9258 verifyFormat("float something = 2000;\n"
9259 "double another = 911;\n"
9260 "int i = 1, j = 10;\n"
9261 "const int *oneMore = 1;\n"
9262 "unsigned i = 2;",
9263 Alignment);
9264 verifyFormat("float a = 5;\n"
9265 "int one = 1;\n"
9266 "method();\n"
9267 "const double oneTwoThree = 123;\n"
9268 "const unsigned int oneTwo = 12;",
9269 Alignment);
9270 verifyFormat("int oneTwoThree{0}; // comment\n"
9271 "unsigned oneTwo; // comment",
9272 Alignment);
9273 EXPECT_EQ("float const a = 5;\n"
9274 "\n"
9275 "int oneTwoThree = 123;",
9276 format("float const a = 5;\n"
9277 "\n"
9278 "int oneTwoThree= 123;",
9279 Alignment));
9280 EXPECT_EQ("float a = 5;\n"
9281 "int one = 1;\n"
9282 "\n"
9283 "unsigned oneTwoThree = 123;",
9284 format("float a = 5;\n"
9285 "int one = 1;\n"
9286 "\n"
9287 "unsigned oneTwoThree = 123;",
9288 Alignment));
9289 EXPECT_EQ("float a = 5;\n"
9290 "int one = 1;\n"
9291 "\n"
9292 "unsigned oneTwoThree = 123;\n"
9293 "int oneTwo = 12;",
9294 format("float a = 5;\n"
9295 "int one = 1;\n"
9296 "\n"
9297 "unsigned oneTwoThree = 123;\n"
9298 "int oneTwo = 12;",
9299 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009300 // Function prototype alignment
9301 verifyFormat("int a();\n"
9302 "double b();",
9303 Alignment);
9304 verifyFormat("int a(int x);\n"
9305 "double b();",
9306 Alignment);
9307 unsigned OldColumnLimit = Alignment.ColumnLimit;
9308 // We need to set ColumnLimit to zero, in order to stress nested alignments,
9309 // otherwise the function parameters will be re-flowed onto a single line.
9310 Alignment.ColumnLimit = 0;
9311 EXPECT_EQ("int a(int x,\n"
9312 " float y);\n"
9313 "double b(int x,\n"
9314 " double y);",
9315 format("int a(int x,\n"
9316 " float y);\n"
9317 "double b(int x,\n"
9318 " double y);",
9319 Alignment));
9320 // This ensures that function parameters of function declarations are
9321 // correctly indented when their owning functions are indented.
9322 // The failure case here is for 'double y' to not be indented enough.
9323 EXPECT_EQ("double a(int x);\n"
9324 "int b(int y,\n"
9325 " double z);",
9326 format("double a(int x);\n"
9327 "int b(int y,\n"
9328 " double z);",
9329 Alignment));
9330 // Set ColumnLimit low so that we induce wrapping immediately after
9331 // the function name and opening paren.
9332 Alignment.ColumnLimit = 13;
9333 verifyFormat("int function(\n"
9334 " int x,\n"
9335 " bool y);",
9336 Alignment);
9337 Alignment.ColumnLimit = OldColumnLimit;
9338 // Ensure function pointers don't screw up recursive alignment
9339 verifyFormat("int a(int x, void (*fp)(int y));\n"
9340 "double b();",
9341 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009342 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009343 // Ensure recursive alignment is broken by function braces, so that the
9344 // "a = 1" does not align with subsequent assignments inside the function
9345 // body.
9346 verifyFormat("int func(int a = 1) {\n"
9347 " int b = 2;\n"
9348 " int cc = 3;\n"
9349 "}",
9350 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009351 verifyFormat("float something = 2000;\n"
9352 "double another = 911;\n"
9353 "int i = 1, j = 10;\n"
9354 "const int *oneMore = 1;\n"
9355 "unsigned i = 2;",
9356 Alignment);
9357 verifyFormat("int oneTwoThree = {0}; // comment\n"
9358 "unsigned oneTwo = 0; // comment",
9359 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009360 // Make sure that scope is correctly tracked, in the absence of braces
9361 verifyFormat("for (int i = 0; i < n; i++)\n"
9362 " j = i;\n"
9363 "double x = 1;\n",
9364 Alignment);
9365 verifyFormat("if (int i = 0)\n"
9366 " j = i;\n"
9367 "double x = 1;\n",
9368 Alignment);
9369 // Ensure operator[] and operator() are comprehended
9370 verifyFormat("struct test {\n"
9371 " long long int foo();\n"
9372 " int operator[](int a);\n"
9373 " double bar();\n"
9374 "};\n",
9375 Alignment);
9376 verifyFormat("struct test {\n"
9377 " long long int foo();\n"
9378 " int operator()(int a);\n"
9379 " double bar();\n"
9380 "};\n",
9381 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009382 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9383 " int const i = 1;\n"
9384 " int * j = 2;\n"
9385 " int big = 10000;\n"
9386 "\n"
9387 " unsigned oneTwoThree = 123;\n"
9388 " int oneTwo = 12;\n"
9389 " method();\n"
9390 " float k = 2;\n"
9391 " int ll = 10000;\n"
9392 "}",
9393 format("void SomeFunction(int parameter= 0) {\n"
9394 " int const i= 1;\n"
9395 " int *j=2;\n"
9396 " int big = 10000;\n"
9397 "\n"
9398 "unsigned oneTwoThree =123;\n"
9399 "int oneTwo = 12;\n"
9400 " method();\n"
9401 "float k= 2;\n"
9402 "int ll=10000;\n"
9403 "}",
9404 Alignment));
9405 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009406 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9407 verifyFormat("#define A \\\n"
9408 " int aaaa = 12; \\\n"
9409 " float b = 23; \\\n"
9410 " const int ccc = 234; \\\n"
9411 " unsigned dddddddddd = 2345;",
9412 Alignment);
9413 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009414 verifyFormat("#define A \\\n"
9415 " int aaaa = 12; \\\n"
9416 " float b = 23; \\\n"
9417 " const int ccc = 234; \\\n"
9418 " unsigned dddddddddd = 2345;",
9419 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009420 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009421 Alignment.ColumnLimit = 30;
9422 verifyFormat("#define A \\\n"
9423 " int aaaa = 12; \\\n"
9424 " float b = 23; \\\n"
9425 " const int ccc = 234; \\\n"
9426 " int dddddddddd = 2345;",
9427 Alignment);
9428 Alignment.ColumnLimit = 80;
9429 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9430 "k = 4, int l = 5,\n"
9431 " int m = 6) {\n"
9432 " const int j = 10;\n"
9433 " otherThing = 1;\n"
9434 "}",
9435 Alignment);
9436 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9437 " int const i = 1;\n"
9438 " int * j = 2;\n"
9439 " int big = 10000;\n"
9440 "}",
9441 Alignment);
9442 verifyFormat("class C {\n"
9443 "public:\n"
9444 " int i = 1;\n"
9445 " virtual void f() = 0;\n"
9446 "};",
9447 Alignment);
9448 verifyFormat("float i = 1;\n"
9449 "if (SomeType t = getSomething()) {\n"
9450 "}\n"
9451 "const unsigned j = 2;\n"
9452 "int big = 10000;",
9453 Alignment);
9454 verifyFormat("float j = 7;\n"
9455 "for (int k = 0; k < N; ++k) {\n"
9456 "}\n"
9457 "unsigned j = 2;\n"
9458 "int big = 10000;\n"
9459 "}",
9460 Alignment);
9461 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9462 verifyFormat("float i = 1;\n"
9463 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9464 " = someLooooooooooooooooongFunction();\n"
9465 "int j = 2;",
9466 Alignment);
9467 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9468 verifyFormat("int i = 1;\n"
9469 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9470 " someLooooooooooooooooongFunction();\n"
9471 "int j = 2;",
9472 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009473
9474 Alignment.AlignConsecutiveAssignments = true;
9475 verifyFormat("auto lambda = []() {\n"
9476 " auto ii = 0;\n"
9477 " float j = 0;\n"
9478 " return 0;\n"
9479 "};\n"
9480 "int i = 0;\n"
9481 "float i2 = 0;\n"
9482 "auto v = type{\n"
9483 " i = 1, //\n"
9484 " (i = 2), //\n"
9485 " i = 3 //\n"
9486 "};",
9487 Alignment);
9488 Alignment.AlignConsecutiveAssignments = false;
9489
Daniel Jaspere12597c2015-10-01 10:06:54 +00009490 verifyFormat(
9491 "int i = 1;\n"
9492 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9493 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009494 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009495 Alignment);
9496
9497 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9498 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009499 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00009500 // happens.
9501 Alignment.AlignConsecutiveAssignments = true;
9502 Alignment.ColumnLimit = 30;
9503 verifyFormat("float ii = 1;\n"
9504 "unsigned j = 2;\n"
9505 "int someVerylongVariable = 1;\n"
9506 "AnotherLongType ll = 123456;\n"
9507 "VeryVeryLongType k = 2;\n"
9508 "int myvar = 1;",
9509 Alignment);
9510 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009511 Alignment.AlignConsecutiveAssignments = false;
9512
9513 verifyFormat(
9514 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9515 " typename LongType, typename B>\n"
9516 "auto foo() {}\n",
9517 Alignment);
9518 verifyFormat("float a, b = 1;\n"
9519 "int c = 2;\n"
9520 "int dd = 3;\n",
9521 Alignment);
9522 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9523 "float b[1][] = {{3.f}};\n",
9524 Alignment);
9525 Alignment.AlignConsecutiveAssignments = true;
9526 verifyFormat("float a, b = 1;\n"
9527 "int c = 2;\n"
9528 "int dd = 3;\n",
9529 Alignment);
9530 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9531 "float b[1][] = {{3.f}};\n",
9532 Alignment);
9533 Alignment.AlignConsecutiveAssignments = false;
9534
9535 Alignment.ColumnLimit = 30;
9536 Alignment.BinPackParameters = false;
9537 verifyFormat("void foo(float a,\n"
9538 " float b,\n"
9539 " int c,\n"
9540 " uint32_t *d) {\n"
9541 " int * e = 0;\n"
9542 " float f = 0;\n"
9543 " double g = 0;\n"
9544 "}\n"
9545 "void bar(ino_t a,\n"
9546 " int b,\n"
9547 " uint32_t *c,\n"
9548 " bool d) {}\n",
9549 Alignment);
9550 Alignment.BinPackParameters = true;
9551 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +00009552
9553 // Bug 33507
9554 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
9555 verifyFormat(
9556 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
9557 " static const Version verVs2017;\n"
9558 " return true;\n"
9559 "});\n",
9560 Alignment);
9561 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009562}
9563
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009564TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009565 FormatStyle LinuxBraceStyle = getLLVMStyle();
9566 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009567 verifyFormat("namespace a\n"
9568 "{\n"
9569 "class A\n"
9570 "{\n"
9571 " void f()\n"
9572 " {\n"
9573 " if (true) {\n"
9574 " a();\n"
9575 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009576 " } else {\n"
9577 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009578 " }\n"
9579 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009580 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009581 "};\n"
9582 "struct B {\n"
9583 " int x;\n"
9584 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009585 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009586 LinuxBraceStyle);
9587 verifyFormat("enum X {\n"
9588 " Y = 0,\n"
9589 "}\n",
9590 LinuxBraceStyle);
9591 verifyFormat("struct S {\n"
9592 " int Type;\n"
9593 " union {\n"
9594 " int x;\n"
9595 " double y;\n"
9596 " } Value;\n"
9597 " class C\n"
9598 " {\n"
9599 " MyFavoriteType Value;\n"
9600 " } Class;\n"
9601 "}\n",
9602 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009603}
9604
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009605TEST_F(FormatTest, MozillaBraceBreaking) {
9606 FormatStyle MozillaBraceStyle = getLLVMStyle();
9607 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009608 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009609 verifyFormat("namespace a {\n"
9610 "class A\n"
9611 "{\n"
9612 " void f()\n"
9613 " {\n"
9614 " if (true) {\n"
9615 " a();\n"
9616 " b();\n"
9617 " }\n"
9618 " }\n"
9619 " void g() { return; }\n"
9620 "};\n"
9621 "enum E\n"
9622 "{\n"
9623 " A,\n"
9624 " // foo\n"
9625 " B,\n"
9626 " C\n"
9627 "};\n"
9628 "struct B\n"
9629 "{\n"
9630 " int x;\n"
9631 "};\n"
9632 "}\n",
9633 MozillaBraceStyle);
9634 verifyFormat("struct S\n"
9635 "{\n"
9636 " int Type;\n"
9637 " union\n"
9638 " {\n"
9639 " int x;\n"
9640 " double y;\n"
9641 " } Value;\n"
9642 " class C\n"
9643 " {\n"
9644 " MyFavoriteType Value;\n"
9645 " } Class;\n"
9646 "}\n",
9647 MozillaBraceStyle);
9648}
9649
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009650TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009651 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9652 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009653 verifyFormat("namespace a {\n"
9654 "class A {\n"
9655 " void f()\n"
9656 " {\n"
9657 " if (true) {\n"
9658 " a();\n"
9659 " b();\n"
9660 " }\n"
9661 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009662 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009663 "};\n"
9664 "struct B {\n"
9665 " int x;\n"
9666 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00009667 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009668 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009669
Daniel Jasperd9670872014-08-05 12:06:20 +00009670 verifyFormat("void foo()\n"
9671 "{\n"
9672 " if (a) {\n"
9673 " a();\n"
9674 " }\n"
9675 " else {\n"
9676 " b();\n"
9677 " }\n"
9678 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009679 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009680
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009681 verifyFormat("#ifdef _DEBUG\n"
9682 "int foo(int i = 0)\n"
9683 "#else\n"
9684 "int foo(int i = 5)\n"
9685 "#endif\n"
9686 "{\n"
9687 " return i;\n"
9688 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009689 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009690
9691 verifyFormat("void foo() {}\n"
9692 "void bar()\n"
9693 "#ifdef _DEBUG\n"
9694 "{\n"
9695 " foo();\n"
9696 "}\n"
9697 "#else\n"
9698 "{\n"
9699 "}\n"
9700 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009701 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009702
9703 verifyFormat("void foobar() { int i = 5; }\n"
9704 "#ifdef _DEBUG\n"
9705 "void bar() {}\n"
9706 "#else\n"
9707 "void bar() { foobar(); }\n"
9708 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009709 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009710}
9711
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009712TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009713 FormatStyle AllmanBraceStyle = getLLVMStyle();
9714 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009715
9716 EXPECT_EQ("namespace a\n"
9717 "{\n"
9718 "void f();\n"
9719 "void g();\n"
9720 "} // namespace a\n",
9721 format("namespace a\n"
9722 "{\n"
9723 "void f();\n"
9724 "void g();\n"
9725 "}\n",
9726 AllmanBraceStyle));
9727
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009728 verifyFormat("namespace a\n"
9729 "{\n"
9730 "class A\n"
9731 "{\n"
9732 " void f()\n"
9733 " {\n"
9734 " if (true)\n"
9735 " {\n"
9736 " a();\n"
9737 " b();\n"
9738 " }\n"
9739 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009740 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009741 "};\n"
9742 "struct B\n"
9743 "{\n"
9744 " int x;\n"
9745 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009746 "} // namespace a",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009747 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009748
9749 verifyFormat("void f()\n"
9750 "{\n"
9751 " if (true)\n"
9752 " {\n"
9753 " a();\n"
9754 " }\n"
9755 " else if (false)\n"
9756 " {\n"
9757 " b();\n"
9758 " }\n"
9759 " else\n"
9760 " {\n"
9761 " c();\n"
9762 " }\n"
9763 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009764 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009765
9766 verifyFormat("void f()\n"
9767 "{\n"
9768 " for (int i = 0; i < 10; ++i)\n"
9769 " {\n"
9770 " a();\n"
9771 " }\n"
9772 " while (false)\n"
9773 " {\n"
9774 " b();\n"
9775 " }\n"
9776 " do\n"
9777 " {\n"
9778 " c();\n"
9779 " } while (false)\n"
9780 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009781 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009782
9783 verifyFormat("void f(int a)\n"
9784 "{\n"
9785 " switch (a)\n"
9786 " {\n"
9787 " case 0:\n"
9788 " break;\n"
9789 " case 1:\n"
9790 " {\n"
9791 " break;\n"
9792 " }\n"
9793 " case 2:\n"
9794 " {\n"
9795 " }\n"
9796 " break;\n"
9797 " default:\n"
9798 " break;\n"
9799 " }\n"
9800 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009801 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009802
9803 verifyFormat("enum X\n"
9804 "{\n"
9805 " Y = 0,\n"
9806 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009807 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009808 verifyFormat("enum X\n"
9809 "{\n"
9810 " Y = 0\n"
9811 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009812 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009813
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009814 verifyFormat("@interface BSApplicationController ()\n"
9815 "{\n"
9816 "@private\n"
9817 " id _extraIvar;\n"
9818 "}\n"
9819 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009820 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009821
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009822 verifyFormat("#ifdef _DEBUG\n"
9823 "int foo(int i = 0)\n"
9824 "#else\n"
9825 "int foo(int i = 5)\n"
9826 "#endif\n"
9827 "{\n"
9828 " return i;\n"
9829 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009830 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009831
9832 verifyFormat("void foo() {}\n"
9833 "void bar()\n"
9834 "#ifdef _DEBUG\n"
9835 "{\n"
9836 " foo();\n"
9837 "}\n"
9838 "#else\n"
9839 "{\n"
9840 "}\n"
9841 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009842 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009843
9844 verifyFormat("void foobar() { int i = 5; }\n"
9845 "#ifdef _DEBUG\n"
9846 "void bar() {}\n"
9847 "#else\n"
9848 "void bar() { foobar(); }\n"
9849 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009850 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009851
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009852 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009853 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009854 " // ...\n"
9855 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009856 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009857 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009858 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009859 " // ...\n"
9860 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009861 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009862 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009863 // .. or dict literals.
9864 verifyFormat("void f()\n"
9865 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00009866 " // ...\n"
9867 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
9868 "}",
9869 AllmanBraceStyle);
9870 verifyFormat("void f()\n"
9871 "{\n"
9872 " // ...\n"
9873 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009874 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009875 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009876 verifyFormat("int f()\n"
9877 "{ // comment\n"
9878 " return 42;\n"
9879 "}",
9880 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009881
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009882 AllmanBraceStyle.ColumnLimit = 19;
9883 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9884 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009885 verifyFormat("void f()\n"
9886 "{\n"
9887 " int i;\n"
9888 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009889 AllmanBraceStyle);
9890 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009891
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009892 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009893 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9894 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9895 verifyFormat("void f(bool b)\n"
9896 "{\n"
9897 " if (b)\n"
9898 " {\n"
9899 " return;\n"
9900 " }\n"
9901 "}\n",
9902 BreakBeforeBraceShortIfs);
9903 verifyFormat("void f(bool b)\n"
9904 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009905 " if constexpr (b)\n"
9906 " {\n"
9907 " return;\n"
9908 " }\n"
9909 "}\n",
9910 BreakBeforeBraceShortIfs);
9911 verifyFormat("void f(bool b)\n"
9912 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009913 " if (b) return;\n"
9914 "}\n",
9915 BreakBeforeBraceShortIfs);
9916 verifyFormat("void f(bool b)\n"
9917 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009918 " if constexpr (b) return;\n"
9919 "}\n",
9920 BreakBeforeBraceShortIfs);
9921 verifyFormat("void f(bool b)\n"
9922 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009923 " while (b)\n"
9924 " {\n"
9925 " return;\n"
9926 " }\n"
9927 "}\n",
9928 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009929}
9930
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009931TEST_F(FormatTest, GNUBraceBreaking) {
9932 FormatStyle GNUBraceStyle = getLLVMStyle();
9933 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9934 verifyFormat("namespace a\n"
9935 "{\n"
9936 "class A\n"
9937 "{\n"
9938 " void f()\n"
9939 " {\n"
9940 " int a;\n"
9941 " {\n"
9942 " int b;\n"
9943 " }\n"
9944 " if (true)\n"
9945 " {\n"
9946 " a();\n"
9947 " b();\n"
9948 " }\n"
9949 " }\n"
9950 " void g() { return; }\n"
9951 "}\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009952 "} // namespace a",
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009953 GNUBraceStyle);
9954
9955 verifyFormat("void f()\n"
9956 "{\n"
9957 " if (true)\n"
9958 " {\n"
9959 " a();\n"
9960 " }\n"
9961 " else if (false)\n"
9962 " {\n"
9963 " b();\n"
9964 " }\n"
9965 " else\n"
9966 " {\n"
9967 " c();\n"
9968 " }\n"
9969 "}\n",
9970 GNUBraceStyle);
9971
9972 verifyFormat("void f()\n"
9973 "{\n"
9974 " for (int i = 0; i < 10; ++i)\n"
9975 " {\n"
9976 " a();\n"
9977 " }\n"
9978 " while (false)\n"
9979 " {\n"
9980 " b();\n"
9981 " }\n"
9982 " do\n"
9983 " {\n"
9984 " c();\n"
9985 " }\n"
9986 " while (false);\n"
9987 "}\n",
9988 GNUBraceStyle);
9989
9990 verifyFormat("void f(int a)\n"
9991 "{\n"
9992 " switch (a)\n"
9993 " {\n"
9994 " case 0:\n"
9995 " break;\n"
9996 " case 1:\n"
9997 " {\n"
9998 " break;\n"
9999 " }\n"
10000 " case 2:\n"
10001 " {\n"
10002 " }\n"
10003 " break;\n"
10004 " default:\n"
10005 " break;\n"
10006 " }\n"
10007 "}\n",
10008 GNUBraceStyle);
10009
10010 verifyFormat("enum X\n"
10011 "{\n"
10012 " Y = 0,\n"
10013 "}\n",
10014 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010015
10016 verifyFormat("@interface BSApplicationController ()\n"
10017 "{\n"
10018 "@private\n"
10019 " id _extraIvar;\n"
10020 "}\n"
10021 "@end\n",
10022 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010023
10024 verifyFormat("#ifdef _DEBUG\n"
10025 "int foo(int i = 0)\n"
10026 "#else\n"
10027 "int foo(int i = 5)\n"
10028 "#endif\n"
10029 "{\n"
10030 " return i;\n"
10031 "}",
10032 GNUBraceStyle);
10033
10034 verifyFormat("void foo() {}\n"
10035 "void bar()\n"
10036 "#ifdef _DEBUG\n"
10037 "{\n"
10038 " foo();\n"
10039 "}\n"
10040 "#else\n"
10041 "{\n"
10042 "}\n"
10043 "#endif",
10044 GNUBraceStyle);
10045
10046 verifyFormat("void foobar() { int i = 5; }\n"
10047 "#ifdef _DEBUG\n"
10048 "void bar() {}\n"
10049 "#else\n"
10050 "void bar() { foobar(); }\n"
10051 "#endif",
10052 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010053}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010054
10055TEST_F(FormatTest, WebKitBraceBreaking) {
10056 FormatStyle WebKitBraceStyle = getLLVMStyle();
10057 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010058 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010059 verifyFormat("namespace a {\n"
10060 "class A {\n"
10061 " void f()\n"
10062 " {\n"
10063 " if (true) {\n"
10064 " a();\n"
10065 " b();\n"
10066 " }\n"
10067 " }\n"
10068 " void g() { return; }\n"
10069 "};\n"
10070 "enum E {\n"
10071 " A,\n"
10072 " // foo\n"
10073 " B,\n"
10074 " C\n"
10075 "};\n"
10076 "struct B {\n"
10077 " int x;\n"
10078 "};\n"
10079 "}\n",
10080 WebKitBraceStyle);
10081 verifyFormat("struct S {\n"
10082 " int Type;\n"
10083 " union {\n"
10084 " int x;\n"
10085 " double y;\n"
10086 " } Value;\n"
10087 " class C {\n"
10088 " MyFavoriteType Value;\n"
10089 " } Class;\n"
10090 "};\n",
10091 WebKitBraceStyle);
10092}
10093
Manuel Klimekd5735502013-08-12 03:51:17 +000010094TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10095 verifyFormat("void f() {\n"
10096 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010097 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010098 " }\n"
10099 "}\n",
10100 getLLVMStyle());
10101}
10102
Daniel Jasper9613c812013-08-07 16:29:23 +000010103TEST_F(FormatTest, UnderstandsPragmas) {
10104 verifyFormat("#pragma omp reduction(| : var)");
10105 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010106
10107 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10108 "(including parentheses).",
10109 format("#pragma mark Any non-hyphenated or hyphenated string "
10110 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010111}
10112
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010113TEST_F(FormatTest, UnderstandPragmaOption) {
10114 verifyFormat("#pragma option -C -A");
10115
10116 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10117}
10118
Manuel Klimek77866142017-11-17 11:17:15 +000010119TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
10120 FormatStyle Style = getLLVMStyle();
10121 Style.ColumnLimit = 20;
10122
10123 verifyFormat("int a; // the\n"
10124 " // comment", Style);
10125 EXPECT_EQ("int a; /* first line\n"
10126 " * second\n"
10127 " * line third\n"
10128 " * line\n"
10129 " */",
10130 format("int a; /* first line\n"
10131 " * second\n"
10132 " * line third\n"
10133 " * line\n"
10134 " */",
10135 Style));
10136 EXPECT_EQ("int a; // first line\n"
10137 " // second\n"
10138 " // line third\n"
10139 " // line",
10140 format("int a; // first line\n"
10141 " // second line\n"
10142 " // third line",
10143 Style));
10144
10145 Style.PenaltyExcessCharacter = 90;
10146 verifyFormat("int a; // the comment", Style);
Manuel Klimek93699f42017-11-29 14:29:43 +000010147 EXPECT_EQ("int a; // the comment\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010148 " // aaa",
10149 format("int a; // the comment aaa", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010150 EXPECT_EQ("int a; /* first line\n"
10151 " * second line\n"
10152 " * third line\n"
10153 " */",
10154 format("int a; /* first line\n"
10155 " * second line\n"
10156 " * third line\n"
10157 " */",
10158 Style));
Manuel Klimek93699f42017-11-29 14:29:43 +000010159 EXPECT_EQ("int a; // first line\n"
10160 " // second line\n"
10161 " // third line",
10162 format("int a; // first line\n"
10163 " // second line\n"
10164 " // third line",
10165 Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010166 // FIXME: Investigate why this is not getting the same layout as the test
10167 // above.
10168 EXPECT_EQ("int a; /* first line\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010169 " * second line\n"
10170 " * third line\n"
Manuel Klimek77866142017-11-17 11:17:15 +000010171 " */",
10172 format("int a; /* first line second line third line"
10173 "\n*/",
10174 Style));
10175
10176 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010177 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010178 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010179 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010180 Style));
10181 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010182 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010183 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010184 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010185 Style));
10186
10187 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
10188 // next one.
Manuel Klimek93699f42017-11-29 14:29:43 +000010189 EXPECT_EQ("// foo bar baz bazfoo\n"
10190 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010191 format("// foo bar baz bazfoo bar\n"
10192 "// foo bar\n",
10193 Style));
10194
10195 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010196 "// foo bar baz bazfoo\n"
10197 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010198 format("// foo bar baz bazfoo\n"
10199 "// foo bar baz bazfoo bar\n"
10200 "// foo bar\n",
10201 Style));
10202
Manuel Klimek77866142017-11-17 11:17:15 +000010203 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010204 "// foo bar baz bazfoo\n"
10205 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010206 format("// foo bar baz bazfoo\n"
10207 "// foo bar baz bazfoo bar\n"
10208 "// foo bar\n",
10209 Style));
Manuel Klimek0b58c322017-12-01 13:28:08 +000010210
10211 // Make sure we do not keep protruding characters if strict mode reflow is
10212 // cheaper than keeping protruding characters.
10213 Style.ColumnLimit = 21;
10214 EXPECT_EQ("// foo foo foo foo\n"
10215 "// foo foo foo foo\n"
10216 "// foo foo foo foo\n",
10217 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
10218 Style));
10219
10220 EXPECT_EQ("int a = /* long block\n"
10221 " comment */\n"
10222 " 42;",
10223 format("int a = /* long block comment */ 42;", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010224}
10225
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010226#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10227 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010228 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10229 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010230
10231TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010232 SmallVector<FormatStyle, 3> Styles;
10233 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010234
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010235 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010236 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10237 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10238 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010239
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010240 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010241 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10242 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10243 EXPECT_ALL_STYLES_EQUAL(Styles);
10244
Nico Weber514ecc82014-02-02 20:50:45 +000010245 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010246 EXPECT_TRUE(
10247 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10248 EXPECT_TRUE(
10249 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10250 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010251
Nico Weber514ecc82014-02-02 20:50:45 +000010252 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010253 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10254 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10255 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010256
10257 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010258 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10259 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10260 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010261
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010262 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010263 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10264 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10265 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010266
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010267 Styles[0] = getGNUStyle();
10268 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10269 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10270 EXPECT_ALL_STYLES_EQUAL(Styles);
10271
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010272 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10273}
10274
10275TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10276 SmallVector<FormatStyle, 8> Styles;
10277 Styles.resize(2);
10278
10279 Styles[0] = getGoogleStyle();
10280 Styles[1] = getLLVMStyle();
10281 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10282 EXPECT_ALL_STYLES_EQUAL(Styles);
10283
10284 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010285 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010286 Styles[1] = getLLVMStyle();
10287 Styles[1].Language = FormatStyle::LK_JavaScript;
10288 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10289
10290 Styles[2] = getLLVMStyle();
10291 Styles[2].Language = FormatStyle::LK_JavaScript;
10292 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10293 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010294 &Styles[2])
10295 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010296
10297 Styles[3] = getLLVMStyle();
10298 Styles[3].Language = FormatStyle::LK_JavaScript;
10299 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10300 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010301 &Styles[3])
10302 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010303
10304 Styles[4] = getLLVMStyle();
10305 Styles[4].Language = FormatStyle::LK_JavaScript;
10306 EXPECT_EQ(0, parseConfiguration("---\n"
10307 "BasedOnStyle: LLVM\n"
10308 "IndentWidth: 123\n"
10309 "---\n"
10310 "BasedOnStyle: Google\n"
10311 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010312 &Styles[4])
10313 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010314 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010315}
10316
Daniel Jasper91881d92014-09-29 08:07:46 +000010317#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010318 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010319 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010320 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010321 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010322 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010323
Daniel Jasper91881d92014-09-29 08:07:46 +000010324#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10325
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010326#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10327 Style.STRUCT.FIELD = false; \
10328 EXPECT_EQ(0, \
10329 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10330 .value()); \
10331 EXPECT_TRUE(Style.STRUCT.FIELD); \
10332 EXPECT_EQ(0, \
10333 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10334 .value()); \
10335 EXPECT_FALSE(Style.STRUCT.FIELD);
10336
10337#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10338 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10339
Daniel Jasper00853002014-09-16 16:22:30 +000010340#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10341 EXPECT_NE(VALUE, Style.FIELD); \
10342 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10343 EXPECT_EQ(VALUE, Style.FIELD)
10344
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010345TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010346 FormatStyle Style = {};
10347 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +000010348 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010349 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010350 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010351 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010352 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010353 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010354 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010355 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010356 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010357 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010358 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010359 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010360 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010361 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010362 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +000010363 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Francois Ferrande56a8292017-06-14 12:29:47 +000010364 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010365 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010366 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010367 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010368 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010369 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010370 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010371 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010372 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010373 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010374 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010375 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010376 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +000010377 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010378 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010379 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010380 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010381 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010382 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010383 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010384 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010385 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010386 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Francois Ferrand2a9ea782018-03-01 10:09:13 +000010387 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
10388 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
10389 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010390
10391 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10392 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10393 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10394 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10395 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10396 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10397 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10398 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
Krasimir Georgievd6ce9372017-09-15 11:23:50 +000010399 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010400 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10401 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10402 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +000010403 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10404 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10405 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010406}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010407
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010408#undef CHECK_PARSE_BOOL
10409
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010410TEST_F(FormatTest, ParsesConfiguration) {
10411 FormatStyle Style = {};
10412 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010413 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010414 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10415 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010416 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010417 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10418 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +000010419 CHECK_PARSE("PenaltyBreakAssignment: 1234",
10420 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010421 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10422 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010423 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10424 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10425 PenaltyReturnTypeOnItsOwnLine, 1234u);
10426 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10427 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010428 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010429 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010430 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010431
Daniel Jasper553d4872014-06-17 12:40:34 +000010432 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010433 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10434 FormatStyle::PAS_Left);
10435 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10436 FormatStyle::PAS_Right);
10437 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10438 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010439 // For backward compatibility:
10440 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10441 FormatStyle::PAS_Left);
10442 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10443 FormatStyle::PAS_Right);
10444 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10445 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010446
Alexander Kornienkod6538332013-05-07 15:32:14 +000010447 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010448 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10449 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010450 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10451 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10452 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10453
Daniel Jasperac043c92014-09-15 11:11:00 +000010454 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010455 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10456 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010457 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10458 FormatStyle::BOS_None);
10459 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10460 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010461 // For backward compatibility:
10462 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10463 FormatStyle::BOS_None);
10464 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10465 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010466
Francois Ferranda6b6d512017-05-24 11:36:58 +000010467 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10468 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10469 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10470 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10471 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10472 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10473 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10474 // For backward compatibility:
10475 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10476 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10477
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010478 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10479 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10480 FormatStyle::BAS_Align);
10481 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10482 FormatStyle::BAS_DontAlign);
10483 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10484 FormatStyle::BAS_AlwaysBreak);
10485 // For backward compatibility:
10486 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10487 FormatStyle::BAS_DontAlign);
10488 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10489 FormatStyle::BAS_Align);
10490
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +000010491 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10492 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
10493 FormatStyle::ENAS_DontAlign);
10494 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
10495 FormatStyle::ENAS_Left);
10496 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
10497 FormatStyle::ENAS_Right);
10498 // For backward compatibility:
10499 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
10500 FormatStyle::ENAS_Left);
10501 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
10502 FormatStyle::ENAS_Right);
10503
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010504 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010505 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10506 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10507 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010508 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10509 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010510 // For backward compatibility:
10511 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10512 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010513
Daniel Jasperd74cf402014-04-08 12:46:38 +000010514 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010515 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10516 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10517 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10518 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010519 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10520 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010521 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10522 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010523 // For backward compatibility:
10524 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10525 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10526 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10527 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010528
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010529 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10530 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10531 FormatStyle::SBPO_Never);
10532 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10533 FormatStyle::SBPO_Always);
10534 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10535 FormatStyle::SBPO_ControlStatements);
10536 // For backward compatibility:
10537 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10538 FormatStyle::SBPO_Never);
10539 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10540 FormatStyle::SBPO_ControlStatements);
10541
Alexander Kornienkod6538332013-05-07 15:32:14 +000010542 Style.ColumnLimit = 123;
10543 FormatStyle BaseStyle = getLLVMStyle();
10544 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10545 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10546
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010547 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10548 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10549 FormatStyle::BS_Attach);
10550 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10551 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010552 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10553 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010554 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10555 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010556 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10557 FormatStyle::BS_Allman);
10558 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010559 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10560 FormatStyle::BS_WebKit);
10561 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10562 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010563
Zachary Turner448592e2015-12-18 22:20:15 +000010564 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10565 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10566 FormatStyle::RTBS_None);
10567 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10568 FormatStyle::RTBS_All);
10569 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010570 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010571 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10572 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10573 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10574 AlwaysBreakAfterReturnType,
10575 FormatStyle::RTBS_TopLevelDefinitions);
10576
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010577 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10578 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10579 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10580 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10581 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10582 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10583 AlwaysBreakAfterDefinitionReturnType,
10584 FormatStyle::DRTBS_TopLevel);
10585
Daniel Jasper65ee3472013-07-31 23:16:02 +000010586 Style.NamespaceIndentation = FormatStyle::NI_All;
10587 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10588 FormatStyle::NI_None);
10589 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10590 FormatStyle::NI_Inner);
10591 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10592 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010593
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010594 // FIXME: This is required because parsing a configuration simply overwrites
10595 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010596 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010597 std::vector<std::string> BoostForeach;
10598 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010599 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010600 std::vector<std::string> BoostAndQForeach;
10601 BoostAndQForeach.push_back("BOOST_FOREACH");
10602 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010603 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10604 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010605
10606 Style.IncludeCategories.clear();
10607 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10608 {".*", 1}};
10609 CHECK_PARSE("IncludeCategories:\n"
10610 " - Regex: abc/.*\n"
10611 " Priority: 2\n"
10612 " - Regex: .*\n"
10613 " Priority: 1",
10614 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010615 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010616
10617 Style.RawStringFormats.clear();
10618 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010619 {
10620 FormatStyle::LK_TextProto,
10621 {"pb", "proto"},
10622 {"PARSE_TEXT_PROTO"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010623 /*CanonicalDelimiter=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010624 "llvm",
10625 },
10626 {
10627 FormatStyle::LK_Cpp,
10628 {"cc", "cpp"},
10629 {"C_CODEBLOCK", "CPPEVAL"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010630 /*CanonicalDelimiter=*/"cc",
10631 /*BasedOnStyle=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010632 },
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010633 };
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010634
10635 CHECK_PARSE("RawStringFormats:\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010636 " - Language: TextProto\n"
10637 " Delimiters:\n"
10638 " - 'pb'\n"
10639 " - 'proto'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010640 " EnclosingFunctions:\n"
10641 " - 'PARSE_TEXT_PROTO'\n"
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010642 " BasedOnStyle: llvm\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010643 " - Language: Cpp\n"
10644 " Delimiters:\n"
10645 " - 'cc'\n"
10646 " - 'cpp'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010647 " EnclosingFunctions:\n"
10648 " - 'C_CODEBLOCK'\n"
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010649 " - 'CPPEVAL'\n"
10650 " CanonicalDelimiter: 'cc'",
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010651 RawStringFormats, ExpectedRawStringFormats);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010652}
10653
10654TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10655 FormatStyle Style = {};
10656 Style.Language = FormatStyle::LK_Cpp;
10657 CHECK_PARSE("Language: Cpp\n"
10658 "IndentWidth: 12",
10659 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010660 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10661 "IndentWidth: 34",
10662 &Style),
10663 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010664 EXPECT_EQ(12u, Style.IndentWidth);
10665 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10666 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10667
10668 Style.Language = FormatStyle::LK_JavaScript;
10669 CHECK_PARSE("Language: JavaScript\n"
10670 "IndentWidth: 12",
10671 IndentWidth, 12u);
10672 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010673 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10674 "IndentWidth: 34",
10675 &Style),
10676 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010677 EXPECT_EQ(23u, Style.IndentWidth);
10678 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10679 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10680
10681 CHECK_PARSE("BasedOnStyle: LLVM\n"
10682 "IndentWidth: 67",
10683 IndentWidth, 67u);
10684
10685 CHECK_PARSE("---\n"
10686 "Language: JavaScript\n"
10687 "IndentWidth: 12\n"
10688 "---\n"
10689 "Language: Cpp\n"
10690 "IndentWidth: 34\n"
10691 "...\n",
10692 IndentWidth, 12u);
10693
10694 Style.Language = FormatStyle::LK_Cpp;
10695 CHECK_PARSE("---\n"
10696 "Language: JavaScript\n"
10697 "IndentWidth: 12\n"
10698 "---\n"
10699 "Language: Cpp\n"
10700 "IndentWidth: 34\n"
10701 "...\n",
10702 IndentWidth, 34u);
10703 CHECK_PARSE("---\n"
10704 "IndentWidth: 78\n"
10705 "---\n"
10706 "Language: JavaScript\n"
10707 "IndentWidth: 56\n"
10708 "...\n",
10709 IndentWidth, 78u);
10710
10711 Style.ColumnLimit = 123;
10712 Style.IndentWidth = 234;
10713 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10714 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010715 EXPECT_FALSE(parseConfiguration("---\n"
10716 "IndentWidth: 456\n"
10717 "BreakBeforeBraces: Allman\n"
10718 "---\n"
10719 "Language: JavaScript\n"
10720 "IndentWidth: 111\n"
10721 "TabWidth: 111\n"
10722 "---\n"
10723 "Language: Cpp\n"
10724 "BreakBeforeBraces: Stroustrup\n"
10725 "TabWidth: 789\n"
10726 "...\n",
10727 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010728 EXPECT_EQ(123u, Style.ColumnLimit);
10729 EXPECT_EQ(456u, Style.IndentWidth);
10730 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10731 EXPECT_EQ(789u, Style.TabWidth);
10732
Rafael Espindola1f243172014-06-12 11:35:17 +000010733 EXPECT_EQ(parseConfiguration("---\n"
10734 "Language: JavaScript\n"
10735 "IndentWidth: 56\n"
10736 "---\n"
10737 "IndentWidth: 78\n"
10738 "...\n",
10739 &Style),
10740 ParseError::Error);
10741 EXPECT_EQ(parseConfiguration("---\n"
10742 "Language: JavaScript\n"
10743 "IndentWidth: 56\n"
10744 "---\n"
10745 "Language: JavaScript\n"
10746 "IndentWidth: 78\n"
10747 "...\n",
10748 &Style),
10749 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010750
10751 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10752}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010753
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010754#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010755
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010756TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10757 FormatStyle Style = {};
10758 Style.Language = FormatStyle::LK_JavaScript;
10759 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010760 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010761 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010762
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010763 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010764 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010765 "BasedOnStyle: Google\n"
10766 "---\n"
10767 "Language: JavaScript\n"
10768 "IndentWidth: 76\n"
10769 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010770 &Style)
10771 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010772 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010773 EXPECT_EQ(76u, Style.IndentWidth);
10774 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10775}
10776
Alexander Kornienkod6538332013-05-07 15:32:14 +000010777TEST_F(FormatTest, ConfigurationRoundTripTest) {
10778 FormatStyle Style = getLLVMStyle();
10779 std::string YAML = configurationAsText(Style);
10780 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010781 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010782 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10783 EXPECT_EQ(Style, ParsedStyle);
10784}
10785
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010786TEST_F(FormatTest, WorksFor8bitEncodings) {
10787 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10788 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10789 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10790 "\"\xef\xee\xf0\xf3...\"",
10791 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10792 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10793 "\xef\xee\xf0\xf3...\"",
10794 getLLVMStyleWithColumns(12)));
10795}
10796
Alexander Kornienko393e3082013-11-13 14:04:17 +000010797TEST_F(FormatTest, HandlesUTF8BOM) {
10798 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10799 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10800 format("\xef\xbb\xbf#include <iostream>"));
10801 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10802 format("\xef\xbb\xbf\n#include <iostream>"));
10803}
10804
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010805// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10806#if !defined(_MSC_VER)
10807
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010808TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10809 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10810 getLLVMStyleWithColumns(35));
10811 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010812 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010813 verifyFormat("// Однажды в студёную зимнюю пору...",
10814 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010815 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010816 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10817 getLLVMStyleWithColumns(39));
10818 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010819 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010820}
10821
10822TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010823 // Non-printable characters' width is currently considered to be the length in
10824 // bytes in UTF8. The characters can be displayed in very different manner
10825 // (zero-width, single width with a substitution glyph, expanded to their code
10826 // (e.g. "<8d>"), so there's no single correct way to handle them.
10827 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010828 "\"\xc2\x8d\";",
10829 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010830 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010831 "\"\xc2\x8d\";",
10832 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010833 EXPECT_EQ("\"Однажды, в \"\n"
10834 "\"студёную \"\n"
10835 "\"зимнюю \"\n"
10836 "\"пору,\"",
10837 format("\"Однажды, в студёную зимнюю пору,\"",
10838 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010839 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010840 "\"一 二 三 \"\n"
10841 "\"四 五六 \"\n"
10842 "\"七 八 九 \"\n"
10843 "\"十\"",
10844 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Manuel Klimek93699f42017-11-29 14:29:43 +000010845 EXPECT_EQ("\"一\t\"\n"
10846 "\"二 \t\"\n"
10847 "\"三 四 \"\n"
10848 "\"五\t\"\n"
10849 "\"六 \t\"\n"
10850 "\"七 \"\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010851 "\"八九十\tqq\"",
10852 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10853 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010854
10855 // UTF8 character in an escape sequence.
10856 EXPECT_EQ("\"aaaaaa\"\n"
10857 "\"\\\xC2\x8D\"",
10858 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010859}
10860
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010861TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10862 EXPECT_EQ("const char *sssss =\n"
10863 " \"一二三四五六七八\\\n"
10864 " 九 十\";",
10865 format("const char *sssss = \"一二三四五六七八\\\n"
10866 " 九 十\";",
10867 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010868}
10869
10870TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010871 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10872 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010873 EXPECT_EQ("// Я из лесу\n"
10874 "// вышел; был\n"
10875 "// сильный\n"
10876 "// мороз.",
10877 format("// Я из лесу вышел; был сильный мороз.",
10878 getLLVMStyleWithColumns(13)));
10879 EXPECT_EQ("// 一二三\n"
10880 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010881 "// 八 九\n"
10882 "// 十",
10883 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010884}
10885
10886TEST_F(FormatTest, SplitsUTF8BlockComments) {
10887 EXPECT_EQ("/* Гляжу,\n"
10888 " * поднимается\n"
10889 " * медленно в\n"
10890 " * гору\n"
10891 " * Лошадка,\n"
10892 " * везущая\n"
10893 " * хворосту\n"
10894 " * воз. */",
10895 format("/* Гляжу, поднимается медленно в гору\n"
10896 " * Лошадка, везущая хворосту воз. */",
10897 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010898 EXPECT_EQ(
10899 "/* 一二三\n"
10900 " * 四五六七\n"
10901 " * 八 九\n"
10902 " * 十 */",
10903 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010904 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10905 " * 𝕓𝕪𝕥𝕖\n"
10906 " * 𝖀𝕿𝕱-𝟠 */",
10907 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010908}
10909
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010910#endif // _MSC_VER
10911
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010912TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10913 FormatStyle Style = getLLVMStyle();
10914
10915 Style.ConstructorInitializerIndentWidth = 4;
10916 verifyFormat(
10917 "SomeClass::Constructor()\n"
10918 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10919 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10920 Style);
10921
10922 Style.ConstructorInitializerIndentWidth = 2;
10923 verifyFormat(
10924 "SomeClass::Constructor()\n"
10925 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10926 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10927 Style);
10928
10929 Style.ConstructorInitializerIndentWidth = 0;
10930 verifyFormat(
10931 "SomeClass::Constructor()\n"
10932 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10933 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10934 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010935 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10936 verifyFormat(
10937 "SomeLongTemplateVariableName<\n"
10938 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10939 Style);
10940 verifyFormat(
10941 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10942 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10943 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010944}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010945
Daniel Jasper00853002014-09-16 16:22:30 +000010946TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10947 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000010948 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010949 Style.ConstructorInitializerIndentWidth = 4;
10950 verifyFormat("SomeClass::Constructor()\n"
10951 " : a(a)\n"
10952 " , b(b)\n"
10953 " , c(c) {}",
10954 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010955 verifyFormat("SomeClass::Constructor()\n"
10956 " : a(a) {}",
10957 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010958
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010959 Style.ColumnLimit = 0;
10960 verifyFormat("SomeClass::Constructor()\n"
10961 " : a(a) {}",
10962 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010963 verifyFormat("SomeClass::Constructor() noexcept\n"
10964 " : a(a) {}",
10965 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010966 verifyFormat("SomeClass::Constructor()\n"
10967 " : a(a)\n"
10968 " , b(b)\n"
10969 " , c(c) {}",
10970 Style);
10971 verifyFormat("SomeClass::Constructor()\n"
10972 " : a(a) {\n"
10973 " foo();\n"
10974 " bar();\n"
10975 "}",
10976 Style);
10977
Daniel Jasperd74cf402014-04-08 12:46:38 +000010978 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010979 verifyFormat("SomeClass::Constructor()\n"
10980 " : a(a)\n"
10981 " , b(b)\n"
10982 " , c(c) {\n}",
10983 Style);
10984 verifyFormat("SomeClass::Constructor()\n"
10985 " : a(a) {\n}",
10986 Style);
10987
10988 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010989 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010990 Style.ConstructorInitializerIndentWidth = 2;
10991 verifyFormat("SomeClass::Constructor()\n"
10992 " : a(a)\n"
10993 " , b(b)\n"
10994 " , c(c) {}",
10995 Style);
10996
10997 Style.ConstructorInitializerIndentWidth = 0;
10998 verifyFormat("SomeClass::Constructor()\n"
10999 ": a(a)\n"
11000 ", b(b)\n"
11001 ", c(c) {}",
11002 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011003
11004 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
11005 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011006 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
11007 verifyFormat(
11008 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
11009 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011010 verifyFormat(
11011 "SomeClass::Constructor()\n"
11012 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
11013 Style);
11014 Style.ConstructorInitializerIndentWidth = 4;
11015 Style.ColumnLimit = 60;
11016 verifyFormat("SomeClass::Constructor()\n"
11017 " : aaaaaaaa(aaaaaaaa)\n"
11018 " , aaaaaaaa(aaaaaaaa)\n"
11019 " , aaaaaaaa(aaaaaaaa) {}",
11020 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011021}
11022
Daniel Jasper38efc132014-10-21 07:51:54 +000011023TEST_F(FormatTest, Destructors) {
11024 verifyFormat("void F(int &i) { i.~int(); }");
11025 verifyFormat("void F(int &i) { i->~int(); }");
11026}
11027
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011028TEST_F(FormatTest, FormatsWithWebKitStyle) {
11029 FormatStyle Style = getWebKitStyle();
11030
11031 // Don't indent in outer namespaces.
11032 verifyFormat("namespace outer {\n"
11033 "int i;\n"
11034 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000011035 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011036 "} // namespace inner\n"
11037 "} // namespace outer\n"
11038 "namespace other_outer {\n"
11039 "int i;\n"
11040 "}",
11041 Style);
11042
11043 // Don't indent case labels.
11044 verifyFormat("switch (variable) {\n"
11045 "case 1:\n"
11046 "case 2:\n"
11047 " doSomething();\n"
11048 " break;\n"
11049 "default:\n"
11050 " ++variable;\n"
11051 "}",
11052 Style);
11053
11054 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000011055 EXPECT_EQ("void f()\n"
11056 "{\n"
11057 " if (aaaaaaaaaaaaaaaa\n"
11058 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
11059 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11060 " return;\n"
11061 "}",
11062 format("void f() {\n"
11063 "if (aaaaaaaaaaaaaaaa\n"
11064 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
11065 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11066 "return;\n"
11067 "}",
11068 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011069
Daniel Jasper35995672014-04-29 14:05:20 +000011070 // Allow functions on a single line.
11071 verifyFormat("void f() { return; }", Style);
11072
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011073 // Constructor initializers are formatted one per line with the "," on the
11074 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011075 verifyFormat("Constructor()\n"
11076 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
11077 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000011078 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011079 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
11080 "{\n"
11081 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011082 Style);
11083 verifyFormat("SomeClass::Constructor()\n"
11084 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011085 "{\n"
11086 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011087 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000011088 EXPECT_EQ("SomeClass::Constructor()\n"
11089 " : a(a)\n"
11090 "{\n"
11091 "}",
11092 format("SomeClass::Constructor():a(a){}", Style));
11093 verifyFormat("SomeClass::Constructor()\n"
11094 " : a(a)\n"
11095 " , b(b)\n"
11096 " , c(c)\n"
11097 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011098 "}",
11099 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011100 verifyFormat("SomeClass::Constructor()\n"
11101 " : a(a)\n"
11102 "{\n"
11103 " foo();\n"
11104 " bar();\n"
11105 "}",
11106 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011107
Daniel Jasper65ee3472013-07-31 23:16:02 +000011108 // Access specifiers should be aligned left.
11109 verifyFormat("class C {\n"
11110 "public:\n"
11111 " int i;\n"
11112 "};",
11113 Style);
11114
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011115 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000011116 verifyFormat("int a; // Do not\n"
11117 "double b; // align comments.",
11118 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011119
Daniel Jasper3219e432014-12-02 13:24:51 +000011120 // Do not align operands.
11121 EXPECT_EQ("ASSERT(aaaa\n"
11122 " || bbbb);",
11123 format("ASSERT ( aaaa\n||bbbb);", Style));
11124
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011125 // Accept input's line breaks.
11126 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
11127 " || bbbbbbbbbbbbbbb) {\n"
11128 " i++;\n"
11129 "}",
11130 format("if (aaaaaaaaaaaaaaa\n"
11131 "|| bbbbbbbbbbbbbbb) { i++; }",
11132 Style));
11133 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
11134 " i++;\n"
11135 "}",
11136 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000011137
11138 // Don't automatically break all macro definitions (llvm.org/PR17842).
11139 verifyFormat("#define aNumber 10", Style);
11140 // However, generally keep the line breaks that the user authored.
11141 EXPECT_EQ("#define aNumber \\\n"
11142 " 10",
11143 format("#define aNumber \\\n"
11144 " 10",
11145 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000011146
11147 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011148 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
11149 " copyItems:YES];",
11150 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
11151 "copyItems:YES];",
11152 Style));
11153 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
11154 " copyItems:YES];",
11155 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
11156 " copyItems:YES];",
11157 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000011158 // FIXME: This does not seem right, there should be more indentation before
11159 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011160 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000011161 " @\"a\",\n"
11162 " @\"a\"\n"
11163 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011164 " copyItems:YES];",
11165 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11166 " @\"a\",\n"
11167 " @\"a\"\n"
11168 " ]\n"
11169 " copyItems:YES];",
11170 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011171 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011172 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11173 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011174 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11175 " copyItems:YES];",
11176 Style));
11177
11178 verifyFormat("[self.a b:c c:d];", Style);
11179 EXPECT_EQ("[self.a b:c\n"
11180 " c:d];",
11181 format("[self.a b:c\n"
11182 "c:d];",
11183 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011184}
11185
Manuel Klimekffdeb592013-09-03 15:10:01 +000011186TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011187 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11188 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11189 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11190 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11191 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011192 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Manuel Klimek9f0a4e52017-09-19 09:59:30 +000011193 verifyFormat("auto c = [a = [b = 42] {}] {};\n");
11194 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011195 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011196 verifyFormat("void f() {\n"
11197 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11198 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011199 verifyFormat("void f() {\n"
11200 " other(x.begin(), //\n"
11201 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011202 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011203 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011204 verifyFormat("SomeFunction([]() { // A cool function...\n"
11205 " return 43;\n"
11206 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011207 EXPECT_EQ("SomeFunction([]() {\n"
11208 "#define A a\n"
11209 " return 43;\n"
11210 "});",
11211 format("SomeFunction([](){\n"
11212 "#define A a\n"
11213 "return 43;\n"
11214 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011215 verifyFormat("void f() {\n"
11216 " SomeFunction([](decltype(x), A *a) {});\n"
11217 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011218 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11219 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011220 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11221 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11222 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011223 verifyFormat("Constructor()\n"
11224 " : Field([] { // comment\n"
11225 " int i;\n"
11226 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011227 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11228 " return some_parameter.size();\n"
11229 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011230 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11231 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011232 verifyFormat("int i = aaaaaa ? 1 //\n"
11233 " : [] {\n"
11234 " return 2; //\n"
11235 " }();");
11236 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11237 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11238 " return x == 2; // force break\n"
11239 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011240 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11241 " [=](int iiiiiiiiiiii) {\n"
11242 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
11243 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
11244 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011245 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011246 verifyFormat("SomeFunction({[&] {\n"
11247 " // comment\n"
11248 " },\n"
11249 " [&] {\n"
11250 " // comment\n"
11251 " }});");
11252 verifyFormat("SomeFunction({[&] {\n"
11253 " // comment\n"
11254 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011255 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11256 " [&]() { return true; },\n"
11257 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011258
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011259 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011260 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011261 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011262 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11263 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011264 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011265 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011266 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11267 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011268 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011269 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11270 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011271 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011272 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011273 verifyFormat(
11274 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11275 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11276 " return aaaaaaaaaaaaaaaaa;\n"
11277 " });",
11278 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011279 verifyFormat("[]() //\n"
11280 " -> int {\n"
11281 " return 1; //\n"
11282 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011283
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011284 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011285 verifyFormat("SomeFunction(\n"
11286 " []() {\n"
11287 " int i = 42;\n"
11288 " return i;\n"
11289 " },\n"
11290 " []() {\n"
11291 " int j = 43;\n"
11292 " return j;\n"
11293 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011294
Daniel Jasperda18fd82014-06-10 06:39:03 +000011295 // More complex introducers.
11296 verifyFormat("return [i, args...] {};");
11297
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011298 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011299 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011300 verifyFormat("double &operator[](int i) { return 0; }\n"
11301 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011302 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011303 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011304 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011305
11306 // Other corner cases.
11307 verifyFormat("void f() {\n"
11308 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000011309 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000011310 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011311
11312 // Lambdas created through weird macros.
11313 verifyFormat("void f() {\n"
11314 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011315 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011316 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011317
11318 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11319 " doo_dah();\n"
11320 " doo_dah();\n"
11321 " })) {\n"
11322 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000011323 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
11324 " doo_dah();\n"
11325 " doo_dah();\n"
11326 " })) {\n"
11327 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011328 verifyFormat("auto lambda = []() {\n"
11329 " int a = 2\n"
11330 "#if A\n"
11331 " + 2\n"
11332 "#endif\n"
11333 " ;\n"
11334 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011335
11336 // Lambdas with complex multiline introducers.
11337 verifyFormat(
11338 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11339 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
11340 " -> ::std::unordered_set<\n"
11341 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
11342 " //\n"
11343 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011344}
11345
Martin Probsta004b3f2017-11-17 18:06:33 +000011346TEST_F(FormatTest, EmptyLinesInLambdas) {
11347 verifyFormat("auto lambda = []() {\n"
11348 " x(); //\n"
11349 "};",
11350 "auto lambda = []() {\n"
11351 "\n"
11352 " x(); //\n"
11353 "\n"
11354 "};");
11355}
11356
Manuel Klimek516e0542013-09-04 13:25:30 +000011357TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011358 FormatStyle ShortBlocks = getLLVMStyle();
11359 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11360 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11361 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11362 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11363 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11364 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11365 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011366
Daniel Jasper76284682014-10-22 09:12:44 +000011367 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11368 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11369 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011370
Daniel Jasper76284682014-10-22 09:12:44 +000011371 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011372 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011373 "}];");
11374 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011375 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011376 "}]};");
11377 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011378 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011379 "}];");
11380 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011381 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011382 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011383 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011384 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011385 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011386 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011387 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011388
11389 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011390 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011391 "}];",
11392 getLLVMStyleWithColumns(60));
11393 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011394 " NSString *path = [self sessionFilePath];\n"
11395 " if (path) {\n"
11396 " // ...\n"
11397 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011398 "});");
11399 verifyFormat("[[SessionService sharedService]\n"
11400 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011401 " if (window) {\n"
11402 " [self windowDidLoad:window];\n"
11403 " } else {\n"
11404 " [self errorLoadingWindow];\n"
11405 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011406 " }];");
11407 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011408 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011409 "};\n",
11410 getLLVMStyleWithColumns(40));
11411 verifyFormat("[[SessionService sharedService]\n"
11412 " loadWindowWithCompletionBlock: //\n"
11413 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011414 " if (window) {\n"
11415 " [self windowDidLoad:window];\n"
11416 " } else {\n"
11417 " [self errorLoadingWindow];\n"
11418 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011419 " }];",
11420 getLLVMStyleWithColumns(60));
11421 verifyFormat("[myObject doSomethingWith:arg1\n"
11422 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011423 " // ...\n"
11424 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011425 " }\n"
11426 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011427 " // ...\n"
11428 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011429 " }\n"
11430 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011431 " // ...\n"
11432 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011433 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011434 verifyFormat("[myObject doSomethingWith:arg1\n"
11435 " firstBlock:-1\n"
11436 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011437 " // ...\n"
11438 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011439 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011440
11441 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011442 " @autoreleasepool {\n"
11443 " if (a) {\n"
11444 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011445 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011446 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011447 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011448 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011449 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11450 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011451
11452 FormatStyle FourIndent = getLLVMStyle();
11453 FourIndent.ObjCBlockIndentWidth = 4;
11454 verifyFormat("[operation setCompletionBlock:^{\n"
11455 " [self onOperationDone];\n"
11456 "}];",
11457 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011458}
11459
Daniel Jasper289afc02015-04-23 09:23:17 +000011460TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11461 FormatStyle ZeroColumn = getLLVMStyle();
11462 ZeroColumn.ColumnLimit = 0;
11463
11464 verifyFormat("[[SessionService sharedService] "
11465 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11466 " if (window) {\n"
11467 " [self windowDidLoad:window];\n"
11468 " } else {\n"
11469 " [self errorLoadingWindow];\n"
11470 " }\n"
11471 "}];",
11472 ZeroColumn);
11473 EXPECT_EQ("[[SessionService sharedService]\n"
11474 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11475 " if (window) {\n"
11476 " [self windowDidLoad:window];\n"
11477 " } else {\n"
11478 " [self errorLoadingWindow];\n"
11479 " }\n"
11480 " }];",
11481 format("[[SessionService sharedService]\n"
11482 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11483 " if (window) {\n"
11484 " [self windowDidLoad:window];\n"
11485 " } else {\n"
11486 " [self errorLoadingWindow];\n"
11487 " }\n"
11488 "}];",
11489 ZeroColumn));
11490 verifyFormat("[myObject doSomethingWith:arg1\n"
11491 " firstBlock:^(Foo *a) {\n"
11492 " // ...\n"
11493 " int i;\n"
11494 " }\n"
11495 " secondBlock:^(Bar *b) {\n"
11496 " // ...\n"
11497 " int i;\n"
11498 " }\n"
11499 " thirdBlock:^Foo(Bar *b) {\n"
11500 " // ...\n"
11501 " int i;\n"
11502 " }];",
11503 ZeroColumn);
11504 verifyFormat("f(^{\n"
11505 " @autoreleasepool {\n"
11506 " if (a) {\n"
11507 " g();\n"
11508 " }\n"
11509 " }\n"
11510 "});",
11511 ZeroColumn);
11512 verifyFormat("void (^largeBlock)(void) = ^{\n"
11513 " // ...\n"
11514 "};",
11515 ZeroColumn);
11516
11517 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11518 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011519 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011520 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11521 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11522 " int i;\n"
11523 "};",
11524 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11525}
11526
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011527TEST_F(FormatTest, SupportsCRLF) {
11528 EXPECT_EQ("int a;\r\n"
11529 "int b;\r\n"
11530 "int c;\r\n",
11531 format("int a;\r\n"
11532 " int b;\r\n"
11533 " int c;\r\n",
11534 getLLVMStyle()));
11535 EXPECT_EQ("int a;\r\n"
11536 "int b;\r\n"
11537 "int c;\r\n",
11538 format("int a;\r\n"
11539 " int b;\n"
11540 " int c;\r\n",
11541 getLLVMStyle()));
11542 EXPECT_EQ("int a;\n"
11543 "int b;\n"
11544 "int c;\n",
11545 format("int a;\r\n"
11546 " int b;\n"
11547 " int c;\n",
11548 getLLVMStyle()));
11549 EXPECT_EQ("\"aaaaaaa \"\r\n"
11550 "\"bbbbbbb\";\r\n",
11551 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11552 EXPECT_EQ("#define A \\\r\n"
11553 " b; \\\r\n"
11554 " c; \\\r\n"
11555 " d;\r\n",
11556 format("#define A \\\r\n"
11557 " b; \\\r\n"
11558 " c; d; \r\n",
11559 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011560
11561 EXPECT_EQ("/*\r\n"
11562 "multi line block comments\r\n"
11563 "should not introduce\r\n"
11564 "an extra carriage return\r\n"
11565 "*/\r\n",
11566 format("/*\r\n"
11567 "multi line block comments\r\n"
11568 "should not introduce\r\n"
11569 "an extra carriage return\r\n"
11570 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011571}
11572
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011573TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11574 verifyFormat("MY_CLASS(C) {\n"
11575 " int i;\n"
11576 " int j;\n"
11577 "};");
11578}
11579
Daniel Jasper6633ab82013-10-18 10:38:14 +000011580TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11581 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11582 TwoIndent.ContinuationIndentWidth = 2;
11583
11584 EXPECT_EQ("int i =\n"
11585 " longFunction(\n"
11586 " arg);",
11587 format("int i = longFunction(arg);", TwoIndent));
11588
11589 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11590 SixIndent.ContinuationIndentWidth = 6;
11591
11592 EXPECT_EQ("int i =\n"
11593 " longFunction(\n"
11594 " arg);",
11595 format("int i = longFunction(arg);", SixIndent));
11596}
11597
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011598TEST_F(FormatTest, SpacesInAngles) {
11599 FormatStyle Spaces = getLLVMStyle();
11600 Spaces.SpacesInAngles = true;
11601
11602 verifyFormat("static_cast< int >(arg);", Spaces);
11603 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11604 verifyFormat("f< int, float >();", Spaces);
11605 verifyFormat("template <> g() {}", Spaces);
11606 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011607 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11608 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11609 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011610
11611 Spaces.Standard = FormatStyle::LS_Cpp03;
11612 Spaces.SpacesInAngles = true;
11613 verifyFormat("A< A< int > >();", Spaces);
11614
11615 Spaces.SpacesInAngles = false;
11616 verifyFormat("A<A<int> >();", Spaces);
11617
11618 Spaces.Standard = FormatStyle::LS_Cpp11;
11619 Spaces.SpacesInAngles = true;
11620 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011621
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011622 Spaces.SpacesInAngles = false;
11623 verifyFormat("A<A<int>>();", Spaces);
11624}
11625
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011626TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11627 FormatStyle Style = getLLVMStyle();
11628 Style.SpaceAfterTemplateKeyword = false;
11629 verifyFormat("template<int> void foo();", Style);
11630}
11631
Jacques Pienaarfc275112015-02-18 23:48:37 +000011632TEST_F(FormatTest, TripleAngleBrackets) {
11633 verifyFormat("f<<<1, 1>>>();");
11634 verifyFormat("f<<<1, 1, 1, s>>>();");
11635 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011636 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011637 verifyFormat("f<param><<<1, 1>>>();");
11638 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011639 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011640 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11641 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011642 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11643 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011644}
11645
11646TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011647 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011648 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011649 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11650 "aaallvm::outs() <<");
11651 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11652 "aaaallvm::outs()\n <<");
11653}
11654
Manuel Klimek819788d2014-03-18 11:22:45 +000011655TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11656 std::string code = "#if A\n"
11657 "#if B\n"
11658 "a.\n"
11659 "#endif\n"
11660 " a = 1;\n"
11661 "#else\n"
11662 "#endif\n"
11663 "#if C\n"
11664 "#else\n"
11665 "#endif\n";
11666 EXPECT_EQ(code, format(code));
11667}
11668
Manuel Klimek68b03042014-04-14 09:14:11 +000011669TEST_F(FormatTest, HandleConflictMarkers) {
11670 // Git/SVN conflict markers.
11671 EXPECT_EQ("int a;\n"
11672 "void f() {\n"
11673 " callme(some(parameter1,\n"
11674 "<<<<<<< text by the vcs\n"
11675 " parameter2),\n"
11676 "||||||| text by the vcs\n"
11677 " parameter2),\n"
11678 " parameter3,\n"
11679 "======= text by the vcs\n"
11680 " parameter2, parameter3),\n"
11681 ">>>>>>> text by the vcs\n"
11682 " otherparameter);\n",
11683 format("int a;\n"
11684 "void f() {\n"
11685 " callme(some(parameter1,\n"
11686 "<<<<<<< text by the vcs\n"
11687 " parameter2),\n"
11688 "||||||| text by the vcs\n"
11689 " parameter2),\n"
11690 " parameter3,\n"
11691 "======= text by the vcs\n"
11692 " parameter2,\n"
11693 " parameter3),\n"
11694 ">>>>>>> text by the vcs\n"
11695 " otherparameter);\n"));
11696
11697 // Perforce markers.
11698 EXPECT_EQ("void f() {\n"
11699 " function(\n"
11700 ">>>> text by the vcs\n"
11701 " parameter,\n"
11702 "==== text by the vcs\n"
11703 " parameter,\n"
11704 "==== text by the vcs\n"
11705 " parameter,\n"
11706 "<<<< text by the vcs\n"
11707 " parameter);\n",
11708 format("void f() {\n"
11709 " function(\n"
11710 ">>>> text by the vcs\n"
11711 " parameter,\n"
11712 "==== text by the vcs\n"
11713 " parameter,\n"
11714 "==== text by the vcs\n"
11715 " parameter,\n"
11716 "<<<< text by the vcs\n"
11717 " parameter);\n"));
11718
11719 EXPECT_EQ("<<<<<<<\n"
11720 "|||||||\n"
11721 "=======\n"
11722 ">>>>>>>",
11723 format("<<<<<<<\n"
11724 "|||||||\n"
11725 "=======\n"
11726 ">>>>>>>"));
11727
11728 EXPECT_EQ("<<<<<<<\n"
11729 "|||||||\n"
11730 "int i;\n"
11731 "=======\n"
11732 ">>>>>>>",
11733 format("<<<<<<<\n"
11734 "|||||||\n"
11735 "int i;\n"
11736 "=======\n"
11737 ">>>>>>>"));
11738
11739 // FIXME: Handle parsing of macros around conflict markers correctly:
11740 EXPECT_EQ("#define Macro \\\n"
11741 "<<<<<<<\n"
11742 "Something \\\n"
11743 "|||||||\n"
11744 "Else \\\n"
11745 "=======\n"
11746 "Other \\\n"
11747 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011748 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011749 format("#define Macro \\\n"
11750 "<<<<<<<\n"
11751 " Something \\\n"
11752 "|||||||\n"
11753 " Else \\\n"
11754 "=======\n"
11755 " Other \\\n"
11756 ">>>>>>>\n"
11757 " End\n"
11758 "int i;\n"));
11759}
11760
Daniel Jasper471894432014-08-06 13:40:26 +000011761TEST_F(FormatTest, DisableRegions) {
11762 EXPECT_EQ("int i;\n"
11763 "// clang-format off\n"
11764 " int j;\n"
11765 "// clang-format on\n"
11766 "int k;",
11767 format(" int i;\n"
11768 " // clang-format off\n"
11769 " int j;\n"
11770 " // clang-format on\n"
11771 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011772 EXPECT_EQ("int i;\n"
11773 "/* clang-format off */\n"
11774 " int j;\n"
11775 "/* clang-format on */\n"
11776 "int k;",
11777 format(" int i;\n"
11778 " /* clang-format off */\n"
11779 " int j;\n"
11780 " /* clang-format on */\n"
11781 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011782
11783 // Don't reflow comments within disabled regions.
11784 EXPECT_EQ(
11785 "// clang-format off\n"
11786 "// long long long long long long line\n"
11787 "/* clang-format on */\n"
11788 "/* long long long\n"
11789 " * long long long\n"
11790 " * line */\n"
11791 "int i;\n"
11792 "/* clang-format off */\n"
11793 "/* long long long long long long line */\n",
11794 format("// clang-format off\n"
11795 "// long long long long long long line\n"
11796 "/* clang-format on */\n"
11797 "/* long long long long long long line */\n"
11798 "int i;\n"
11799 "/* clang-format off */\n"
11800 "/* long long long long long long line */\n",
11801 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011802}
11803
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011804TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11805 format("? ) =");
11806 verifyNoCrash("#define a\\\n /**/}");
11807}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011808
Daniel Jasper498f5582015-12-25 08:53:31 +000011809TEST_F(FormatTest, FormatsTableGenCode) {
11810 FormatStyle Style = getLLVMStyle();
11811 Style.Language = FormatStyle::LK_TableGen;
11812 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11813}
11814
Nico Weberb2673a12016-11-10 21:49:25 +000011815TEST_F(FormatTest, ArrayOfTemplates) {
11816 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11817 format("auto a = new unique_ptr<int > [ 10];"));
11818
11819 FormatStyle Spaces = getLLVMStyle();
11820 Spaces.SpacesInSquareBrackets = true;
11821 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11822 format("auto a = new unique_ptr<int > [10];", Spaces));
11823}
11824
11825TEST_F(FormatTest, ArrayAsTemplateType) {
11826 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11827 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11828
11829 FormatStyle Spaces = getLLVMStyle();
11830 Spaces.SpacesInSquareBrackets = true;
11831 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11832 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11833}
11834
Martin Probstc9c51c42017-03-16 10:21:35 +000011835TEST_F(FormatTest, NoSpaceAfterSuper) {
11836 verifyFormat("__super::FooBar();");
11837}
11838
Ben Hamilton07e58362018-02-21 21:27:27 +000011839TEST(FormatStyle, GetStyleWithEmptyFileName) {
Bjorn Pettersson0b2f7742018-02-26 14:14:11 +000011840 vfs::InMemoryFileSystem FS;
11841 auto Style1 = getStyle("file", "", "Google", "", &FS);
Ben Hamilton07e58362018-02-21 21:27:27 +000011842 ASSERT_TRUE((bool)Style1);
11843 ASSERT_EQ(*Style1, getGoogleStyle());
11844}
11845
Eric Liu547d8792016-03-24 13:22:42 +000011846TEST(FormatStyle, GetStyleOfFile) {
11847 vfs::InMemoryFileSystem FS;
11848 // Test 1: format file in the same directory.
11849 ASSERT_TRUE(
11850 FS.addFile("/a/.clang-format", 0,
11851 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11852 ASSERT_TRUE(
11853 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011854 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011855 ASSERT_TRUE((bool)Style1);
11856 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011857
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011858 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011859 ASSERT_TRUE(
11860 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011861 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011862 ASSERT_TRUE((bool)Style2);
11863 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011864
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011865 // Test 2.2: no format on 'none' fallback style.
11866 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11867 ASSERT_TRUE((bool)Style2);
11868 ASSERT_EQ(*Style2, getNoStyle());
11869
11870 // Test 2.3: format if config is found with no based style while fallback is
11871 // 'none'.
11872 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11873 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11874 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11875 ASSERT_TRUE((bool)Style2);
11876 ASSERT_EQ(*Style2, getLLVMStyle());
11877
11878 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11879 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11880 ASSERT_TRUE((bool)Style2);
11881 ASSERT_EQ(*Style2, getLLVMStyle());
11882
Eric Liu547d8792016-03-24 13:22:42 +000011883 // Test 3: format file in parent directory.
11884 ASSERT_TRUE(
11885 FS.addFile("/c/.clang-format", 0,
11886 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11887 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11888 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011889 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011890 ASSERT_TRUE((bool)Style3);
11891 ASSERT_EQ(*Style3, getGoogleStyle());
11892
11893 // Test 4: error on invalid fallback style
11894 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11895 ASSERT_FALSE((bool)Style4);
11896 llvm::consumeError(Style4.takeError());
11897
11898 // Test 5: error on invalid yaml on command line
11899 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11900 ASSERT_FALSE((bool)Style5);
11901 llvm::consumeError(Style5.takeError());
11902
11903 // Test 6: error on invalid style
11904 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11905 ASSERT_FALSE((bool)Style6);
11906 llvm::consumeError(Style6.takeError());
11907
11908 // Test 7: found config file, error on parsing it
11909 ASSERT_TRUE(
11910 FS.addFile("/d/.clang-format", 0,
11911 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11912 "InvalidKey: InvalidValue")));
11913 ASSERT_TRUE(
11914 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11915 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11916 ASSERT_FALSE((bool)Style7);
11917 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011918}
11919
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011920TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11921 // Column limit is 20.
11922 std::string Code = "Type *a =\n"
11923 " new Type();\n"
11924 "g(iiiii, 0, jjjjj,\n"
11925 " 0, kkkkk, 0, mm);\n"
11926 "int bad = format ;";
11927 std::string Expected = "auto a = new Type();\n"
11928 "g(iiiii, nullptr,\n"
11929 " jjjjj, nullptr,\n"
11930 " kkkkk, nullptr,\n"
11931 " mm);\n"
11932 "int bad = format ;";
11933 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011934 tooling::Replacements Replaces = toReplacements(
11935 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11936 "auto "),
11937 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11938 "nullptr"),
11939 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11940 "nullptr"),
11941 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11942 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011943
11944 format::FormatStyle Style = format::getLLVMStyle();
11945 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011946 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11947 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11948 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11949 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11950 EXPECT_TRUE(static_cast<bool>(Result));
11951 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011952}
11953
Eric Liubaf58c22016-05-18 13:43:48 +000011954TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11955 std::string Code = "#include \"a.h\"\n"
11956 "#include \"c.h\"\n"
11957 "\n"
11958 "int main() {\n"
11959 " return 0;\n"
11960 "}";
11961 std::string Expected = "#include \"a.h\"\n"
11962 "#include \"b.h\"\n"
11963 "#include \"c.h\"\n"
11964 "\n"
11965 "int main() {\n"
11966 " return 0;\n"
11967 "}";
11968 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011969 tooling::Replacements Replaces = toReplacements(
11970 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11971 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011972
11973 format::FormatStyle Style = format::getLLVMStyle();
11974 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011975 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11976 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11977 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11978 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11979 EXPECT_TRUE(static_cast<bool>(Result));
11980 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011981}
11982
Krasimir Georgievac16a202017-06-23 11:46:03 +000011983TEST_F(FormatTest, FormatSortsUsingDeclarations) {
11984 EXPECT_EQ("using std::cin;\n"
11985 "using std::cout;",
11986 format("using std::cout;\n"
11987 "using std::cin;", getGoogleStyle()));
11988}
11989
Nico Weberdc065182017-04-05 18:10:42 +000011990TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
11991 format::FormatStyle Style = format::getLLVMStyle();
11992 Style.Standard = FormatStyle::LS_Cpp03;
11993 // cpp03 recognize this string as identifier u8 and literal character 'a'
11994 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
11995}
11996
11997TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
11998 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
11999 // all modes, including C++11, C++14 and C++17
12000 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
12001}
12002
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000012003TEST_F(FormatTest, DoNotFormatLikelyXml) {
12004 EXPECT_EQ("<!-- ;> -->",
12005 format("<!-- ;> -->", getGoogleStyle()));
12006 EXPECT_EQ(" <!-- >; -->",
12007 format(" <!-- >; -->", getGoogleStyle()));
12008}
12009
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012010TEST_F(FormatTest, StructuredBindings) {
12011 // Structured bindings is a C++17 feature.
12012 // all modes, including C++11, C++14 and C++17
12013 verifyFormat("auto [a, b] = f();");
12014 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
12015 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();"));
12016 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();"));
12017 EXPECT_EQ("auto const volatile [a, b] = f();",
12018 format("auto const volatile[a, b] = f();"));
12019 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012020 EXPECT_EQ("auto &[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012021 format("auto &[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012022 EXPECT_EQ("auto &&[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012023 format("auto &&[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012024 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();"));
12025 EXPECT_EQ("auto const volatile &&[a, b] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012026 format("auto const volatile &&[a, b] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012027 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();"));
12028 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();"));
12029 EXPECT_EQ("const auto volatile &&[a, b] = f();",
12030 format("const auto volatile &&[a, b] = f();"));
12031 EXPECT_EQ("volatile const auto &&[a, b] = f();",
12032 format("volatile const auto &&[a, b] = f();"));
12033 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();"));
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012034
Manuel Klimeke411aa82017-09-20 09:29:37 +000012035 // Make sure we don't mistake structured bindings for lambdas.
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012036 FormatStyle PointerMiddle = getLLVMStyle();
12037 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
12038 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
12039 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
12040 verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
12041 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
12042 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
12043 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
12044 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
12045 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
12046 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
12047 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
12048 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
12049 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
12050
12051 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
12052 format("for (const auto && [a, b] : some_range) {\n}"));
12053 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
12054 format("for (const auto & [a, b] : some_range) {\n}"));
12055 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
12056 format("for (const auto[a, b] : some_range) {\n}"));
12057 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);"));
12058 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);"));
12059 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);"));
12060 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);"));
12061 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);"));
12062 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};"));
12063 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};"));
12064 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};"));
Manuel Klimeke411aa82017-09-20 09:29:37 +000012065
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012066 format::FormatStyle Spaces = format::getLLVMStyle();
12067 Spaces.SpacesInSquareBrackets = true;
12068 verifyFormat("auto [ a, b ] = f();", Spaces);
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012069 verifyFormat("auto &&[ a, b ] = f();", Spaces);
12070 verifyFormat("auto &[ a, b ] = f();", Spaces);
12071 verifyFormat("auto const &&[ a, b ] = f();", Spaces);
12072 verifyFormat("auto const &[ a, b ] = f();", Spaces);
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012073}
12074
Ben Hamilton6e066352018-02-27 15:56:40 +000012075TEST_F(FormatTest, FileAndCode) {
12076 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
12077 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
12078 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
12079 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
12080 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
12081 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
12082 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
Ben Hamilton3b345c32018-02-21 15:54:31 +000012083}
12084
Daniel Jasperd246a5a2015-06-15 15:25:11 +000012085} // end namespace
12086} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000012087} // end namespace clang