blob: fa5506fbfb568704512213caaf461f982ce3f1cd [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
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000279 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
280 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000281 EXPECT_EQ("namespace {\n"
282 "int i;\n"
283 "}",
284 format("namespace {\n"
285 "int i;\n"
286 "\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000287 "}", LLVMWithNoNamespaceFix));
288 EXPECT_EQ("namespace {\n"
289 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000290 "}",
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000291 format("namespace {\n"
292 "int i;\n"
293 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000294 "}"));
295 EXPECT_EQ("namespace {\n"
296 "int i;\n"
Krasimir Georgiev5cca20f2018-03-19 15:33:40 +0000297 "};",
298 format("namespace {\n"
299 "int i;\n"
300 "\n"
301 "};"));
302 EXPECT_EQ("namespace {\n"
303 "int i;\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000304 "} // namespace",
305 format("namespace {\n"
306 "int i;\n"
307 "\n"
308 "} // namespace"));
Krasimir Georgiev5cca20f2018-03-19 15:33:40 +0000309 EXPECT_EQ("namespace {\n"
310 "int i;\n"
311 "}; // namespace",
312 format("namespace {\n"
313 "int i;\n"
314 "\n"
315 "}; // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000316
317 FormatStyle Style = getLLVMStyle();
318 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
319 Style.MaxEmptyLinesToKeep = 2;
320 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
321 Style.BraceWrapping.AfterClass = true;
322 Style.BraceWrapping.AfterFunction = true;
323 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
324
325 EXPECT_EQ("class Foo\n"
326 "{\n"
327 " Foo() {}\n"
328 "\n"
329 " void funk() {}\n"
330 "};",
331 format("class Foo\n"
332 "{\n"
333 " Foo()\n"
334 " {\n"
335 " }\n"
336 "\n"
337 " void funk() {}\n"
338 "};",
339 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000340}
341
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000342TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000343 verifyFormat("x = (a) and (b);");
344 verifyFormat("x = (a) or (b);");
345 verifyFormat("x = (a) bitand (b);");
346 verifyFormat("x = (a) bitor (b);");
347 verifyFormat("x = (a) not_eq (b);");
348 verifyFormat("x = (a) and_eq (b);");
349 verifyFormat("x = (a) or_eq (b);");
350 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000351}
352
Olivier Goffart90f981b2017-07-14 09:23:40 +0000353TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) {
354 verifyFormat("x = compl(a);");
355 verifyFormat("x = not(a);");
356 verifyFormat("x = bitand(a);");
357 // Unary operator must not be merged with the next identifier
358 verifyFormat("x = compl a;");
359 verifyFormat("x = not a;");
360 verifyFormat("x = bitand a;");
361}
362
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000363//===----------------------------------------------------------------------===//
364// Tests for control statements.
365//===----------------------------------------------------------------------===//
366
Daniel Jaspercdd06622013-05-14 10:31:09 +0000367TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000368 verifyFormat("if (true)\n f();\ng();");
369 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000370 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000371 verifyFormat("if constexpr (true)\n"
372 " f();\ng();");
373 verifyFormat("if constexpr (a)\n"
374 " if constexpr (b)\n"
375 " if constexpr (c)\n"
376 " g();\n"
377 "h();");
378 verifyFormat("if constexpr (a)\n"
379 " if constexpr (b) {\n"
380 " f();\n"
381 " }\n"
382 "g();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000383
Daniel Jasper3a685df2013-05-16 12:12:21 +0000384 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +0000385 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jasperced17f82013-01-16 15:44:34 +0000386 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
387 verifyFormat("if (a)\n"
388 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000389 " f();",
390 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000391 verifyFormat("{\n"
392 " if (a)\n"
393 " label:\n"
394 " f();\n"
395 "}",
396 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000397 verifyFormat("#define A \\\n"
398 " if (a) \\\n"
399 " label: \\\n"
400 " f()",
401 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000402 verifyFormat("if (a)\n"
403 " ;",
404 AllowsMergedIf);
405 verifyFormat("if (a)\n"
406 " if (b) return;",
407 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000408
Daniel Jasper3a685df2013-05-16 12:12:21 +0000409 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000410 " f();\n",
411 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000412 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000413 " f();",
414 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000415 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000416 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000417 "}",
418 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000419 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000420 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000421 "}",
422 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000423
424 AllowsMergedIf.ColumnLimit = 14;
425 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000426 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000427 " return;",
428 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000429
430 AllowsMergedIf.ColumnLimit = 13;
431 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000432}
433
Daniel Jasper3a685df2013-05-16 12:12:21 +0000434TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
435 FormatStyle AllowsMergedLoops = getLLVMStyle();
436 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
437 verifyFormat("while (true) continue;", AllowsMergedLoops);
438 verifyFormat("for (;;) continue;", AllowsMergedLoops);
439 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
440 verifyFormat("while (true)\n"
441 " ;",
442 AllowsMergedLoops);
443 verifyFormat("for (;;)\n"
444 " ;",
445 AllowsMergedLoops);
446 verifyFormat("for (;;)\n"
447 " for (;;) continue;",
448 AllowsMergedLoops);
449 verifyFormat("for (;;) // Can't merge this\n"
450 " continue;",
451 AllowsMergedLoops);
452 verifyFormat("for (;;) /* still don't merge */\n"
453 " continue;",
454 AllowsMergedLoops);
455}
456
Daniel Jasper17605d32014-05-14 09:33:35 +0000457TEST_F(FormatTest, FormatShortBracedStatements) {
458 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000459 AllowSimpleBracedStatements.ColumnLimit = 40;
Daniel Jasper17605d32014-05-14 09:33:35 +0000460 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
461
462 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
463 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
464
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000465 AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom;
466 AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true;
467 AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false;
468
Daniel Jasper17605d32014-05-14 09:33:35 +0000469 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000470 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000471 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
472 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
473 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000474 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000475 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
476 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000477 verifyFormat("if (true) {\n"
478 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
479 "}",
480 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000481 verifyFormat("if (true) { //\n"
482 " f();\n"
483 "}",
484 AllowSimpleBracedStatements);
485 verifyFormat("if (true) {\n"
486 " f();\n"
487 " f();\n"
488 "}",
489 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000490 verifyFormat("if (true) {\n"
491 " f();\n"
492 "} else {\n"
493 " f();\n"
494 "}",
495 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000496
Daniel Jasperf92659e2017-06-19 07:45:41 +0000497 verifyFormat("struct A2 {\n"
498 " int X;\n"
499 "};",
500 AllowSimpleBracedStatements);
501 verifyFormat("typedef struct A2 {\n"
502 " int X;\n"
503 "} A2_t;",
504 AllowSimpleBracedStatements);
Daniel Jasperbd630732014-05-22 13:25:26 +0000505 verifyFormat("template <int> struct A2 {\n"
506 " struct B {};\n"
507 "};",
508 AllowSimpleBracedStatements);
509
Daniel Jasper17605d32014-05-14 09:33:35 +0000510 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000511 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000512 verifyFormat("if (true) {\n"
513 " f();\n"
514 "}",
515 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000516 verifyFormat("if (true) {\n"
517 " f();\n"
518 "} else {\n"
519 " f();\n"
520 "}",
521 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000522
523 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000524 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000525 verifyFormat("while (true) {\n"
526 " f();\n"
527 "}",
528 AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000529 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000530 verifyFormat("for (;;) {\n"
531 " f();\n"
532 "}",
533 AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000534
535 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
536 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
537 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = true;
538
539 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
540 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
541 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
542 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
543 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
544 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
545 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
546 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
547 verifyFormat("if (true)\n"
548 "{\n"
549 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
550 "}",
551 AllowSimpleBracedStatements);
552 verifyFormat("if (true)\n"
553 "{ //\n"
554 " f();\n"
555 "}",
556 AllowSimpleBracedStatements);
557 verifyFormat("if (true)\n"
558 "{\n"
559 " f();\n"
560 " f();\n"
561 "}",
562 AllowSimpleBracedStatements);
563 verifyFormat("if (true)\n"
564 "{\n"
565 " f();\n"
566 "} else\n"
567 "{\n"
568 " f();\n"
569 "}",
570 AllowSimpleBracedStatements);
571
572 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
573 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
574 verifyFormat("if (true)\n"
575 "{\n"
576 " f();\n"
577 "}",
578 AllowSimpleBracedStatements);
579 verifyFormat("if (true)\n"
580 "{\n"
581 " f();\n"
582 "} else\n"
583 "{\n"
584 " f();\n"
585 "}",
586 AllowSimpleBracedStatements);
587
588 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
589 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
590 verifyFormat("while (true)\n"
591 "{\n"
592 " f();\n"
593 "}",
594 AllowSimpleBracedStatements);
595 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
596 verifyFormat("for (;;)\n"
597 "{\n"
598 " f();\n"
599 "}",
600 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000601}
602
Krasimir Georgievbf4cdda2018-01-19 16:12:37 +0000603TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) {
604 FormatStyle Style = getLLVMStyleWithColumns(60);
605 Style.AllowShortBlocksOnASingleLine = true;
606 Style.AllowShortIfStatementsOnASingleLine = true;
607 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
608 EXPECT_EQ("#define A \\\n"
609 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n"
610 " { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n"
611 "X;",
612 format("#define A \\\n"
613 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n"
614 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n"
615 " }\n"
616 "X;",
617 Style));
618}
619
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000620TEST_F(FormatTest, ParseIfElse) {
621 verifyFormat("if (true)\n"
622 " if (true)\n"
623 " if (true)\n"
624 " f();\n"
625 " else\n"
626 " g();\n"
627 " else\n"
628 " h();\n"
629 "else\n"
630 " i();");
631 verifyFormat("if (true)\n"
632 " if (true)\n"
633 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000634 " if (true)\n"
635 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000636 " } else {\n"
637 " g();\n"
638 " }\n"
639 " else\n"
640 " h();\n"
641 "else {\n"
642 " i();\n"
643 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000644 verifyFormat("if (true)\n"
645 " if constexpr (true)\n"
646 " if (true) {\n"
647 " if constexpr (true)\n"
648 " f();\n"
649 " } else {\n"
650 " g();\n"
651 " }\n"
652 " else\n"
653 " h();\n"
654 "else {\n"
655 " i();\n"
656 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000657 verifyFormat("void f() {\n"
658 " if (a) {\n"
659 " } else {\n"
660 " }\n"
661 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000662}
663
664TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000665 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000666 verifyFormat("if (a)\n"
667 " f();\n"
668 "else if (b)\n"
669 " g();\n"
670 "else\n"
671 " h();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000672 verifyFormat("if constexpr (a)\n"
673 " f();\n"
674 "else if constexpr (b)\n"
675 " g();\n"
676 "else\n"
677 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000678 verifyFormat("if (a) {\n"
679 " f();\n"
680 "}\n"
681 "// or else ..\n"
682 "else {\n"
683 " g()\n"
684 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000685
686 verifyFormat("if (a) {\n"
687 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
688 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
689 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000690 verifyFormat("if (a) {\n"
691 "} else if (\n"
692 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
693 "}",
694 getLLVMStyleWithColumns(62));
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000695 verifyFormat("if (a) {\n"
696 "} else if constexpr (\n"
697 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
698 "}",
699 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000700}
701
Daniel Jasperf7935112012-12-03 18:12:45 +0000702TEST_F(FormatTest, FormatsForLoop) {
703 verifyFormat(
704 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000705 " ++VeryVeryLongLoopVariable)\n"
706 " ;");
707 verifyFormat("for (;;)\n"
708 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000709 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000710 verifyFormat("for (;;) {\n"
711 " f();\n"
712 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000713 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000714
715 verifyFormat(
716 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
717 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000718 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000719
720 verifyFormat(
721 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000722 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000723 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
724 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000725 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000726 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
727 " I = FD->getDeclsInPrototypeScope().begin(),\n"
728 " E = FD->getDeclsInPrototypeScope().end();\n"
729 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000730 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
731 " I = Container.begin(),\n"
732 " E = Container.end();\n"
733 " I != E; ++I) {\n}",
734 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000735
Daniel Jasper48c62f92013-01-28 17:30:17 +0000736 verifyFormat(
737 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
738 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000739 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
740 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000741 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000742 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
743 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
744 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000745 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
746 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
747 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000748 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
749 " aaaaaaaaaa);\n"
750 " iter; ++iter) {\n"
751 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000752 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
753 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
754 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
755 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000756
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +0000757 // These should not be formatted as Objective-C for-in loops.
758 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}");
759 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}");
760 verifyFormat("Foo *x;\nfor (x in y) {\n}");
761 verifyFormat("for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}");
762
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000763 FormatStyle NoBinPacking = getLLVMStyle();
764 NoBinPacking.BinPackParameters = false;
765 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
766 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
767 " aaaaaaaaaaaaaaaa,\n"
768 " aaaaaaaaaaaaaaaa,\n"
769 " aaaaaaaaaaaaaaaa);\n"
770 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
771 "}",
772 NoBinPacking);
773 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000774 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
775 " E = UnwrappedLines.end();\n"
776 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000777 " ++I) {\n}",
778 NoBinPacking);
Daniel Jasper7b85a192017-09-03 08:56:24 +0000779
780 FormatStyle AlignLeft = getLLVMStyle();
781 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
782 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
Daniel Jasperf7935112012-12-03 18:12:45 +0000783}
784
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000785TEST_F(FormatTest, RangeBasedForLoops) {
786 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
787 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
788 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
789 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000790 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
791 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000792 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
793 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000794}
795
Daniel Jaspere1e43192014-04-01 12:55:11 +0000796TEST_F(FormatTest, ForEachLoops) {
797 verifyFormat("void f() {\n"
798 " foreach (Item *item, itemlist) {}\n"
799 " Q_FOREACH (Item *item, itemlist) {}\n"
800 " BOOST_FOREACH (Item *item, itemlist) {}\n"
801 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
802 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000803
804 // As function-like macros.
805 verifyFormat("#define foreach(x, y)\n"
806 "#define Q_FOREACH(x, y)\n"
807 "#define BOOST_FOREACH(x, y)\n"
808 "#define UNKNOWN_FOREACH(x, y)\n");
809
810 // Not as function-like macros.
811 verifyFormat("#define foreach (x, y)\n"
812 "#define Q_FOREACH (x, y)\n"
813 "#define BOOST_FOREACH (x, y)\n"
814 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000815}
816
Daniel Jasperf7935112012-12-03 18:12:45 +0000817TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000818 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000819 verifyFormat("while (true)\n"
820 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000821 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000822 verifyFormat("while () {\n"
823 " f();\n"
824 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000825}
826
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000827TEST_F(FormatTest, FormatsDoWhile) {
828 verifyFormat("do {\n"
829 " do_something();\n"
830 "} while (something());");
831 verifyFormat("do\n"
832 " do_something();\n"
833 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000834}
835
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000836TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000837 verifyFormat("switch (x) {\n"
838 "case 1:\n"
839 " f();\n"
840 " break;\n"
841 "case kFoo:\n"
842 "case ns::kBar:\n"
843 "case kBaz:\n"
844 " break;\n"
845 "default:\n"
846 " g();\n"
847 " break;\n"
848 "}");
849 verifyFormat("switch (x) {\n"
850 "case 1: {\n"
851 " f();\n"
852 " break;\n"
853 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000854 "case 2: {\n"
855 " break;\n"
856 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000857 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000858 verifyFormat("switch (x) {\n"
859 "case 1: {\n"
860 " f();\n"
861 " {\n"
862 " g();\n"
863 " h();\n"
864 " }\n"
865 " break;\n"
866 "}\n"
867 "}");
868 verifyFormat("switch (x) {\n"
869 "case 1: {\n"
870 " f();\n"
871 " if (foo) {\n"
872 " g();\n"
873 " h();\n"
874 " }\n"
875 " break;\n"
876 "}\n"
877 "}");
878 verifyFormat("switch (x) {\n"
879 "case 1: {\n"
880 " f();\n"
881 " g();\n"
882 "} break;\n"
883 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000884 verifyFormat("switch (test)\n"
885 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000886 verifyFormat("switch (x) {\n"
887 "default: {\n"
888 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000889 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000890 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000891 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000892 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000893 "// if 1, do f()\n"
894 "case 1:\n"
895 " f();\n"
896 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000897 verifyFormat("switch (x) {\n"
898 "case 1:\n"
899 " // Do amazing stuff\n"
900 " {\n"
901 " f();\n"
902 " g();\n"
903 " }\n"
904 " break;\n"
905 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000906 verifyFormat("#define A \\\n"
907 " switch (x) { \\\n"
908 " case a: \\\n"
909 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000910 " }",
911 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000912 verifyFormat("#define OPERATION_CASE(name) \\\n"
913 " case OP_name: \\\n"
914 " return operations::Operation##name\n",
915 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000916 verifyFormat("switch (x) {\n"
917 "case 1:;\n"
918 "default:;\n"
919 " int i;\n"
920 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000921
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000922 verifyGoogleFormat("switch (x) {\n"
923 " case 1:\n"
924 " f();\n"
925 " break;\n"
926 " case kFoo:\n"
927 " case ns::kBar:\n"
928 " case kBaz:\n"
929 " break;\n"
930 " default:\n"
931 " g();\n"
932 " break;\n"
933 "}");
934 verifyGoogleFormat("switch (x) {\n"
935 " case 1: {\n"
936 " f();\n"
937 " break;\n"
938 " }\n"
939 "}");
940 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000941 " ;");
942
943 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
944 " case OP_name: \\\n"
945 " return operations::Operation##name\n");
946 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
947 " // Get the correction operation class.\n"
948 " switch (OpCode) {\n"
949 " CASE(Add);\n"
950 " CASE(Subtract);\n"
951 " default:\n"
952 " return operations::Unknown;\n"
953 " }\n"
954 "#undef OPERATION_CASE\n"
955 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000956 verifyFormat("DEBUG({\n"
957 " switch (x) {\n"
958 " case A:\n"
959 " f();\n"
960 " break;\n"
Krasimir Georgieve0926342017-07-12 15:21:43 +0000961 " // fallthrough\n"
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000962 " case B:\n"
963 " g();\n"
964 " break;\n"
965 " }\n"
966 "});");
Krasimir Georgieve0926342017-07-12 15:21:43 +0000967 EXPECT_EQ("DEBUG({\n"
968 " switch (x) {\n"
969 " case A:\n"
970 " f();\n"
971 " break;\n"
972 " // On B:\n"
973 " case B:\n"
974 " g();\n"
975 " break;\n"
976 " }\n"
977 "});",
978 format("DEBUG({\n"
979 " switch (x) {\n"
980 " case A:\n"
981 " f();\n"
982 " break;\n"
983 " // On B:\n"
984 " case B:\n"
985 " g();\n"
986 " break;\n"
987 " }\n"
988 "});",
989 getLLVMStyle()));
Daniel Jasper031e2402014-04-28 07:48:36 +0000990 verifyFormat("switch (a) {\n"
991 "case (b):\n"
992 " return;\n"
993 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000994
995 verifyFormat("switch (a) {\n"
996 "case some_namespace::\n"
997 " some_constant:\n"
998 " return;\n"
999 "}",
1000 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +00001001}
1002
Daniel Jasper2d0cd492013-10-20 16:56:16 +00001003TEST_F(FormatTest, CaseRanges) {
1004 verifyFormat("switch (x) {\n"
1005 "case 'A' ... 'Z':\n"
1006 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +00001007 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +00001008 " break;\n"
1009 "}");
1010}
1011
Daniel Jasperb87899b2014-09-10 13:11:45 +00001012TEST_F(FormatTest, ShortCaseLabels) {
1013 FormatStyle Style = getLLVMStyle();
1014 Style.AllowShortCaseLabelsOnASingleLine = true;
1015 verifyFormat("switch (a) {\n"
1016 "case 1: x = 1; break;\n"
1017 "case 2: return;\n"
1018 "case 3:\n"
1019 "case 4:\n"
1020 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +00001021 "case 6: // comment\n"
1022 " return;\n"
1023 "case 7:\n"
1024 " // comment\n"
1025 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +00001026 "case 8:\n"
1027 " x = 8; // comment\n"
1028 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001029 "default: y = 1; break;\n"
1030 "}",
1031 Style);
1032 verifyFormat("switch (a) {\n"
Francois Ferranda64ba702017-07-28 07:56:18 +00001033 "case 0: return; // comment\n"
1034 "case 1: break; // comment\n"
1035 "case 2: return;\n"
1036 "// comment\n"
1037 "case 3: return;\n"
1038 "// comment 1\n"
1039 "// comment 2\n"
1040 "// comment 3\n"
1041 "case 4: break; /* comment */\n"
1042 "case 5:\n"
1043 " // comment\n"
1044 " break;\n"
1045 "case 6: /* comment */ x = 1; break;\n"
1046 "case 7: x = /* comment */ 1; break;\n"
1047 "case 8:\n"
1048 " x = 1; /* comment */\n"
1049 " break;\n"
1050 "case 9:\n"
1051 " break; // comment line 1\n"
1052 " // comment line 2\n"
1053 "}",
1054 Style);
1055 EXPECT_EQ("switch (a) {\n"
1056 "case 1:\n"
1057 " x = 8;\n"
1058 " // fall through\n"
1059 "case 2: x = 8;\n"
1060 "// comment\n"
1061 "case 3:\n"
1062 " return; /* comment line 1\n"
1063 " * comment line 2 */\n"
1064 "case 4: i = 8;\n"
1065 "// something else\n"
1066 "#if FOO\n"
1067 "case 5: break;\n"
1068 "#endif\n"
1069 "}",
1070 format("switch (a) {\n"
1071 "case 1: x = 8;\n"
1072 " // fall through\n"
1073 "case 2:\n"
1074 " x = 8;\n"
1075 "// comment\n"
1076 "case 3:\n"
1077 " return; /* comment line 1\n"
1078 " * comment line 2 */\n"
1079 "case 4:\n"
1080 " i = 8;\n"
1081 "// something else\n"
1082 "#if FOO\n"
1083 "case 5: break;\n"
1084 "#endif\n"
1085 "}",
1086 Style));
1087 EXPECT_EQ("switch (a) {\n" "case 0:\n"
1088 " return; // long long long long long long long long long long long long comment\n"
1089 " // line\n" "}",
1090 format("switch (a) {\n"
1091 "case 0: return; // long long long long long long long long long long long long comment line\n"
1092 "}",
1093 Style));
1094 EXPECT_EQ("switch (a) {\n"
1095 "case 0:\n"
1096 " return; /* long long long long long long long long long long long long comment\n"
1097 " line */\n"
1098 "}",
1099 format("switch (a) {\n"
1100 "case 0: return; /* long long long long long long long long long long long long comment line */\n"
1101 "}",
1102 Style));
1103 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +00001104 "#if FOO\n"
1105 "case 0: return 0;\n"
1106 "#endif\n"
1107 "}",
1108 Style);
1109 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001110 "case 1: {\n"
1111 "}\n"
1112 "case 2: {\n"
1113 " return;\n"
1114 "}\n"
1115 "case 3: {\n"
1116 " x = 1;\n"
1117 " return;\n"
1118 "}\n"
1119 "case 4:\n"
1120 " if (x)\n"
1121 " return;\n"
1122 "}",
1123 Style);
1124 Style.ColumnLimit = 21;
1125 verifyFormat("switch (a) {\n"
1126 "case 1: x = 1; break;\n"
1127 "case 2: return;\n"
1128 "case 3:\n"
1129 "case 4:\n"
1130 "case 5: return;\n"
1131 "default:\n"
1132 " y = 1;\n"
1133 " break;\n"
1134 "}",
1135 Style);
1136}
1137
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001138TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +00001139 verifyFormat("void f() {\n"
1140 " some_code();\n"
1141 "test_label:\n"
1142 " some_other_code();\n"
1143 " {\n"
1144 " some_more_code();\n"
1145 " another_label:\n"
1146 " some_more_code();\n"
1147 " }\n"
1148 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +00001149 verifyFormat("{\n"
1150 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00001151 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +00001152 " some_other_code();\n"
1153 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +00001154 verifyFormat("{\n"
1155 " some_code();\n"
1156 "test_label:;\n"
1157 " int i = 0;\n"
1158 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00001159}
1160
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001161//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001162// Tests for classes, namespaces, etc.
1163//===----------------------------------------------------------------------===//
1164
1165TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001166 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001167}
1168
1169TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1170 verifyFormat("class A {\n"
1171 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001172 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001173 "protected:\n"
1174 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001175 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001176 "};");
1177 verifyGoogleFormat("class A {\n"
1178 " public:\n"
1179 " protected:\n"
1180 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001181 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001182 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001183 verifyFormat("class A {\n"
1184 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001185 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001186 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001187 " void f2() {}\n"
1188 "protected slots:\n"
1189 " void f3() {}\n"
1190 "protected Q_SLOTS:\n"
1191 " void f4() {}\n"
1192 "private slots:\n"
1193 " void f5() {}\n"
1194 "private Q_SLOTS:\n"
1195 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001196 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001197 " void g1();\n"
1198 "Q_SIGNALS:\n"
1199 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001200 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001201
1202 // Don't interpret 'signals' the wrong way.
1203 verifyFormat("signals.set();");
1204 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001205 verifyFormat("{\n"
1206 " signals.set(); // This needs indentation.\n"
1207 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001208 verifyFormat("void f() {\n"
1209 "label:\n"
1210 " signals.baz();\n"
1211 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001212}
1213
Alexander Kornienkofd433362013-03-27 17:08:02 +00001214TEST_F(FormatTest, SeparatesLogicalBlocks) {
1215 EXPECT_EQ("class A {\n"
1216 "public:\n"
1217 " void f();\n"
1218 "\n"
1219 "private:\n"
1220 " void g() {}\n"
1221 " // test\n"
1222 "protected:\n"
1223 " int h;\n"
1224 "};",
1225 format("class A {\n"
1226 "public:\n"
1227 "void f();\n"
1228 "private:\n"
1229 "void g() {}\n"
1230 "// test\n"
1231 "protected:\n"
1232 "int h;\n"
1233 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001234 EXPECT_EQ("class A {\n"
1235 "protected:\n"
1236 "public:\n"
1237 " void f();\n"
1238 "};",
1239 format("class A {\n"
1240 "protected:\n"
1241 "\n"
1242 "public:\n"
1243 "\n"
1244 " void f();\n"
1245 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00001246
1247 // Even ensure proper spacing inside macros.
1248 EXPECT_EQ("#define B \\\n"
1249 " class A { \\\n"
1250 " protected: \\\n"
1251 " public: \\\n"
1252 " void f(); \\\n"
1253 " };",
1254 format("#define B \\\n"
1255 " class A { \\\n"
1256 " protected: \\\n"
1257 " \\\n"
1258 " public: \\\n"
1259 " \\\n"
1260 " void f(); \\\n"
1261 " };",
1262 getGoogleStyle()));
1263 // But don't remove empty lines after macros ending in access specifiers.
1264 EXPECT_EQ("#define A private:\n"
1265 "\n"
1266 "int i;",
1267 format("#define A private:\n"
1268 "\n"
1269 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00001270}
1271
Daniel Jasper83193602013-04-05 17:22:09 +00001272TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001273 verifyFormat("class A : public B {};");
1274 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001275
1276 verifyFormat(
1277 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001278 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001279 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1280 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001281 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001282 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001283 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001284 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1285 " public C,\n"
1286 " public D,\n"
1287 " public E,\n"
1288 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001289 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001290
1291 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001292 " ReallyReallyLongClassName {\n"
1293 " int i;\n"
1294 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001295 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001296 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1297 " aaaaaaaaaaaaaaaa> {};");
1298 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1299 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1300 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001301 verifyFormat("template <class R, class C>\n"
1302 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1303 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001304 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001305}
1306
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001307TEST_F(FormatTest, BreakBeforeInheritanceComma) {
1308 FormatStyle StyleWithInheritanceBreak = getLLVMStyle();
1309 StyleWithInheritanceBreak.BreakBeforeInheritanceComma = true;
1310
1311 verifyFormat("class MyClass : public X {};", StyleWithInheritanceBreak);
1312 verifyFormat("class MyClass\n"
1313 " : public X\n"
1314 " , public Y {};",
1315 StyleWithInheritanceBreak);
1316}
1317
Manuel Klimek28cacc72013-01-07 18:10:23 +00001318TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001319 verifyFormat("class A {\n} a, b;");
1320 verifyFormat("struct A {\n} a, b;");
1321 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001322}
1323
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001324TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001325 verifyFormat("enum {\n"
1326 " Zero,\n"
1327 " One = 1,\n"
1328 " Two = One + 1,\n"
1329 " Three = (One + Two),\n"
1330 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1331 " Five = (One, Two, Three, Four, 5)\n"
1332 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001333 verifyGoogleFormat("enum {\n"
1334 " Zero,\n"
1335 " One = 1,\n"
1336 " Two = One + 1,\n"
1337 " Three = (One + Two),\n"
1338 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1339 " Five = (One, Two, Three, Four, 5)\n"
1340 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001341 verifyFormat("enum Enum {};");
1342 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001343 verifyFormat("enum X E {} d;");
1344 verifyFormat("enum __attribute__((...)) E {} d;");
1345 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001346 verifyFormat("enum {\n"
1347 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001348 "};",
1349 getLLVMStyleWithColumns(30));
1350
1351 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001352 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001353
1354 EXPECT_EQ("enum KeepEmptyLines {\n"
1355 " ONE,\n"
1356 "\n"
1357 " TWO,\n"
1358 "\n"
1359 " THREE\n"
1360 "}",
1361 format("enum KeepEmptyLines {\n"
1362 " ONE,\n"
1363 "\n"
1364 " TWO,\n"
1365 "\n"
1366 "\n"
1367 " THREE\n"
1368 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001369 verifyFormat("enum E { // comment\n"
1370 " ONE,\n"
1371 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001372 "};\n"
1373 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001374 // Not enums.
1375 verifyFormat("enum X f() {\n"
1376 " a();\n"
1377 " return 42;\n"
1378 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001379 verifyFormat("enum X Type::f() {\n"
1380 " a();\n"
1381 " return 42;\n"
1382 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001383 verifyFormat("enum ::X f() {\n"
1384 " a();\n"
1385 " return 42;\n"
1386 "}");
1387 verifyFormat("enum ns::X f() {\n"
1388 " a();\n"
1389 " return 42;\n"
1390 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001391}
1392
Daniel Jasperb7150872013-08-30 10:10:19 +00001393TEST_F(FormatTest, FormatsEnumsWithErrors) {
1394 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001395 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001396 " Two = 1;\n"
1397 "};");
1398 verifyFormat("namespace n {\n"
1399 "enum Type {\n"
1400 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001401 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001402 " int i;\n"
1403 "}\n"
1404 "void g() {}");
1405}
1406
Daniel Jasper2b41a822013-08-20 12:42:50 +00001407TEST_F(FormatTest, FormatsEnumStruct) {
1408 verifyFormat("enum struct {\n"
1409 " Zero,\n"
1410 " One = 1,\n"
1411 " Two = One + 1,\n"
1412 " Three = (One + Two),\n"
1413 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1414 " Five = (One, Two, Three, Four, 5)\n"
1415 "};");
1416 verifyFormat("enum struct Enum {};");
1417 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001418 verifyFormat("enum struct X E {} d;");
1419 verifyFormat("enum struct __attribute__((...)) E {} d;");
1420 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001421 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1422}
1423
1424TEST_F(FormatTest, FormatsEnumClass) {
1425 verifyFormat("enum class {\n"
1426 " Zero,\n"
1427 " One = 1,\n"
1428 " Two = One + 1,\n"
1429 " Three = (One + Two),\n"
1430 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1431 " Five = (One, Two, Three, Four, 5)\n"
1432 "};");
1433 verifyFormat("enum class Enum {};");
1434 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001435 verifyFormat("enum class X E {} d;");
1436 verifyFormat("enum class __attribute__((...)) E {} d;");
1437 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001438 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1439}
1440
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001441TEST_F(FormatTest, FormatsEnumTypes) {
1442 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001443 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001444 " B\n"
1445 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001446 verifyFormat("enum X : int { A, B };");
1447 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001448}
1449
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001450TEST_F(FormatTest, FormatsTypedefEnum) {
1451 FormatStyle Style = getLLVMStyle();
1452 Style.ColumnLimit = 40;
1453 verifyFormat("typedef enum {} EmptyEnum;");
1454 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1455 verifyFormat("typedef enum {\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001456 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001457 " ONE = 1,\n"
1458 " TWO = 2,\n"
1459 " THREE = 3\n"
1460 "} LongEnum;",
1461 Style);
1462 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1463 Style.BraceWrapping.AfterEnum = true;
1464 verifyFormat("typedef enum {} EmptyEnum;");
1465 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1466 verifyFormat("typedef enum\n"
1467 "{\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001468 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001469 " ONE = 1,\n"
1470 " TWO = 2,\n"
1471 " THREE = 3\n"
1472 "} LongEnum;",
1473 Style);
1474}
1475
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001476TEST_F(FormatTest, FormatsNSEnums) {
1477 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1478 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1479 " // Information about someDecentlyLongValue.\n"
1480 " someDecentlyLongValue,\n"
1481 " // Information about anotherDecentlyLongValue.\n"
1482 " anotherDecentlyLongValue,\n"
1483 " // Information about aThirdDecentlyLongValue.\n"
1484 " aThirdDecentlyLongValue\n"
1485 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001486 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1487 " a = 1,\n"
1488 " b = 2,\n"
1489 " c = 3,\n"
1490 "};");
1491 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1492 " a = 1,\n"
1493 " b = 2,\n"
1494 " c = 3,\n"
1495 "};");
1496 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1497 " a = 1,\n"
1498 " b = 2,\n"
1499 " c = 3,\n"
1500 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001501}
1502
Nico Weber7769a902013-01-14 05:49:49 +00001503TEST_F(FormatTest, FormatsBitfields) {
1504 verifyFormat("struct Bitfields {\n"
1505 " unsigned sClass : 8;\n"
1506 " unsigned ValueKind : 2;\n"
1507 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001508 verifyFormat("struct A {\n"
1509 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1510 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1511 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001512 verifyFormat("struct MyStruct {\n"
1513 " uchar data;\n"
1514 " uchar : 8;\n"
1515 " uchar : 8;\n"
1516 " uchar other;\n"
1517 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001518}
1519
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001520TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001521 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1522 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1523
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001524 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001525 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001526 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001527 "}",
1528 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001529 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001530 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001531 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001532 "}",
1533 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001534 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001535 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001536 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001537 "}",
1538 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001539 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001540 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001541 "void f() { f(); }",
1542 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001543
1544 // This code is more common than we thought; if we
1545 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001546 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001547 verifyFormat("namespace {};",
1548 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001549 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001550 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001551 "};",
1552 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001553
1554 verifyFormat("namespace {\n"
1555 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001556 "} // namespace",
1557 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001558 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1559 "#define HEADER_GUARD\n"
1560 "namespace my_namespace {\n"
1561 "int i;\n"
1562 "} // my_namespace\n"
1563 "#endif // HEADER_GUARD",
1564 format("#ifndef HEADER_GUARD\n"
1565 " #define HEADER_GUARD\n"
1566 " namespace my_namespace {\n"
1567 "int i;\n"
1568 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001569 "#endif // HEADER_GUARD",
1570 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001571
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001572 EXPECT_EQ("namespace A::B {\n"
1573 "class C {};\n"
1574 "}",
1575 format("namespace A::B {\n"
1576 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001577 "}",
1578 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001579
Daniel Jasper65ee3472013-07-31 23:16:02 +00001580 FormatStyle Style = getLLVMStyle();
1581 Style.NamespaceIndentation = FormatStyle::NI_All;
1582 EXPECT_EQ("namespace out {\n"
1583 " int i;\n"
1584 " namespace in {\n"
1585 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001586 " } // namespace in\n"
1587 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001588 format("namespace out {\n"
1589 "int i;\n"
1590 "namespace in {\n"
1591 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001592 "} // namespace in\n"
1593 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001594 Style));
1595
1596 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1597 EXPECT_EQ("namespace out {\n"
1598 "int i;\n"
1599 "namespace in {\n"
1600 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001601 "} // namespace in\n"
1602 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001603 format("namespace out {\n"
1604 "int i;\n"
1605 "namespace in {\n"
1606 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001607 "} // namespace in\n"
1608 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001609 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001610}
1611
Francois Ferrande56a8292017-06-14 12:29:47 +00001612TEST_F(FormatTest, FormatsCompactNamespaces) {
1613 FormatStyle Style = getLLVMStyle();
1614 Style.CompactNamespaces = true;
1615
1616 verifyFormat("namespace A { namespace B {\n"
1617 "}} // namespace A::B",
1618 Style);
1619
1620 EXPECT_EQ("namespace out { namespace in {\n"
1621 "}} // namespace out::in",
1622 format("namespace out {\n"
1623 "namespace in {\n"
1624 "} // namespace in\n"
1625 "} // namespace out",
1626 Style));
1627
1628 // Only namespaces which have both consecutive opening and end get compacted
1629 EXPECT_EQ("namespace out {\n"
1630 "namespace in1 {\n"
1631 "} // namespace in1\n"
1632 "namespace in2 {\n"
1633 "} // namespace in2\n"
1634 "} // namespace out",
1635 format("namespace out {\n"
1636 "namespace in1 {\n"
1637 "} // namespace in1\n"
1638 "namespace in2 {\n"
1639 "} // namespace in2\n"
1640 "} // namespace out",
1641 Style));
1642
1643 EXPECT_EQ("namespace out {\n"
1644 "int i;\n"
1645 "namespace in {\n"
1646 "int j;\n"
1647 "} // namespace in\n"
1648 "int k;\n"
1649 "} // namespace out",
1650 format("namespace out { int i;\n"
1651 "namespace in { int j; } // namespace in\n"
1652 "int k; } // namespace out",
1653 Style));
1654
1655 EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1656 "}}} // namespace A::B::C\n",
1657 format("namespace A { namespace B {\n"
1658 "namespace C {\n"
1659 "}} // namespace B::C\n"
1660 "} // namespace A\n",
1661 Style));
1662
1663 Style.ColumnLimit = 40;
1664 EXPECT_EQ("namespace aaaaaaaaaa {\n"
1665 "namespace bbbbbbbbbb {\n"
1666 "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1667 format("namespace aaaaaaaaaa {\n"
1668 "namespace bbbbbbbbbb {\n"
1669 "} // namespace bbbbbbbbbb\n"
1670 "} // namespace aaaaaaaaaa",
1671 Style));
1672
1673 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1674 "namespace cccccc {\n"
1675 "}}} // namespace aaaaaa::bbbbbb::cccccc",
1676 format("namespace aaaaaa {\n"
1677 "namespace bbbbbb {\n"
1678 "namespace cccccc {\n"
1679 "} // namespace cccccc\n"
1680 "} // namespace bbbbbb\n"
1681 "} // namespace aaaaaa",
1682 Style));
1683 Style.ColumnLimit = 80;
1684
1685 // Extra semicolon after 'inner' closing brace prevents merging
1686 EXPECT_EQ("namespace out { namespace in {\n"
1687 "}; } // namespace out::in",
1688 format("namespace out {\n"
1689 "namespace in {\n"
1690 "}; // namespace in\n"
1691 "} // namespace out",
1692 Style));
1693
1694 // Extra semicolon after 'outer' closing brace is conserved
1695 EXPECT_EQ("namespace out { namespace in {\n"
1696 "}}; // namespace out::in",
1697 format("namespace out {\n"
1698 "namespace in {\n"
1699 "} // namespace in\n"
1700 "}; // namespace out",
1701 Style));
1702
1703 Style.NamespaceIndentation = FormatStyle::NI_All;
1704 EXPECT_EQ("namespace out { namespace in {\n"
1705 " int i;\n"
1706 "}} // namespace out::in",
1707 format("namespace out {\n"
1708 "namespace in {\n"
1709 "int i;\n"
1710 "} // namespace in\n"
1711 "} // namespace out",
1712 Style));
1713 EXPECT_EQ("namespace out { namespace mid {\n"
1714 " namespace in {\n"
1715 " int j;\n"
1716 " } // namespace in\n"
1717 " int k;\n"
1718 "}} // namespace out::mid",
1719 format("namespace out { namespace mid {\n"
1720 "namespace in { int j; } // namespace in\n"
1721 "int k; }} // namespace out::mid",
1722 Style));
1723
1724 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1725 EXPECT_EQ("namespace out { namespace in {\n"
1726 " int i;\n"
1727 "}} // namespace out::in",
1728 format("namespace out {\n"
1729 "namespace in {\n"
1730 "int i;\n"
1731 "} // namespace in\n"
1732 "} // namespace out",
1733 Style));
1734 EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1735 " int i;\n"
1736 "}}} // namespace out::mid::in",
1737 format("namespace out {\n"
1738 "namespace mid {\n"
1739 "namespace in {\n"
1740 "int i;\n"
1741 "} // namespace in\n"
1742 "} // namespace mid\n"
1743 "} // namespace out",
1744 Style));
1745}
1746
Krasimir Georgievd6ce9372017-09-15 11:23:50 +00001747TEST_F(FormatTest, FormatsExternC) {
1748 verifyFormat("extern \"C\" {\nint a;");
1749 verifyFormat("extern \"C\" {}");
1750 verifyFormat("extern \"C\" {\n"
1751 "int foo();\n"
1752 "}");
1753 verifyFormat("extern \"C\" int foo() {}");
1754 verifyFormat("extern \"C\" int foo();");
1755 verifyFormat("extern \"C\" int foo() {\n"
1756 " int i = 42;\n"
1757 " return i;\n"
1758 "}");
1759
1760 FormatStyle Style = getLLVMStyle();
1761 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1762 Style.BraceWrapping.AfterFunction = true;
1763 verifyFormat("extern \"C\" int foo() {}", Style);
1764 verifyFormat("extern \"C\" int foo();", Style);
1765 verifyFormat("extern \"C\" int foo()\n"
1766 "{\n"
1767 " int i = 42;\n"
1768 " return i;\n"
1769 "}",
1770 Style);
1771
1772 Style.BraceWrapping.AfterExternBlock = true;
1773 Style.BraceWrapping.SplitEmptyRecord = false;
1774 verifyFormat("extern \"C\"\n"
1775 "{}",
1776 Style);
1777 verifyFormat("extern \"C\"\n"
1778 "{\n"
1779 " int foo();\n"
1780 "}",
1781 Style);
1782}
Manuel Klimekae610d12013-01-21 14:32:05 +00001783
Daniel Jasper40aacf42013-03-14 13:45:21 +00001784TEST_F(FormatTest, FormatsInlineASM) {
1785 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001786 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001787 verifyFormat(
1788 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1789 " \"cpuid\\n\\t\"\n"
1790 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001791 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001792 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001793 EXPECT_EQ(
1794 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001795 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001796 " mov edx,[that] // vtable in edx\n"
1797 " mov eax,methodIndex\n"
1798 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001799 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001800 "}",
1801 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1802 " __asm {\n"
1803 " mov edx,[that] // vtable in edx\n"
1804 " mov eax,methodIndex\n"
1805 " call [edx][eax*4] // stdcall\n"
1806 " }\n"
1807 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001808 EXPECT_EQ("_asm {\n"
1809 " xor eax, eax;\n"
1810 " cpuid;\n"
1811 "}",
1812 format("_asm {\n"
1813 " xor eax, eax;\n"
1814 " cpuid;\n"
1815 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001816 verifyFormat("void function() {\n"
1817 " // comment\n"
1818 " asm(\"\");\n"
1819 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001820 EXPECT_EQ("__asm {\n"
1821 "}\n"
1822 "int i;",
1823 format("__asm {\n"
1824 "}\n"
1825 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001826}
1827
Nico Weberd5650bd2013-01-07 16:36:17 +00001828TEST_F(FormatTest, FormatTryCatch) {
1829 verifyFormat("try {\n"
1830 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001831 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001832 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001833 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001834 " exit(42);\n"
1835 "}");
1836
1837 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001838 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001839 " return 5;\n"
1840 "}");
1841 verifyFormat("class A {\n"
1842 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001843 " A() try : a(0) {\n"
1844 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001845 " throw;\n"
1846 " }\n"
1847 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001848
1849 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001850 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001851}
1852
Nico Weberfac23712015-02-04 15:26:27 +00001853TEST_F(FormatTest, FormatSEHTryCatch) {
1854 verifyFormat("__try {\n"
1855 " int a = b * c;\n"
1856 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1857 " // Do nothing.\n"
1858 "}");
1859
1860 verifyFormat("__try {\n"
1861 " int a = b * c;\n"
1862 "} __finally {\n"
1863 " // Do nothing.\n"
1864 "}");
1865
1866 verifyFormat("DEBUG({\n"
1867 " __try {\n"
1868 " } __finally {\n"
1869 " }\n"
1870 "});\n");
1871}
1872
Daniel Jasper04a71a42014-05-08 11:58:24 +00001873TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1874 verifyFormat("try {\n"
1875 " f();\n"
1876 "} catch {\n"
1877 " g();\n"
1878 "}");
1879 verifyFormat("try {\n"
1880 " f();\n"
1881 "} catch (A a) MACRO(x) {\n"
1882 " g();\n"
1883 "} catch (B b) MACRO(x) {\n"
1884 " g();\n"
1885 "}");
1886}
1887
1888TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1889 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001890 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1891 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001892 Style.BreakBeforeBraces = BraceStyle;
1893 verifyFormat("try {\n"
1894 " // something\n"
1895 "} catch (...) {\n"
1896 " // something\n"
1897 "}",
1898 Style);
1899 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001900 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1901 verifyFormat("try {\n"
1902 " // something\n"
1903 "}\n"
1904 "catch (...) {\n"
1905 " // something\n"
1906 "}",
1907 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001908 verifyFormat("__try {\n"
1909 " // something\n"
1910 "}\n"
1911 "__finally {\n"
1912 " // something\n"
1913 "}",
1914 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001915 verifyFormat("@try {\n"
1916 " // something\n"
1917 "}\n"
1918 "@finally {\n"
1919 " // something\n"
1920 "}",
1921 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001922 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1923 verifyFormat("try\n"
1924 "{\n"
1925 " // something\n"
1926 "}\n"
1927 "catch (...)\n"
1928 "{\n"
1929 " // something\n"
1930 "}",
1931 Style);
1932 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1933 verifyFormat("try\n"
1934 " {\n"
1935 " // something\n"
1936 " }\n"
1937 "catch (...)\n"
1938 " {\n"
1939 " // something\n"
1940 " }",
1941 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001942 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1943 Style.BraceWrapping.BeforeCatch = true;
1944 verifyFormat("try {\n"
1945 " // something\n"
1946 "}\n"
1947 "catch (...) {\n"
1948 " // something\n"
1949 "}",
1950 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001951}
1952
Daniel Jaspere25509f2012-12-17 11:29:41 +00001953TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001954 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001955
Daniel Jaspera44991332015-04-29 13:06:49 +00001956 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1957 " 100000000, "
1958 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001959
Daniel Jasper473c62c2013-05-17 09:35:01 +00001960 // Here, everything other than the "}" would fit on a line.
1961 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001962 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001963 EXPECT_EQ("S s = {a,\n"
1964 "\n"
1965 " b};",
1966 format("S s = {\n"
1967 " a,\n"
1968 "\n"
1969 " b\n"
1970 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001971
1972 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1973 // line. However, the formatting looks a bit off and this probably doesn't
1974 // happen often in practice.
1975 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001976 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001977 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001978}
1979
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001980TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001981 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1982 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1983 " .bbbbbbbbbb = 2,\n"
1984 " .cccccccccc = 3,\n"
1985 " .dddddddddd = 4,\n"
1986 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001987 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001988 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1989 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1990 " .ccccccccccccccccccccccccccc = 3,\n"
1991 " .ddddddddddddddddddddddddddd = 4,\n"
1992 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001993
1994 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00001995
1996 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
1997 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
1998 " [2] = bbbbbbbbbb,\n"
1999 " [3] = cccccccccc,\n"
2000 " [4] = dddddddddd,\n"
2001 " [5] = eeeeeeeeee};");
2002 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2003 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2004 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2005 " [3] = cccccccccccccccccccccccccccccccccccccc,\n"
2006 " [4] = dddddddddddddddddddddddddddddddddddddd,\n"
2007 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002008}
2009
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002010TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002011 verifyFormat("static A x = {{{}}};\n");
2012 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2013 " {init1, init2, init3, init4}}};",
2014 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00002015
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002016 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002017 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2018 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2019 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2020 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00002021 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002022 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2023 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2024 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00002025 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2026 " {rect.fRight - rect.fLeft, rect.fBottom - "
2027 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002028
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002029 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00002030 "SomeArrayOfSomeType a = {\n"
2031 " {{1, 2, 3},\n"
2032 " {1, 2, 3},\n"
2033 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
2034 " 333333333333333333333333333333},\n"
2035 " {1, 2, 3},\n"
2036 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00002037 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00002038 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002039 " {{1, 2, 3}},\n"
2040 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002041 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2042 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002043 " {{1, 2, 3}},\n"
2044 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002045
Daniel Jaspera44991332015-04-29 13:06:49 +00002046 verifyFormat("struct {\n"
2047 " unsigned bit;\n"
2048 " const char *const name;\n"
2049 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2050 " {kOsWin, \"Windows\"},\n"
2051 " {kOsLinux, \"Linux\"},\n"
2052 " {kOsCrOS, \"Chrome OS\"}};");
2053 verifyFormat("struct {\n"
2054 " unsigned bit;\n"
2055 " const char *const name;\n"
2056 "} kBitsToOs[] = {\n"
2057 " {kOsMac, \"Mac\"},\n"
2058 " {kOsWin, \"Windows\"},\n"
2059 " {kOsLinux, \"Linux\"},\n"
2060 " {kOsCrOS, \"Chrome OS\"},\n"
2061 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002062}
2063
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002064TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2065 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2066 " \\\n"
2067 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2068}
2069
Daniel Jasperda16db32013-01-07 10:48:50 +00002070TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002071 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2072 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00002073
2074 // Do break defaulted and deleted functions.
2075 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2076 " default;",
2077 getLLVMStyleWithColumns(40));
2078 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2079 " delete;",
2080 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002081}
2082
2083TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2084 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2085 getLLVMStyleWithColumns(40));
2086 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2087 getLLVMStyleWithColumns(40));
2088 EXPECT_EQ("#define Q \\\n"
2089 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
2090 " \"aaaaaaaa.cpp\"",
2091 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2092 getLLVMStyleWithColumns(40)));
2093}
2094
2095TEST_F(FormatTest, UnderstandsLinePPDirective) {
2096 EXPECT_EQ("# 123 \"A string literal\"",
2097 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00002098}
2099
Manuel Klimek591b5802013-01-31 15:58:48 +00002100TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00002101 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00002102 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002103}
2104
2105TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2106 EXPECT_EQ("#line 42 \"test\"\n",
2107 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002108 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
2109 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002110}
2111
2112TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2113 EXPECT_EQ("#line 42 \"test\"",
2114 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002115 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002116}
2117
Daniel Jasper877615c2013-10-11 19:45:02 +00002118TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2119 verifyFormat("#define A \\x20");
2120 verifyFormat("#define A \\ x20");
2121 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
2122 verifyFormat("#define A ''");
2123 verifyFormat("#define A ''qqq");
2124 verifyFormat("#define A `qqq");
2125 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00002126 EXPECT_EQ("const char *c = STRINGIFY(\n"
2127 "\\na : b);",
2128 format("const char * c = STRINGIFY(\n"
2129 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00002130
2131 verifyFormat("a\r\\");
2132 verifyFormat("a\v\\");
2133 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00002134}
2135
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002136TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002137 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2138 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002139 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002140 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00002141 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00002142
2143 verifyFormat("#define A A\n#define A A");
2144 verifyFormat("#define A(X) A\n#define A A");
2145
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002146 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2147 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002148}
2149
2150TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002151 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002152 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002153 "#define A( \\\n"
2154 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002155 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002156 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002157 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002158 " #include \"a.h\"\n"
2159 "#define A(A,\\\n"
2160 " B)\n"
2161 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002162 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002163 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002164}
2165
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002166TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002167
2168TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2169 EXPECT_EQ("#define A \\\n"
2170 " c; \\\n"
2171 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002172 "f;",
2173 format("#define A c; e;\n"
2174 "f;",
2175 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002176}
2177
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002178TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002179
Manuel Klimek1abf7892013-01-04 23:34:14 +00002180TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002181 EXPECT_EQ("int x,\n"
2182 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002183 " y;",
2184 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002185}
2186
Manuel Klimek09e07972013-01-05 21:34:55 +00002187TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002188 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002189 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002190 verifyFormat("#define A \\\n"
2191 " { \\\n"
2192 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002193 " }",
2194 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002195
2196 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002197 " void function##X()",
2198 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002199
2200 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002201 " void a##b##c()",
2202 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002203
Daniel Jasper39825ea2013-01-14 15:40:57 +00002204 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002205}
2206
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002207TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002208 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2209 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002210}
2211
Manuel Klimek0c137952013-02-11 12:33:24 +00002212TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2213 EXPECT_EQ("#define A b;", format("#define A \\\n"
2214 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002215 " b;",
2216 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002217 EXPECT_EQ("#define A \\\n"
2218 " \\\n"
2219 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002220 " b;",
2221 format("#define A \\\n"
2222 " \\\n"
2223 " a; \\\n"
2224 " b;",
2225 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002226 EXPECT_EQ("#define A \\\n"
2227 " a; \\\n"
2228 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002229 " b;",
2230 format("#define A \\\n"
2231 " a; \\\n"
2232 " \\\n"
2233 " b;",
2234 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002235}
2236
Daniel Jasper00475962013-02-19 17:14:38 +00002237TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002238 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002239 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002240 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002241 " case 2\n",
2242 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002243 verifyFormat("#define MACRO(a) \\\n"
2244 " if (a) \\\n"
2245 " f(); \\\n"
2246 " else \\\n"
2247 " g()",
2248 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002249 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002250 verifyIncompleteFormat("#define STR(x) #x\n"
2251 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002252 verifyFormat("#pragma omp threadprivate( \\\n"
2253 " y)), // expected-warning",
2254 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002255 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002256 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002257 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002258 "#define b \\\n"
2259 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002260 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002261 "a",
2262 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002263 verifyFormat("#define A \\\n"
2264 " { \\\n"
2265 " {\n"
2266 "#define B \\\n"
2267 " } \\\n"
2268 " }",
2269 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002270 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002271 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002272 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002273 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002274}
2275
Daniel Jasper40e19212013-05-29 13:16:10 +00002276TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2277 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2278 EXPECT_EQ("class A : public QObject {\n"
2279 " Q_OBJECT\n"
2280 "\n"
2281 " A() {}\n"
2282 "};",
2283 format("class A : public QObject {\n"
2284 " Q_OBJECT\n"
2285 "\n"
2286 " A() {\n}\n"
2287 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002288 EXPECT_EQ("MACRO\n"
2289 "/*static*/ int i;",
2290 format("MACRO\n"
2291 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002292 EXPECT_EQ("SOME_MACRO\n"
2293 "namespace {\n"
2294 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002295 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00002296 format("SOME_MACRO\n"
2297 " namespace {\n"
2298 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002299 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002300 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002301 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2302 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002303 // Only if everything is upper case.
2304 EXPECT_EQ("class A : public QObject {\n"
2305 " Q_Object A() {}\n"
2306 "};",
2307 format("class A : public QObject {\n"
2308 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002309 " A() {\n}\n"
2310 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002311
2312 // Only if the next line can actually start an unwrapped line.
2313 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2314 format("SOME_WEIRD_LOG_MACRO\n"
2315 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002316
2317 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002318 "(n, buffers))\n",
2319 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002320}
2321
Alexander Kornienkode644272013-04-08 22:16:06 +00002322TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2323 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2324 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2325 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002326 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002327 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2328 "int *createScopDetectionPass() { return 0; }",
2329 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2330 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2331 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2332 " class X {};\n"
2333 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2334 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002335 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2336 // braces, so that inner block is indented one level more.
2337 EXPECT_EQ("int q() {\n"
2338 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2339 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2340 " IPC_END_MESSAGE_MAP()\n"
2341 "}",
2342 format("int q() {\n"
2343 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2344 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2345 " IPC_END_MESSAGE_MAP()\n"
2346 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002347
Daniel Jasper352dae12014-01-03 11:50:46 +00002348 // Same inside macros.
2349 EXPECT_EQ("#define LIST(L) \\\n"
2350 " L(A) \\\n"
2351 " L(B) \\\n"
2352 " L(C)",
2353 format("#define LIST(L) \\\n"
2354 " L(A) \\\n"
2355 " L(B) \\\n"
2356 " L(C)",
2357 getGoogleStyle()));
2358
Daniel Jasper545c6522013-09-17 09:26:07 +00002359 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002360 EXPECT_EQ("int q() {\n"
2361 " f(x);\n"
2362 " f(x) {}\n"
2363 " f(x)->g();\n"
2364 " f(x)->*g();\n"
2365 " f(x).g();\n"
2366 " f(x) = x;\n"
2367 " f(x) += x;\n"
2368 " f(x) -= x;\n"
2369 " f(x) *= x;\n"
2370 " f(x) /= x;\n"
2371 " f(x) %= x;\n"
2372 " f(x) &= x;\n"
2373 " f(x) |= x;\n"
2374 " f(x) ^= x;\n"
2375 " f(x) >>= x;\n"
2376 " f(x) <<= x;\n"
2377 " f(x)[y].z();\n"
2378 " LOG(INFO) << x;\n"
2379 " ifstream(x) >> x;\n"
2380 "}\n",
2381 format("int q() {\n"
2382 " f(x)\n;\n"
2383 " f(x)\n {}\n"
2384 " f(x)\n->g();\n"
2385 " f(x)\n->*g();\n"
2386 " f(x)\n.g();\n"
2387 " f(x)\n = x;\n"
2388 " f(x)\n += x;\n"
2389 " f(x)\n -= x;\n"
2390 " f(x)\n *= x;\n"
2391 " f(x)\n /= x;\n"
2392 " f(x)\n %= x;\n"
2393 " f(x)\n &= x;\n"
2394 " f(x)\n |= x;\n"
2395 " f(x)\n ^= x;\n"
2396 " f(x)\n >>= x;\n"
2397 " f(x)\n <<= x;\n"
2398 " f(x)\n[y].z();\n"
2399 " LOG(INFO)\n << x;\n"
2400 " ifstream(x)\n >> x;\n"
2401 "}\n"));
2402 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002403 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002404 " if (1) {\n"
2405 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002406 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002407 " while (1) {\n"
2408 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002409 " F(x)\n"
2410 " G(x);\n"
2411 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002412 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002413 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002414 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002415 " }\n"
2416 "}\n",
2417 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002418 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002419 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002420 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002421 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002422 "F(x)\n"
2423 "G(x);\n"
2424 "F(x)\n"
2425 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002426 "}\n"));
2427 EXPECT_EQ("class A {\n"
2428 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002429 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002430 " A(X x)\n" // FIXME: function-level try blocks are broken.
2431 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002432 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002433 " }\n"
2434 "};",
2435 format("class A {\n"
2436 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002437 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002438 " A(X x)\n"
2439 " try : t(0) {} catch (...) {}\n"
2440 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002441 EXPECT_EQ("class SomeClass {\n"
2442 "public:\n"
2443 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2444 "};",
2445 format("class SomeClass {\n"
2446 "public:\n"
2447 " SomeClass()\n"
2448 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2449 "};"));
2450 EXPECT_EQ("class SomeClass {\n"
2451 "public:\n"
2452 " SomeClass()\n"
2453 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2454 "};",
2455 format("class SomeClass {\n"
2456 "public:\n"
2457 " SomeClass()\n"
2458 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2459 "};",
2460 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002461
2462 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002463}
2464
Manuel Klimek4fe43002013-05-22 12:51:29 +00002465TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2466 verifyFormat("#define A \\\n"
2467 " f({ \\\n"
2468 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002469 " });",
2470 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002471}
2472
Krasimir Georgievad47c902017-08-30 14:34:57 +00002473TEST_F(FormatTest, IndentPreprocessorDirectives) {
2474 FormatStyle Style = getLLVMStyle();
2475 Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2476 Style.ColumnLimit = 40;
2477 verifyFormat("#ifdef _WIN32\n"
2478 "#define A 0\n"
2479 "#ifdef VAR2\n"
2480 "#define B 1\n"
2481 "#include <someheader.h>\n"
2482 "#define MACRO \\\n"
2483 " some_very_long_func_aaaaaaaaaa();\n"
2484 "#endif\n"
2485 "#else\n"
2486 "#define A 1\n"
2487 "#endif",
2488 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002489 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2490 verifyFormat("#ifdef _WIN32\n"
2491 "# define A 0\n"
2492 "# ifdef VAR2\n"
2493 "# define B 1\n"
2494 "# include <someheader.h>\n"
2495 "# define MACRO \\\n"
2496 " some_very_long_func_aaaaaaaaaa();\n"
2497 "# endif\n"
2498 "#else\n"
2499 "# define A 1\n"
2500 "#endif",
2501 Style);
2502 verifyFormat("#if A\n"
2503 "# define MACRO \\\n"
2504 " void a(int x) { \\\n"
2505 " b(); \\\n"
2506 " c(); \\\n"
2507 " d(); \\\n"
2508 " e(); \\\n"
2509 " f(); \\\n"
2510 " }\n"
2511 "#endif",
2512 Style);
2513 // Comments before include guard.
2514 verifyFormat("// file comment\n"
2515 "// file comment\n"
2516 "#ifndef HEADER_H\n"
2517 "#define HEADER_H\n"
2518 "code();\n"
2519 "#endif",
2520 Style);
2521 // Test with include guards.
Krasimir Georgievad47c902017-08-30 14:34:57 +00002522 verifyFormat("#ifndef HEADER_H\n"
2523 "#define HEADER_H\n"
2524 "code();\n"
2525 "#endif",
2526 Style);
2527 // Include guards must have a #define with the same variable immediately
2528 // after #ifndef.
2529 verifyFormat("#ifndef NOT_GUARD\n"
2530 "# define FOO\n"
2531 "code();\n"
2532 "#endif",
2533 Style);
2534
2535 // Include guards must cover the entire file.
2536 verifyFormat("code();\n"
2537 "code();\n"
2538 "#ifndef NOT_GUARD\n"
2539 "# define NOT_GUARD\n"
2540 "code();\n"
2541 "#endif",
2542 Style);
2543 verifyFormat("#ifndef NOT_GUARD\n"
2544 "# define NOT_GUARD\n"
2545 "code();\n"
2546 "#endif\n"
2547 "code();",
2548 Style);
2549 // Test with trailing blank lines.
2550 verifyFormat("#ifndef HEADER_H\n"
2551 "#define HEADER_H\n"
2552 "code();\n"
2553 "#endif\n",
2554 Style);
2555 // Include guards don't have #else.
2556 verifyFormat("#ifndef NOT_GUARD\n"
2557 "# define NOT_GUARD\n"
2558 "code();\n"
2559 "#else\n"
2560 "#endif",
2561 Style);
2562 verifyFormat("#ifndef NOT_GUARD\n"
2563 "# define NOT_GUARD\n"
2564 "code();\n"
2565 "#elif FOO\n"
2566 "#endif",
2567 Style);
Mark Zeren1c3afaf2018-02-05 15:59:00 +00002568 // Non-identifier #define after potential include guard.
2569 verifyFormat("#ifndef FOO\n"
2570 "# define 1\n"
2571 "#endif\n",
2572 Style);
2573 // #if closes past last non-preprocessor line.
2574 verifyFormat("#ifndef FOO\n"
2575 "#define FOO\n"
2576 "#if 1\n"
2577 "int i;\n"
2578 "# define A 0\n"
2579 "#endif\n"
2580 "#endif\n",
2581 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002582 // FIXME: This doesn't handle the case where there's code between the
2583 // #ifndef and #define but all other conditions hold. This is because when
2584 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2585 // previous code line yet, so we can't detect it.
2586 EXPECT_EQ("#ifndef NOT_GUARD\n"
2587 "code();\n"
2588 "#define NOT_GUARD\n"
2589 "code();\n"
2590 "#endif",
2591 format("#ifndef NOT_GUARD\n"
2592 "code();\n"
2593 "# define NOT_GUARD\n"
2594 "code();\n"
2595 "#endif",
2596 Style));
2597 // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2598 // be outside an include guard. Examples are #pragma once and
2599 // #pragma GCC diagnostic, or anything else that does not change the meaning
2600 // of the file if it's included multiple times.
2601 EXPECT_EQ("#ifdef WIN32\n"
2602 "# pragma once\n"
2603 "#endif\n"
2604 "#ifndef HEADER_H\n"
2605 "# define HEADER_H\n"
2606 "code();\n"
2607 "#endif",
2608 format("#ifdef WIN32\n"
2609 "# pragma once\n"
2610 "#endif\n"
2611 "#ifndef HEADER_H\n"
2612 "#define HEADER_H\n"
2613 "code();\n"
2614 "#endif",
2615 Style));
2616 // FIXME: This does not detect when there is a single non-preprocessor line
2617 // in front of an include-guard-like structure where other conditions hold
2618 // because ScopedLineState hides the line.
2619 EXPECT_EQ("code();\n"
2620 "#ifndef HEADER_H\n"
2621 "#define HEADER_H\n"
2622 "code();\n"
2623 "#endif",
2624 format("code();\n"
2625 "#ifndef HEADER_H\n"
2626 "# define HEADER_H\n"
2627 "code();\n"
2628 "#endif",
2629 Style));
Mark Zerend2b2ac62018-01-31 20:05:50 +00002630 // Keep comments aligned with #, otherwise indent comments normally. These
2631 // tests cannot use verifyFormat because messUp manipulates leading
2632 // whitespace.
2633 {
2634 const char *Expected = ""
2635 "void f() {\n"
2636 "#if 1\n"
2637 "// Preprocessor aligned.\n"
2638 "# define A 0\n"
2639 " // Code. Separated by blank line.\n"
2640 "\n"
2641 "# define B 0\n"
2642 " // Code. Not aligned with #\n"
2643 "# define C 0\n"
2644 "#endif";
2645 const char *ToFormat = ""
2646 "void f() {\n"
2647 "#if 1\n"
2648 "// Preprocessor aligned.\n"
2649 "# define A 0\n"
2650 "// Code. Separated by blank line.\n"
2651 "\n"
2652 "# define B 0\n"
2653 " // Code. Not aligned with #\n"
2654 "# define C 0\n"
2655 "#endif";
2656 EXPECT_EQ(Expected, format(ToFormat, Style));
2657 EXPECT_EQ(Expected, format(Expected, Style));
2658 }
2659 // Keep block quotes aligned.
2660 {
2661 const char *Expected = ""
2662 "void f() {\n"
2663 "#if 1\n"
2664 "/* Preprocessor aligned. */\n"
2665 "# define A 0\n"
2666 " /* Code. Separated by blank line. */\n"
2667 "\n"
2668 "# define B 0\n"
2669 " /* Code. Not aligned with # */\n"
2670 "# define C 0\n"
2671 "#endif";
2672 const char *ToFormat = ""
2673 "void f() {\n"
2674 "#if 1\n"
2675 "/* Preprocessor aligned. */\n"
2676 "# define A 0\n"
2677 "/* Code. Separated by blank line. */\n"
2678 "\n"
2679 "# define B 0\n"
2680 " /* Code. Not aligned with # */\n"
2681 "# define C 0\n"
2682 "#endif";
2683 EXPECT_EQ(Expected, format(ToFormat, Style));
2684 EXPECT_EQ(Expected, format(Expected, Style));
2685 }
2686 // Keep comments aligned with un-indented directives.
2687 {
2688 const char *Expected = ""
2689 "void f() {\n"
2690 "// Preprocessor aligned.\n"
2691 "#define A 0\n"
2692 " // Code. Separated by blank line.\n"
2693 "\n"
2694 "#define B 0\n"
2695 " // Code. Not aligned with #\n"
2696 "#define C 0\n";
2697 const char *ToFormat = ""
2698 "void f() {\n"
2699 "// Preprocessor aligned.\n"
2700 "#define A 0\n"
2701 "// Code. Separated by blank line.\n"
2702 "\n"
2703 "#define B 0\n"
2704 " // Code. Not aligned with #\n"
2705 "#define C 0\n";
2706 EXPECT_EQ(Expected, format(ToFormat, Style));
2707 EXPECT_EQ(Expected, format(Expected, Style));
2708 }
Krasimir Georgievad47c902017-08-30 14:34:57 +00002709 // Test with tabs.
2710 Style.UseTab = FormatStyle::UT_Always;
2711 Style.IndentWidth = 8;
2712 Style.TabWidth = 8;
2713 verifyFormat("#ifdef _WIN32\n"
2714 "#\tdefine A 0\n"
2715 "#\tifdef VAR2\n"
2716 "#\t\tdefine B 1\n"
2717 "#\t\tinclude <someheader.h>\n"
2718 "#\t\tdefine MACRO \\\n"
2719 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
2720 "#\tendif\n"
2721 "#else\n"
2722 "#\tdefine A 1\n"
2723 "#endif",
2724 Style);
Daniel Jasper4df130f2017-09-04 13:33:52 +00002725
2726 // Regression test: Multiline-macro inside include guards.
2727 verifyFormat("#ifndef HEADER_H\n"
2728 "#define HEADER_H\n"
2729 "#define A() \\\n"
2730 " int i; \\\n"
2731 " int j;\n"
2732 "#endif // HEADER_H",
2733 getLLVMStyleWithColumns(20));
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002734}
2735
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002736TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002737 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002738}
2739
Manuel Klimek1058d982013-01-06 20:07:31 +00002740TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2741 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2742 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2743 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2744 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2745}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002746
Daniel Jaspere2408e32015-05-06 11:16:43 +00002747TEST_F(FormatTest, EscapedNewlines) {
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002748 FormatStyle Narrow = getLLVMStyleWithColumns(11);
2749 EXPECT_EQ("#define A \\\n int i; \\\n int j;",
2750 format("#define A \\\nint i;\\\n int j;", Narrow));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002751 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002752 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002753 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002754 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002755
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002756 FormatStyle AlignLeft = getLLVMStyle();
2757 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
2758 EXPECT_EQ("#define MACRO(x) \\\n"
2759 "private: \\\n"
2760 " int x(int a);\n",
2761 format("#define MACRO(x) \\\n"
2762 "private: \\\n"
2763 " int x(int a);\n",
2764 AlignLeft));
2765
2766 // CRLF line endings
2767 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;",
2768 format("#define A \\\r\nint i;\\\r\n int j;", Narrow));
2769 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
2770 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
2771 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */"));
2772 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
2773 EXPECT_EQ("#define MACRO(x) \\\r\n"
2774 "private: \\\r\n"
2775 " int x(int a);\r\n",
2776 format("#define MACRO(x) \\\r\n"
2777 "private: \\\r\n"
2778 " int x(int a);\r\n",
2779 AlignLeft));
2780
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002781 FormatStyle DontAlign = getLLVMStyle();
2782 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
2783 DontAlign.MaxEmptyLinesToKeep = 3;
2784 // FIXME: can't use verifyFormat here because the newline before
2785 // "public:" is not inserted the first time it's reformatted
2786 EXPECT_EQ("#define A \\\n"
2787 " class Foo { \\\n"
2788 " void bar(); \\\n"
2789 "\\\n"
2790 "\\\n"
2791 "\\\n"
2792 " public: \\\n"
2793 " void baz(); \\\n"
2794 " };",
2795 format("#define A \\\n"
2796 " class Foo { \\\n"
2797 " void bar(); \\\n"
2798 "\\\n"
2799 "\\\n"
2800 "\\\n"
2801 " public: \\\n"
2802 " void baz(); \\\n"
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002803 " };",
2804 DontAlign));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002805}
2806
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002807TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2808 verifyFormat("#define A \\\n"
2809 " int v( \\\n"
2810 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002811 " int i;",
2812 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002813}
2814
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002815TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002816 EXPECT_EQ(
2817 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2818 " \\\n"
2819 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2820 "\n"
2821 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2822 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2823 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2824 "\\\n"
2825 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2826 " \n"
2827 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2828 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002829}
2830
Manuel Klimek52b15152013-01-09 15:25:02 +00002831TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2832 EXPECT_EQ("int\n"
2833 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002834 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002835 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002836 verifyFormat("functionCallTo(\n"
2837 " someOtherFunction(\n"
2838 " withSomeParameters, whichInSequence,\n"
2839 " areLongerThanALine(andAnotherCall,\n"
2840 "#define A B\n"
2841 " withMoreParamters,\n"
2842 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002843 " andMoreParameters),\n"
2844 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002845 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002846 verifyFormat("Foo::Foo()\n"
2847 "#ifdef BAR\n"
2848 " : baz(0)\n"
2849 "#endif\n"
2850 "{\n"
2851 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002852 verifyFormat("void f() {\n"
2853 " if (true)\n"
2854 "#ifdef A\n"
2855 " f(42);\n"
2856 " x();\n"
2857 "#else\n"
2858 " g();\n"
2859 " x();\n"
2860 "#endif\n"
2861 "}");
2862 verifyFormat("void f(param1, param2,\n"
2863 " param3,\n"
2864 "#ifdef A\n"
2865 " param4(param5,\n"
2866 "#ifdef A1\n"
2867 " param6,\n"
2868 "#ifdef A2\n"
2869 " param7),\n"
2870 "#else\n"
2871 " param8),\n"
2872 " param9,\n"
2873 "#endif\n"
2874 " param10,\n"
2875 "#endif\n"
2876 " param11)\n"
2877 "#else\n"
2878 " param12)\n"
2879 "#endif\n"
2880 "{\n"
2881 " x();\n"
2882 "}",
2883 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002884 verifyFormat("#if 1\n"
2885 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002886 verifyFormat("#if 1\n"
2887 "#endif\n"
2888 "#if 1\n"
2889 "#else\n"
2890 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002891 verifyFormat("DEBUG({\n"
2892 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2893 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2894 "});\n"
2895 "#if a\n"
2896 "#else\n"
2897 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002898
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002899 verifyIncompleteFormat("void f(\n"
2900 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00002901 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002902 "#else\n"
2903 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002904}
2905
Manuel Klimek14bd9172014-01-29 08:49:02 +00002906TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2907 verifyFormat("#endif\n"
2908 "#if B");
2909}
2910
Manuel Klimek88033d72013-10-21 08:11:15 +00002911TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2912 FormatStyle SingleLine = getLLVMStyle();
2913 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002914 verifyFormat("#if 0\n"
2915 "#elif 1\n"
2916 "#endif\n"
2917 "void foo() {\n"
2918 " if (test) foo2();\n"
2919 "}",
2920 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002921}
2922
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002923TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002924 verifyFormat("functionCall({ int i; });");
2925 verifyFormat("functionCall({\n"
2926 " int i;\n"
2927 " int j;\n"
2928 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002929 verifyFormat("functionCall(\n"
2930 " {\n"
2931 " int i;\n"
2932 " int j;\n"
2933 " },\n"
2934 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002935 verifyFormat("functionA(functionB({\n"
2936 " int i;\n"
2937 " int j;\n"
2938 " }),\n"
2939 " aaaa, bbbb, cccc);");
2940 verifyFormat("functionCall(\n"
2941 " {\n"
2942 " int i;\n"
2943 " int j;\n"
2944 " },\n"
2945 " aaaa, bbbb, // comment\n"
2946 " cccc);");
2947 verifyFormat("functionA(functionB({\n"
2948 " int i;\n"
2949 " int j;\n"
2950 " }),\n"
2951 " aaaa, bbbb, // comment\n"
2952 " cccc);");
2953 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2954 verifyFormat("functionCall(aaaa, bbbb, {\n"
2955 " int i;\n"
2956 " int j;\n"
2957 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002958 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002959 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002960 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002961 " int i; // break\n"
2962 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002963 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2964 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002965 verifyFormat("DEBUG({\n"
2966 " if (a)\n"
2967 " f();\n"
2968 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002969}
2970
2971TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002972 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002973 "int i;",
2974 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002975}
2976
2977TEST_F(FormatTest, LayoutNestedBlocks) {
2978 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2979 " struct s {\n"
2980 " int i;\n"
2981 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002982 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002983 " for (int i = 0; i < 10; ++i)\n"
2984 " return;\n"
2985 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002986 verifyFormat("call(parameter, {\n"
2987 " something();\n"
2988 " // Comment using all columns.\n"
2989 " somethingelse();\n"
2990 "});",
2991 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002992 verifyFormat("DEBUG( //\n"
2993 " { f(); }, a);");
2994 verifyFormat("DEBUG( //\n"
2995 " {\n"
2996 " f(); //\n"
2997 " },\n"
2998 " a);");
2999
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003000 EXPECT_EQ("call(parameter, {\n"
3001 " something();\n"
3002 " // Comment too\n"
3003 " // looooooooooong.\n"
3004 " somethingElse();\n"
3005 "});",
3006 format("call(parameter, {\n"
3007 " something();\n"
3008 " // Comment too looooooooooong.\n"
3009 " somethingElse();\n"
3010 "});",
3011 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003012 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003013 EXPECT_EQ("DEBUG({ // comment\n"
3014 " int i;\n"
3015 "});",
3016 format("DEBUG({ // comment\n"
3017 "int i;\n"
3018 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003019 EXPECT_EQ("DEBUG({\n"
3020 " int i;\n"
3021 "\n"
3022 " // comment\n"
3023 " int j;\n"
3024 "});",
3025 format("DEBUG({\n"
3026 " int i;\n"
3027 "\n"
3028 " // comment\n"
3029 " int j;\n"
3030 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003031
3032 verifyFormat("DEBUG({\n"
3033 " if (a)\n"
3034 " return;\n"
3035 "});");
3036 verifyGoogleFormat("DEBUG({\n"
3037 " if (a) return;\n"
3038 "});");
3039 FormatStyle Style = getGoogleStyle();
3040 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003041 verifyFormat("Debug(aaaaa,\n"
3042 " {\n"
3043 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3044 " },\n"
3045 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003046 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003047
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003048 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3049
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003050 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003051}
3052
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003053TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3054 EXPECT_EQ("#define MACRO() \\\n"
3055 " Debug(aaa, /* force line break */ \\\n"
3056 " { \\\n"
3057 " int i; \\\n"
3058 " int j; \\\n"
3059 " })",
3060 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3061 " { int i; int j; })",
3062 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003063
3064 EXPECT_EQ("#define A \\\n"
3065 " [] { \\\n"
3066 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3067 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3068 " }",
3069 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3070 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3071 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003072}
3073
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003074TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3075 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003076 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003077 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003078}
3079
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003080TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3081 FormatStyle Style = getLLVMStyle();
3082 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3083 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3084 verifyFormat("FOO_BEGIN\n"
3085 " FOO_ENTRY\n"
3086 "FOO_END", Style);
3087 verifyFormat("FOO_BEGIN\n"
3088 " NESTED_FOO_BEGIN\n"
3089 " NESTED_FOO_ENTRY\n"
3090 " NESTED_FOO_END\n"
3091 "FOO_END", Style);
3092 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3093 " int x;\n"
3094 " x = 1;\n"
3095 "FOO_END(Baz)", Style);
3096}
3097
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003098//===----------------------------------------------------------------------===//
3099// Line break tests.
3100//===----------------------------------------------------------------------===//
3101
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003102TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003103 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003104 "void f() {\n"
3105 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3106 " parameter, parameter, parameter)),\n"
3107 " SecondLongCall(parameter));\n"
3108 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003109 verifyFormat(
3110 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3111 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3112 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3113 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3114 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003115 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3116 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3117 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3118 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003119 verifyFormat(
3120 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3121 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3122 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3123 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003124 verifyFormat("int a = bbbb && ccc &&\n"
3125 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003126 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003127 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003128}
3129
Daniel Jasperd69fc772013-05-08 14:12:04 +00003130TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3131 verifyFormat(
3132 "bool aaaaaaa =\n"
3133 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3134 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003135 verifyFormat(
3136 "bool aaaaaaa =\n"
3137 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3138 " bbbbbbbb();");
3139
Daniel Jasperd69fc772013-05-08 14:12:04 +00003140 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3141 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3142 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003143 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3144 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3145 " ccccccccc == ddddddddddd;");
3146 verifyFormat(
3147 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3148 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3149 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003150
3151 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3152 " aaaaaa) &&\n"
3153 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003154 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3155 " aaaaaa) >>\n"
3156 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003157 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003158 " SourceMgr.getSpellingColumnNumber(\n"
3159 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3160 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003161
Daniel Jasper68d888c2013-06-03 08:42:05 +00003162 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3163 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3164 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00003165 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3166 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3167 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003168 verifyFormat("b = a &&\n"
3169 " // Comment\n"
3170 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003171
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003172 // If the LHS of a comparison is not a binary expression itself, the
3173 // additional linebreak confuses many people.
3174 verifyFormat(
3175 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3176 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3177 "}");
3178 verifyFormat(
3179 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3180 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3181 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003182 verifyFormat(
3183 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3184 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3185 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003186 verifyFormat(
3187 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3188 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3189 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003190 // Even explicit parentheses stress the precedence enough to make the
3191 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003192 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3193 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3194 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003195 // This cases is borderline, but with the indentation it is still readable.
3196 verifyFormat(
3197 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3198 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3199 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3200 "}",
3201 getLLVMStyleWithColumns(75));
3202
3203 // If the LHS is a binary expression, we should still use the additional break
3204 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003205 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3206 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3207 " 5) {\n"
3208 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003209 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3210 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3211 " 5) {\n"
3212 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003213
Daniel Jasper571f1af2013-05-14 20:39:56 +00003214 FormatStyle OnePerLine = getLLVMStyle();
3215 OnePerLine.BinPackParameters = false;
3216 verifyFormat(
3217 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3218 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3219 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3220 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003221
3222 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3223 " .aaa(aaaaaaaaaaaaa) *\n"
3224 " aaaaaaa +\n"
3225 " aaaaaaa;",
3226 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003227}
3228
Daniel Jasper6bee6822013-04-08 20:33:42 +00003229TEST_F(FormatTest, ExpressionIndentation) {
3230 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3231 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3232 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3233 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3234 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3235 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3236 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3237 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3238 " ccccccccccccccccccccccccccccccccccccccccc;");
3239 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3240 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3241 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3242 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3243 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3244 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3245 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3246 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3247 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3248 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3249 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3250 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003251 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003252 "} else if (aaaaa && bbbbb > // break\n"
3253 " ccccc) {\n"
3254 "}");
3255 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003256 "} else if (aaaaa &&\n"
3257 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003258 " ccccc &&\n"
3259 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003260 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003261
3262 // Presence of a trailing comment used to change indentation of b.
3263 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3264 " b;\n"
3265 "return aaaaaaaaaaaaaaaaaaa +\n"
3266 " b; //",
3267 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003268}
3269
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003270TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3271 // Not sure what the best system is here. Like this, the LHS can be found
3272 // immediately above an operator (everything with the same or a higher
3273 // indent). The RHS is aligned right of the operator and so compasses
3274 // everything until something with the same indent as the operator is found.
3275 // FIXME: Is this a good system?
3276 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003277 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003278 verifyFormat(
3279 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003280 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3281 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3282 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3283 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3284 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003285 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003286 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3287 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003288 Style);
3289 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003290 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3291 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003292 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3293 Style);
3294 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003295 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3296 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003297 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3298 Style);
3299 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3300 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003301 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3302 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003303 Style);
3304 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003305 "} else if (aaaaa\n"
3306 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003307 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003308 "}",
3309 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003310 verifyFormat("return (a)\n"
3311 " // comment\n"
3312 " + b;",
3313 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003314 verifyFormat(
3315 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3316 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3317 " + cc;",
3318 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003319
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003320 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3321 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3322 Style);
3323
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003324 // Forced by comments.
3325 verifyFormat(
3326 "unsigned ContentSize =\n"
3327 " sizeof(int16_t) // DWARF ARange version number\n"
3328 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3329 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3330 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003331
3332 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3333 " == boost::fusion::at_c<1>(iiii).second;",
3334 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003335
3336 Style.ColumnLimit = 60;
3337 verifyFormat("zzzzzzzzzz\n"
3338 " = bbbbbbbbbbbbbbbbb\n"
3339 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3340 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003341}
3342
Daniel Jasperb1270392017-02-01 23:27:37 +00003343TEST_F(FormatTest, EnforcedOperatorWraps) {
3344 // Here we'd like to wrap after the || operators, but a comment is forcing an
3345 // earlier wrap.
3346 verifyFormat("bool x = aaaaa //\n"
3347 " || bbbbb\n"
3348 " //\n"
3349 " || cccc;");
3350}
3351
Daniel Jasper3219e432014-12-02 13:24:51 +00003352TEST_F(FormatTest, NoOperandAlignment) {
3353 FormatStyle Style = getLLVMStyle();
3354 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00003355 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3356 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3357 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3358 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003359 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003360 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3361 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3362 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3363 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3364 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3365 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3366 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3367 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3368 " > ccccccccccccccccccccccccccccccccccccccccc;",
3369 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003370
3371 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3372 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3373 " + cc;",
3374 Style);
3375 verifyFormat("int a = aa\n"
3376 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003377 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00003378 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003379
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003380 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003381 verifyFormat("return (a > b\n"
3382 " // comment1\n"
3383 " // comment2\n"
3384 " || c);",
3385 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003386}
3387
Daniel Jasperac043c92014-09-15 11:11:00 +00003388TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3389 FormatStyle Style = getLLVMStyle();
3390 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3391 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3392 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003393 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3394 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003395}
3396
Daniel Jasper988e7e42017-05-08 15:07:52 +00003397TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3398 FormatStyle Style = getLLVMStyle();
3399 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3400 Style.BinPackArguments = false;
3401 Style.ColumnLimit = 40;
3402 verifyFormat("void test() {\n"
3403 " someFunction(\n"
3404 " this + argument + is + quite\n"
3405 " + long + so + it + gets + wrapped\n"
3406 " + but + remains + bin - packed);\n"
3407 "}",
3408 Style);
3409 verifyFormat("void test() {\n"
3410 " someFunction(arg1,\n"
3411 " this + argument + is\n"
3412 " + quite + long + so\n"
3413 " + it + gets + wrapped\n"
3414 " + but + remains + bin\n"
3415 " - packed,\n"
3416 " arg3);\n"
3417 "}",
3418 Style);
3419 verifyFormat("void test() {\n"
3420 " someFunction(\n"
3421 " arg1,\n"
3422 " this + argument + has\n"
3423 " + anotherFunc(nested,\n"
3424 " calls + whose\n"
3425 " + arguments\n"
3426 " + are + also\n"
3427 " + wrapped,\n"
3428 " in + addition)\n"
3429 " + to + being + bin - packed,\n"
3430 " arg3);\n"
3431 "}",
3432 Style);
3433
3434 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3435 verifyFormat("void test() {\n"
3436 " someFunction(\n"
3437 " arg1,\n"
3438 " this + argument + has +\n"
3439 " anotherFunc(nested,\n"
3440 " calls + whose +\n"
3441 " arguments +\n"
3442 " are + also +\n"
3443 " wrapped,\n"
3444 " in + addition) +\n"
3445 " to + being + bin - packed,\n"
3446 " arg3);\n"
3447 "}",
3448 Style);
3449}
3450
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003451TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003452 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003453 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3454 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003455 verifyFormat("Constructor()\n"
3456 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003457 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003458 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003459 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003460 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003461
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003462 verifyFormat("template <typename T>\n"
3463 "Constructor() : Initializer(FitsOnTheLine) {}",
3464 getLLVMStyleWithColumns(45));
3465
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003466 verifyFormat(
3467 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003468 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003469
3470 verifyFormat(
3471 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003472 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003473 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003474 verifyFormat(
3475 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003476 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003477 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003478 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3479 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3480 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003481
3482 verifyFormat("Constructor()\n"
3483 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3484 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3485 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003486 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003487
Daniel Jasper65585ed2013-01-28 13:31:35 +00003488 verifyFormat("Constructor()\n"
3489 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003490 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003491
Daniel Jasper62e68172013-02-25 15:59:54 +00003492 verifyFormat("Constructor(int Parameter = 0)\n"
3493 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3494 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003495 verifyFormat("Constructor()\n"
3496 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3497 "}",
3498 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003499 verifyFormat("Constructor()\n"
3500 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3501 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003502
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003503 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003504 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003505 verifyFormat("Constructor()\n"
3506 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3507 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3508 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003509
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003510 FormatStyle OnePerLine = getLLVMStyle();
3511 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003512 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003513 verifyFormat("SomeClass::Constructor()\n"
3514 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3515 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003516 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003517 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003518 verifyFormat("SomeClass::Constructor()\n"
3519 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3520 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003521 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003522 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003523 verifyFormat("MyClass::MyClass(int var)\n"
3524 " : some_var_(var), // 4 space indent\n"
3525 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003526 "}",
3527 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003528 verifyFormat("Constructor()\n"
3529 " : aaaaa(aaaaaa),\n"
3530 " aaaaa(aaaaaa),\n"
3531 " aaaaa(aaaaaa),\n"
3532 " aaaaa(aaaaaa),\n"
3533 " aaaaa(aaaaaa) {}",
3534 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003535 verifyFormat("Constructor()\n"
3536 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3537 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3538 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003539 OnePerLine.BinPackParameters = false;
3540 verifyFormat(
3541 "Constructor()\n"
3542 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3543 " aaaaaaaaaaa().aaa(),\n"
3544 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3545 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003546 OnePerLine.ColumnLimit = 60;
3547 verifyFormat("Constructor()\n"
3548 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3549 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3550 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003551
3552 EXPECT_EQ("Constructor()\n"
3553 " : // Comment forcing unwanted break.\n"
3554 " aaaa(aaaa) {}",
3555 format("Constructor() :\n"
3556 " // Comment forcing unwanted break.\n"
3557 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003558}
3559
Francois Ferranda6b6d512017-05-24 11:36:58 +00003560TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3561 FormatStyle Style = getLLVMStyle();
3562 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3563
3564 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3565 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3566 getStyleWithColumns(Style, 45));
3567 verifyFormat("Constructor() :\n"
3568 " Initializer(FitsOnTheLine) {}",
3569 getStyleWithColumns(Style, 44));
3570 verifyFormat("Constructor() :\n"
3571 " Initializer(FitsOnTheLine) {}",
3572 getStyleWithColumns(Style, 43));
3573
3574 verifyFormat("template <typename T>\n"
3575 "Constructor() : Initializer(FitsOnTheLine) {}",
3576 getStyleWithColumns(Style, 50));
3577
3578 verifyFormat(
3579 "SomeClass::Constructor() :\n"
3580 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3581 Style);
3582
3583 verifyFormat(
3584 "SomeClass::Constructor() :\n"
3585 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3586 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3587 Style);
3588 verifyFormat(
3589 "SomeClass::Constructor() :\n"
3590 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3591 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3592 Style);
3593 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3594 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3595 " aaaaaaaaaa(aaaaaa) {}",
3596 Style);
3597
3598 verifyFormat("Constructor() :\n"
3599 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3600 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3601 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3602 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3603 Style);
3604
3605 verifyFormat("Constructor() :\n"
3606 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3607 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3608 Style);
3609
3610 verifyFormat("Constructor(int Parameter = 0) :\n"
3611 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3612 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3613 Style);
3614 verifyFormat("Constructor() :\n"
3615 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3616 "}",
3617 getStyleWithColumns(Style, 60));
3618 verifyFormat("Constructor() :\n"
3619 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3620 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3621 Style);
3622
3623 // Here a line could be saved by splitting the second initializer onto two
3624 // lines, but that is not desirable.
3625 verifyFormat("Constructor() :\n"
3626 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3627 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3628 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3629 Style);
3630
3631 FormatStyle OnePerLine = Style;
3632 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3633 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3634 verifyFormat("SomeClass::Constructor() :\n"
3635 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3636 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3637 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3638 OnePerLine);
3639 verifyFormat("SomeClass::Constructor() :\n"
3640 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3641 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3642 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3643 OnePerLine);
3644 verifyFormat("MyClass::MyClass(int var) :\n"
3645 " some_var_(var), // 4 space indent\n"
3646 " some_other_var_(var + 1) { // lined up\n"
3647 "}",
3648 OnePerLine);
3649 verifyFormat("Constructor() :\n"
3650 " aaaaa(aaaaaa),\n"
3651 " aaaaa(aaaaaa),\n"
3652 " aaaaa(aaaaaa),\n"
3653 " aaaaa(aaaaaa),\n"
3654 " aaaaa(aaaaaa) {}",
3655 OnePerLine);
3656 verifyFormat("Constructor() :\n"
3657 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3658 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3659 OnePerLine);
3660 OnePerLine.BinPackParameters = false;
3661 verifyFormat(
3662 "Constructor() :\n"
3663 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3664 " aaaaaaaaaaa().aaa(),\n"
3665 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3666 OnePerLine);
3667 OnePerLine.ColumnLimit = 60;
3668 verifyFormat("Constructor() :\n"
3669 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3670 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3671 OnePerLine);
3672
3673 EXPECT_EQ("Constructor() :\n"
3674 " // Comment forcing unwanted break.\n"
3675 " aaaa(aaaa) {}",
3676 format("Constructor() :\n"
3677 " // Comment forcing unwanted break.\n"
3678 " aaaa(aaaa) {}",
3679 Style));
3680
3681 Style.ColumnLimit = 0;
3682 verifyFormat("SomeClass::Constructor() :\n"
3683 " a(a) {}",
3684 Style);
3685 verifyFormat("SomeClass::Constructor() noexcept :\n"
3686 " a(a) {}",
3687 Style);
3688 verifyFormat("SomeClass::Constructor() :\n"
3689 " a(a), b(b), c(c) {}",
3690 Style);
3691 verifyFormat("SomeClass::Constructor() :\n"
3692 " a(a) {\n"
3693 " foo();\n"
3694 " bar();\n"
3695 "}",
3696 Style);
3697
3698 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3699 verifyFormat("SomeClass::Constructor() :\n"
3700 " a(a), b(b), c(c) {\n"
3701 "}",
3702 Style);
3703 verifyFormat("SomeClass::Constructor() :\n"
3704 " a(a) {\n"
3705 "}",
3706 Style);
3707
3708 Style.ColumnLimit = 80;
3709 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3710 Style.ConstructorInitializerIndentWidth = 2;
3711 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3712 Style);
3713 verifyFormat("SomeClass::Constructor() :\n"
3714 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3715 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3716 Style);
3717}
3718
David Blaikieea95dd72017-08-31 18:49:34 +00003719#ifndef EXPENSIVE_CHECKS
3720// Expensive checks enables libstdc++ checking which includes validating the
3721// state of ranges used in std::priority_queue - this blows out the
3722// runtime/scalability of the function and makes this test unacceptably slow.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003723TEST_F(FormatTest, MemoizationTests) {
3724 // This breaks if the memoization lookup does not take \c Indent and
3725 // \c LastSpace into account.
3726 verifyFormat(
3727 "extern CFRunLoopTimerRef\n"
3728 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3729 " CFTimeInterval interval, CFOptionFlags flags,\n"
3730 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003731 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003732
3733 // Deep nesting somewhat works around our memoization.
3734 verifyFormat(
3735 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3736 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3737 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3738 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3739 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3740 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003741 verifyFormat(
3742 "aaaaa(\n"
3743 " aaaaa,\n"
3744 " aaaaa(\n"
3745 " aaaaa,\n"
3746 " aaaaa(\n"
3747 " aaaaa,\n"
3748 " aaaaa(\n"
3749 " aaaaa,\n"
3750 " aaaaa(\n"
3751 " aaaaa,\n"
3752 " aaaaa(\n"
3753 " aaaaa,\n"
3754 " aaaaa(\n"
3755 " aaaaa,\n"
3756 " aaaaa(\n"
3757 " aaaaa,\n"
3758 " aaaaa(\n"
3759 " aaaaa,\n"
3760 " aaaaa(\n"
3761 " aaaaa,\n"
3762 " aaaaa(\n"
3763 " aaaaa,\n"
3764 " aaaaa(\n"
3765 " aaaaa,\n"
3766 " aaaaa))))))))))));",
3767 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003768 verifyFormat(
3769 "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"
3770 " a),\n"
3771 " a),\n"
3772 " a),\n"
3773 " a),\n"
3774 " a),\n"
3775 " a),\n"
3776 " a),\n"
3777 " a),\n"
3778 " a),\n"
3779 " a),\n"
3780 " a),\n"
3781 " a),\n"
3782 " a),\n"
3783 " a),\n"
3784 " a),\n"
3785 " a),\n"
3786 " a)",
3787 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003788
3789 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003790 FormatStyle OnePerLine = getLLVMStyle();
3791 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003792 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003793 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003794 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003795 for (unsigned i = 0, e = 80; i != e; ++i) {
3796 input += " a,\n";
3797 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003798 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003799 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003800}
David Blaikieea95dd72017-08-31 18:49:34 +00003801#endif
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003802
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003803TEST_F(FormatTest, BreaksAsHighAsPossible) {
3804 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003805 "void f() {\n"
3806 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3807 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3808 " f();\n"
3809 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003810 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003811 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003812}
3813
Daniel Jasper6728fc12013-04-11 14:29:13 +00003814TEST_F(FormatTest, BreaksFunctionDeclarations) {
3815 // Principially, we break function declarations in a certain order:
3816 // 1) break amongst arguments.
3817 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3818 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003819 verifyFormat("template <class TemplateIt>\n"
3820 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3821 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003822
3823 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003824 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003825 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003826 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003827 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003828
3829 // 3) break after (.
3830 verifyFormat(
3831 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003832 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3833 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003834
3835 // 4) break before after nested name specifiers.
3836 verifyFormat(
3837 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003838 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3839 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003840 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003841
3842 // However, there are exceptions, if a sufficient amount of lines can be
3843 // saved.
3844 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3845 // more adjusting.
3846 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3847 " Cccccccccccccc cccccccccc,\n"
3848 " Cccccccccccccc cccccccccc,\n"
3849 " Cccccccccccccc cccccccccc,\n"
3850 " Cccccccccccccc cccccccccc);");
3851 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003852 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003853 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3854 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3855 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003856 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003857 verifyFormat(
3858 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3859 " Cccccccccccccc cccccccccc,\n"
3860 " Cccccccccccccc cccccccccc,\n"
3861 " Cccccccccccccc cccccccccc,\n"
3862 " Cccccccccccccc cccccccccc,\n"
3863 " Cccccccccccccc cccccccccc,\n"
3864 " Cccccccccccccc cccccccccc);");
3865 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3866 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3867 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3868 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3869 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003870
3871 // Break after multi-line parameters.
3872 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3873 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3874 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3875 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003876 verifyFormat("void SomeLoooooooooooongFunction(\n"
3877 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3878 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3879 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003880
3881 // Treat overloaded operators like other functions.
3882 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3883 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003884 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3885 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003886 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3887 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3888 verifyGoogleFormat(
3889 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3890 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003891 verifyGoogleFormat(
3892 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3893 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003894 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3895 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3896 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3897 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003898 verifyGoogleFormat(
3899 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3900 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3901 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003902 verifyGoogleFormat(
3903 "template <typename T>\n"
3904 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3905 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3906 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003907
3908 FormatStyle Style = getLLVMStyle();
3909 Style.PointerAlignment = FormatStyle::PAS_Left;
3910 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3911 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3912 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003913 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3914 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3915 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003916}
3917
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003918TEST_F(FormatTest, TrailingReturnType) {
3919 verifyFormat("auto foo() -> int;\n");
3920 verifyFormat("struct S {\n"
3921 " auto bar() const -> int;\n"
3922 "};");
3923 verifyFormat("template <size_t Order, typename T>\n"
3924 "auto load_img(const std::string &filename)\n"
3925 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003926 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3927 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003928 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003929 verifyFormat("template <typename T>\n"
3930 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3931 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003932
3933 // Not trailing return types.
3934 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003935}
3936
Daniel Jasper5be31f72013-05-21 09:16:31 +00003937TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003938 // Avoid breaking before trailing 'const' or other trailing annotations, if
3939 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003940 FormatStyle Style = getGoogleStyle();
3941 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003942 verifyFormat("void someLongFunction(\n"
3943 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003944 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003945 verifyFormat("LoooooongReturnType\n"
3946 "someLoooooooongFunction() const {}",
3947 getLLVMStyleWithColumns(47));
3948 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3949 " const {}",
3950 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003951 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3952 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3953 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3954 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3955 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3956 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003957 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3958 " aaaaaaaaaaa aaaaa) const override;");
3959 verifyGoogleFormat(
3960 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3961 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003962
Daniel Jasper5550de62014-02-17 07:57:46 +00003963 // Even if the first parameter has to be wrapped.
3964 verifyFormat("void someLongFunction(\n"
3965 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003966 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003967 verifyFormat("void someLongFunction(\n"
3968 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003969 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003970 verifyFormat("void someLongFunction(\n"
3971 " int someLongParameter) override {}",
3972 Style);
3973 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003974 " int someLongParameter) OVERRIDE {}",
3975 Style);
3976 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003977 " int someLongParameter) final {}",
3978 Style);
3979 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003980 " int someLongParameter) FINAL {}",
3981 Style);
3982 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003983 " int parameter) const override {}",
3984 Style);
3985
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003986 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3987 verifyFormat("void someLongFunction(\n"
3988 " int someLongParameter) const\n"
3989 "{\n"
3990 "}",
3991 Style);
3992
Daniel Jasper5550de62014-02-17 07:57:46 +00003993 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003994 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3995 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3996 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003997
3998 // Breaking before function-like trailing annotations is fine to keep them
3999 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004000 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4001 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4002 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4003 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4004 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4005 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004006 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4007 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004008 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004009
4010 verifyFormat(
4011 "void aaaaaaaaaaaaaaaaaa()\n"
4012 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4013 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4014 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4015 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004016 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004017 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004018 " GUARDED_BY(aaaaaaaaaaaa);");
4019 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004020 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004021 " GUARDED_BY(aaaaaaaaaaaa);");
4022 verifyGoogleFormat(
4023 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4024 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004025 verifyGoogleFormat(
4026 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4027 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004028}
4029
Daniel Jasperf090f032015-05-18 09:47:22 +00004030TEST_F(FormatTest, FunctionAnnotations) {
4031 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004032 "int OldFunction(const string &parameter) {}");
4033 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004034 "string OldFunction(const string &parameter) {}");
4035 verifyFormat("template <typename T>\n"
4036 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4037 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004038
4039 // Not function annotations.
4040 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4041 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004042 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4043 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004044 verifyFormat("MACRO(abc).function() // wrap\n"
4045 " << abc;");
4046 verifyFormat("MACRO(abc)->function() // wrap\n"
4047 " << abc;");
4048 verifyFormat("MACRO(abc)::function() // wrap\n"
4049 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004050}
4051
Daniel Jasperf7935112012-12-03 18:12:45 +00004052TEST_F(FormatTest, BreaksDesireably) {
4053 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4054 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004055 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004056 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4057 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4058 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004059
4060 verifyFormat(
4061 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004062 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004063
4064 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4065 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4066 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004067
4068 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004069 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4070 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4071 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004072 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4073 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004074
4075 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4076 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4077
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004078 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004079 "void f() {\n"
4080 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4081 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4082 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004083 verifyFormat(
4084 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4085 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4086 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004087 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4088 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4089 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004090 "aaaaaa(aaa,\n"
4091 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004092 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4093 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004094 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4095 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4096 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004097
Daniel Jasper739b85f2015-06-29 10:42:59 +00004098 // Indent consistently independent of call expression and unary operator.
4099 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4100 " dddddddddddddddddddddddddddddd));");
4101 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4102 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004103 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004104 " dddddddddddddddddddddddddddddd));");
4105
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004106 // This test case breaks on an incorrect memoization, i.e. an optimization not
4107 // taking into account the StopAt value.
4108 verifyFormat(
4109 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004110 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4111 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4112 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004113
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004114 verifyFormat("{\n {\n {\n"
4115 " Annotation.SpaceRequiredBefore =\n"
4116 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4117 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4118 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004119
4120 // Break on an outer level if there was a break on an inner level.
4121 EXPECT_EQ("f(g(h(a, // comment\n"
4122 " b, c),\n"
4123 " d, e),\n"
4124 " x, y);",
4125 format("f(g(h(a, // comment\n"
4126 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004127
4128 // Prefer breaking similar line breaks.
4129 verifyFormat(
4130 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4131 " NSTrackingMouseEnteredAndExited |\n"
4132 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004133}
4134
Daniel Jasper18210d72014-10-09 09:52:05 +00004135TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4136 FormatStyle NoBinPacking = getGoogleStyle();
4137 NoBinPacking.BinPackParameters = false;
4138 NoBinPacking.BinPackArguments = true;
4139 verifyFormat("void f() {\n"
4140 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4141 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4142 "}",
4143 NoBinPacking);
4144 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4145 " int aaaaaaaaaaaaaaaaaaaa,\n"
4146 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4147 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004148
Daniel Jasper00693b082016-01-09 15:56:47 +00004149 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4150 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4151 " vector<int> bbbbbbbbbbbbbbb);",
4152 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004153 // FIXME: This behavior difference is probably not wanted. However, currently
4154 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4155 // template arguments from BreakBeforeParameter being set because of the
4156 // one-per-line formatting.
4157 verifyFormat(
4158 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4159 " aaaaaaaaaa> aaaaaaaaaa);",
4160 NoBinPacking);
4161 verifyFormat(
4162 "void fffffffffff(\n"
4163 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4164 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004165}
4166
Daniel Jasper9278eb92013-01-16 14:59:02 +00004167TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004168 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004169 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004170 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004171 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4172 " aaaaaaaaaaaaaaaaaaaa,\n"
4173 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4174 NoBinPacking);
4175 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4176 " aaaaaaaaaaaaa,\n"
4177 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4178 NoBinPacking);
4179 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004180 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4181 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4182 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4183 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004184 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4185 NoBinPacking);
4186 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4187 " .aaaaaaaaaaaaaaaaaa();",
4188 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004189 verifyFormat("void f() {\n"
4190 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4191 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4192 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004193 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004194
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004195 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004196 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4197 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004198 " aaaaaaaaaaaa);",
4199 NoBinPacking);
4200 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004201 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4202 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004203 " test);",
4204 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004205
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004206 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4207 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004208 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4209 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004210 NoBinPacking);
4211 verifyFormat("a(\"a\"\n"
4212 " \"a\",\n"
4213 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004214
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004215 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004216 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004217 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004218 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004219 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004220 verifyFormat(
4221 "void f() {\n"
4222 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4223 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004224 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004225 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004226 verifyFormat(
4227 "template <class SomeType, class SomeOtherType>\n"
4228 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4229 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004230}
4231
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004232TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4233 FormatStyle Style = getLLVMStyleWithColumns(15);
4234 Style.ExperimentalAutoDetectBinPacking = true;
4235 EXPECT_EQ("aaa(aaaa,\n"
4236 " aaaa,\n"
4237 " aaaa);\n"
4238 "aaa(aaaa,\n"
4239 " aaaa,\n"
4240 " aaaa);",
4241 format("aaa(aaaa,\n" // one-per-line
4242 " aaaa,\n"
4243 " aaaa );\n"
4244 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4245 Style));
4246 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4247 " aaaa);\n"
4248 "aaa(aaaa, aaaa,\n"
4249 " aaaa);",
4250 format("aaa(aaaa, aaaa,\n" // bin-packed
4251 " aaaa );\n"
4252 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4253 Style));
4254}
4255
Daniel Jasper04468962013-01-18 10:56:38 +00004256TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004257 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4258 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4259 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4260 " .StartsWith(\".init\", ORDER_INIT)\n"
4261 " .StartsWith(\".fini\", ORDER_FINI)\n"
4262 " .StartsWith(\".hash\", ORDER_HASH)\n"
4263 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004264
Daniel Jaspereb50c672013-02-15 20:33:06 +00004265 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004266 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004267 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004268 "aaaaaaa->aaaaaaa\n"
4269 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4270 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004271 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004272 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004273 "aaaaaaa->aaaaaaa\n"
4274 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4275 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4276 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004277 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004278 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004279 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004280 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4281 " aaaaaa->aaaaaaaaaaaa()\n"
4282 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004283 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004284 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004285 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004286 "void f() {\n"
4287 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004288 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004289 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004290 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004291 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004292 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004293 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004294 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004295 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004296 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004297 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004298 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004299
4300 verifyFormat(
4301 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4302 verifyFormat("aaaaaaaaaaaaaaa()\n"
4303 " .aaaaaaaaaaaaaaa()\n"
4304 " .aaaaaaaaaaaaaaa()\n"
4305 " .aaaaaaaaaaaaaaa()\n"
4306 " .aaaaaaaaaaaaaaa();");
4307 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4308 " .aaaaaaaaaaaaaaa()\n"
4309 " .aaaaaaaaaaaaaaa()\n"
4310 " .aaaaaaaaaaaaaaa();");
4311 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4312 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4313 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004314 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4315 " ->aaaaaaaaaaaaaae(0)\n"
4316 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004317
Daniel Jasper775954b2015-04-24 10:08:09 +00004318 // Don't linewrap after very short segments.
4319 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4320 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4321 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4322 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4323 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4324 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4325 verifyFormat("aaa()\n"
4326 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4327 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4328 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4329
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004330 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4331 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4332 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4333 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4334 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004335 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004336
Daniel Jaspera41aa532014-09-19 08:01:25 +00004337 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004338 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4339 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004340
4341 // Prefer not to create "hanging" indents.
4342 verifyFormat(
4343 "return !soooooooooooooome_map\n"
4344 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4345 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004346 verifyFormat(
4347 "return aaaaaaaaaaaaaaaa\n"
4348 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4349 " .aaaa(aaaaaaaaaaaaaa);");
4350 // No hanging indent here.
4351 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4352 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4353 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4354 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004355 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4356 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4357 getLLVMStyleWithColumns(60));
4358 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4359 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4360 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4361 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004362 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4363 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4364 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004365}
4366
Daniel Jasperde5c2072012-12-24 00:13:23 +00004367TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4368 verifyFormat(
4369 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004370 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004371 verifyFormat(
4372 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4373 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4374
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004375 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004376 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004377 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4378 " ccccccccccccccccccccccccc) {\n}");
4379
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004380 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004381 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004382 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4383 " ccccccccccccccccccccccccc) {\n}");
4384
Daniel Jasperde5c2072012-12-24 00:13:23 +00004385 verifyFormat(
4386 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004387 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004388 verifyFormat(
4389 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4390 " ccccccccccccccccccccccccc) {\n}");
4391
Daniel Jasper400adc62013-02-08 15:28:42 +00004392 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4393 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4394 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4395 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004396 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4397 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4398 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4399 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4400
Daniel Jasper400adc62013-02-08 15:28:42 +00004401 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4402 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4403 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004404 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4405 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4406 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004407}
4408
Daniel Jasper43b65482013-01-23 12:27:43 +00004409TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004410 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004411 "unsigned Cost =\n"
4412 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4413 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004414 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004415 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4416 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004417
4418 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004419 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4420 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004421 verifyFormat("unsigned OriginalStartColumn =\n"
4422 " SourceMgr.getSpellingColumnNumber(\n"
4423 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4424 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004425}
4426
Francois Ferrand9976efa2017-05-22 08:28:17 +00004427TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4428 FormatStyle Style = getLLVMStyle();
4429 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4430 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4431 Style);
4432
4433 Style.PenaltyBreakAssignment = 20;
4434 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4435 " cccccccccccccccccccccccccc;",
4436 Style);
4437}
4438
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004439TEST_F(FormatTest, AlignsAfterAssignments) {
4440 verifyFormat(
4441 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004442 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004443 verifyFormat(
4444 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004445 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004446 verifyFormat(
4447 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004448 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004449 verifyFormat(
4450 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004451 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004452 verifyFormat(
4453 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4454 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4455 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004456}
4457
4458TEST_F(FormatTest, AlignsAfterReturn) {
4459 verifyFormat(
4460 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4461 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4462 verifyFormat(
4463 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4464 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004465 verifyFormat(
4466 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004467 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004468 verifyFormat(
4469 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004470 " aaaaaaaaaaaaaaaaaaaaaa());");
4471 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4472 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4473 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4474 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4475 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004476 verifyFormat("return\n"
4477 " // true if code is one of a or b.\n"
4478 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004479}
4480
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004481TEST_F(FormatTest, AlignsAfterOpenBracket) {
4482 verifyFormat(
4483 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4484 " aaaaaaaaa aaaaaaa) {}");
4485 verifyFormat(
4486 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4487 " aaaaaaaaaaa aaaaaaaaa);");
4488 verifyFormat(
4489 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4490 " aaaaaaaaaaaaaaaaaaaaa));");
4491 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004492 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004493 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4494 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4495 Style);
4496 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4497 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4498 Style);
4499 verifyFormat("SomeLongVariableName->someFunction(\n"
4500 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4501 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004502 verifyFormat(
4503 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4504 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4505 Style);
4506 verifyFormat(
4507 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4508 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4509 Style);
4510 verifyFormat(
4511 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4512 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4513 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004514
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004515 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4516 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4517 " b));",
4518 Style);
4519
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004520 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4521 Style.BinPackArguments = false;
4522 Style.BinPackParameters = false;
4523 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4524 " aaaaaaaaaaa aaaaaaaa,\n"
4525 " aaaaaaaaa aaaaaaa,\n"
4526 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4527 Style);
4528 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4529 " aaaaaaaaaaa aaaaaaaaa,\n"
4530 " aaaaaaaaaaa aaaaaaaaa,\n"
4531 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4532 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004533 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4534 " aaaaaaaaaaaaaaa,\n"
4535 " aaaaaaaaaaaaaaaaaaaaa,\n"
4536 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004537 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004538 verifyFormat(
4539 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4540 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4541 Style);
4542 verifyFormat(
4543 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4544 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4545 Style);
4546 verifyFormat(
4547 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4548 " aaaaaaaaaaaaaaaaaaaaa(\n"
4549 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4550 " aaaaaaaaaaaaaaaa);",
4551 Style);
4552 verifyFormat(
4553 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4554 " aaaaaaaaaaaaaaaaaaaaa(\n"
4555 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4556 " aaaaaaaaaaaaaaaa);",
4557 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004558}
4559
Daniel Jasper3219e432014-12-02 13:24:51 +00004560TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4561 FormatStyle Style = getLLVMStyleWithColumns(40);
4562 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4563 " bbbbbbbbbbbbbbbbbbbbbb);",
4564 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004565 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004566 Style.AlignOperands = false;
4567 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4568 " bbbbbbbbbbbbbbbbbbbbbb);",
4569 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004570 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004571 Style.AlignOperands = true;
4572 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4573 " bbbbbbbbbbbbbbbbbbbbbb);",
4574 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004575 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004576 Style.AlignOperands = false;
4577 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4578 " bbbbbbbbbbbbbbbbbbbbbb);",
4579 Style);
4580}
4581
Daniel Jasper399d24b2013-01-09 07:06:56 +00004582TEST_F(FormatTest, BreaksConditionalExpressions) {
4583 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004584 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4585 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4586 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4587 verifyFormat(
4588 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004589 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4590 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004591 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004592 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4593 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4594 verifyFormat(
4595 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004596 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4597 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004598 verifyFormat(
4599 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4600 " : aaaaaaaaaaaaa);");
4601 verifyFormat(
4602 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004603 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004604 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4605 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004606 verifyFormat(
4607 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4608 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4609 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004610 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4611 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4612 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4613 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4614 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4615 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4616 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4617 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4618 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4619 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4620 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4621 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004622 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4623 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4624 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4625 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4626 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004627 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4628 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4629 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004630 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4631 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4632 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4633 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004634 verifyFormat(
4635 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4636 " ? aaaaaaaaaaaaaaa\n"
4637 " : aaaaaaaaaaaaaaa;");
4638 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004639 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004640 " ? b\n"
4641 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004642 verifyFormat("return aaaa == bbbb\n"
4643 " // comment\n"
4644 " ? aaaa\n"
4645 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004646 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004647 " format(TheLine.First,\n"
4648 " IndentForLevel[TheLine.Level] >= 0\n"
4649 " ? IndentForLevel[TheLine.Level]\n"
4650 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004651 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004652 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004653 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4654 " ? aaaaaaaaaaaaaaa\n"
4655 " : bbbbbbbbbbbbbbb //\n"
4656 " ? ccccccccccccccc\n"
4657 " : ddddddddddddddd;");
4658 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4659 " ? aaaaaaaaaaaaaaa\n"
4660 " : (bbbbbbbbbbbbbbb //\n"
4661 " ? ccccccccccccccc\n"
4662 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004663 verifyFormat(
4664 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4665 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4666 " aaaaaaaaaaaaaaaaaaaaa +\n"
4667 " aaaaaaaaaaaaaaaaaaaaa\n"
4668 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004669 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004670 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4671 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4672 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004673
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004674 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004675 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004676 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004677 "void f() {\n"
4678 " g(aaa,\n"
4679 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4680 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4681 " ? aaaaaaaaaaaaaaa\n"
4682 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004683 "}",
4684 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004685 verifyFormat(
4686 "void f() {\n"
4687 " g(aaa,\n"
4688 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4689 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4690 " ?: aaaaaaaaaaaaaaa);\n"
4691 "}",
4692 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004693
4694 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4695 " // comment.\n"
4696 " ccccccccccccccccccccccccccccccccccccccc\n"
4697 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4698 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004699
4700 // Assignments in conditional expressions. Apparently not uncommon :-(.
4701 verifyFormat("return a != b\n"
4702 " // comment\n"
4703 " ? a = b\n"
4704 " : a = b;");
4705 verifyFormat("return a != b\n"
4706 " // comment\n"
4707 " ? a = a != b\n"
4708 " // comment\n"
4709 " ? a = b\n"
4710 " : a\n"
4711 " : a;\n");
4712 verifyFormat("return a != b\n"
4713 " // comment\n"
4714 " ? a\n"
4715 " : a = a != b\n"
4716 " // comment\n"
4717 " ? a = b\n"
4718 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004719}
4720
Daniel Jasper165b29e2013-11-08 00:57:11 +00004721TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4722 FormatStyle Style = getLLVMStyle();
4723 Style.BreakBeforeTernaryOperators = false;
4724 Style.ColumnLimit = 70;
4725 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004726 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4727 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4728 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4729 Style);
4730 verifyFormat(
4731 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004732 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4733 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004734 Style);
4735 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004736 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4737 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4738 Style);
4739 verifyFormat(
4740 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004741 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4742 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004743 Style);
4744 verifyFormat(
4745 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4746 " aaaaaaaaaaaaa);",
4747 Style);
4748 verifyFormat(
4749 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4750 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4752 " aaaaaaaaaaaaa);",
4753 Style);
4754 verifyFormat(
4755 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4756 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4757 " aaaaaaaaaaaaa);",
4758 Style);
4759 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4760 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4761 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4762 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4763 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4764 Style);
4765 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4766 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4767 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4768 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4769 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4770 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4771 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4772 Style);
4773 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4774 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4775 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4776 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4777 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4778 Style);
4779 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4780 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4781 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4782 Style);
4783 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004784 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004785 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4786 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4787 Style);
4788 verifyFormat(
4789 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4790 " aaaaaaaaaaaaaaa :\n"
4791 " aaaaaaaaaaaaaaa;",
4792 Style);
4793 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4794 " aaaaaaaaa ?\n"
4795 " b :\n"
4796 " c);",
4797 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004798 verifyFormat("unsigned Indent =\n"
4799 " format(TheLine.First,\n"
4800 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4801 " IndentForLevel[TheLine.Level] :\n"
4802 " TheLine * 2,\n"
4803 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4804 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004805 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4806 " aaaaaaaaaaaaaaa :\n"
4807 " bbbbbbbbbbbbbbb ? //\n"
4808 " ccccccccccccccc :\n"
4809 " ddddddddddddddd;",
4810 Style);
4811 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4812 " aaaaaaaaaaaaaaa :\n"
4813 " (bbbbbbbbbbbbbbb ? //\n"
4814 " ccccccccccccccc :\n"
4815 " ddddddddddddddd);",
4816 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004817 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4818 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4819 " ccccccccccccccccccccccccccc;",
4820 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004821 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4822 " aaaaa :\n"
4823 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4824 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004825}
4826
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004827TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4828 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4829 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4830 verifyFormat("bool a = true, b = false;");
4831
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004832 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004833 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004834 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004835 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004836 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004837 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004838 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004839 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004840 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4841 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4842 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4843 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4844 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4845 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004846
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004847 FormatStyle Style = getGoogleStyle();
4848 Style.PointerAlignment = FormatStyle::PAS_Left;
4849 Style.DerivePointerAlignment = false;
4850 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4851 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4852 " *b = bbbbbbbbbbbbbbbbbbb;",
4853 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004854 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4855 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4856 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004857 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004858 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004859}
4860
Nico Weber4a5030c2013-01-12 01:28:06 +00004861TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4862 verifyFormat("arr[foo ? bar : baz];");
4863 verifyFormat("f()[foo ? bar : baz];");
4864 verifyFormat("(a + b)[foo ? bar : baz];");
4865 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4866}
4867
Daniel Jasperf7935112012-12-03 18:12:45 +00004868TEST_F(FormatTest, AlignsStringLiterals) {
4869 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4870 " \"short literal\");");
4871 verifyFormat(
4872 "looooooooooooooooooooooooongFunction(\n"
4873 " \"short literal\"\n"
4874 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004875 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4876 " \" string literals\",\n"
4877 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004878 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4879 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004880 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004881 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004882 getLLVMStyleWithColumns(28)));
4883 EXPECT_EQ(
4884 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4885 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4886 " \"aaaaaaaaaaaaaaaa\";",
4887 format("aaaaaa ="
4888 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4889 "aaaaaaaaaaaaaaaaaaaaa\" "
4890 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004891 verifyFormat("a = a + \"a\"\n"
4892 " \"a\"\n"
4893 " \"a\";");
4894 verifyFormat("f(\"a\", \"b\"\n"
4895 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004896
4897 verifyFormat(
4898 "#define LL_FORMAT \"ll\"\n"
4899 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4900 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004901
4902 verifyFormat("#define A(X) \\\n"
4903 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4904 " \"ccccc\"",
4905 getLLVMStyleWithColumns(23));
4906 verifyFormat("#define A \"def\"\n"
4907 "f(\"abc\" A \"ghi\"\n"
4908 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004909
4910 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004911 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004912 verifyFormat("#define A(X) \\\n"
4913 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4914 " L\"ccccc\"",
4915 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004916
4917 verifyFormat("f(@\"a\"\n"
4918 " @\"b\");");
4919 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004920 " @\"b\"\n"
4921 " @\"c\";");
4922 verifyFormat("NSString s = @\"a\"\n"
4923 " \"b\"\n"
4924 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004925}
4926
Zachary Turner448592e2015-12-18 22:20:15 +00004927TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004928 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004929 // No declarations or definitions should be moved to own line.
4930 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4931 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004932 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004933 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004934 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004935 "int f() { return 1; }\n"
4936 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004937 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004938
4939 // All declarations and definitions should have the return type moved to its
4940 // own
4941 // line.
4942 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4943 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004944 " int\n"
4945 " f() {\n"
4946 " return 1;\n"
4947 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004948 " int\n"
4949 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004950 "};\n"
4951 "int\n"
4952 "f() {\n"
4953 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004954 "}\n"
4955 "int\n"
4956 "g();\n",
4957 Style);
4958
4959 // Top-level definitions, and no kinds of declarations should have the
4960 // return type moved to its own line.
4961 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4962 verifyFormat("class B {\n"
4963 " int f() { return 1; }\n"
4964 " int g();\n"
4965 "};\n"
4966 "int\n"
4967 "f() {\n"
4968 " return 1;\n"
4969 "}\n"
4970 "int g();\n",
4971 Style);
4972
4973 // Top-level definitions and declarations should have the return type moved
4974 // to its own line.
4975 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4976 verifyFormat("class C {\n"
4977 " int f() { return 1; }\n"
4978 " int g();\n"
4979 "};\n"
4980 "int\n"
4981 "f() {\n"
4982 " return 1;\n"
4983 "}\n"
4984 "int\n"
4985 "g();\n",
4986 Style);
4987
4988 // All definitions should have the return type moved to its own line, but no
4989 // kinds of declarations.
4990 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4991 verifyFormat("class D {\n"
4992 " int\n"
4993 " f() {\n"
4994 " return 1;\n"
4995 " }\n"
4996 " int g();\n"
4997 "};\n"
4998 "int\n"
4999 "f() {\n"
5000 " return 1;\n"
5001 "}\n"
5002 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005003 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005004 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005005 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005006 " return \"\";\n"
5007 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005008 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005009 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005010 verifyFormat("template <class T>\n"
5011 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005012 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005013 " return NULL;\n"
5014 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005015 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005016 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005017 verifyFormat("class C {\n"
5018 " int\n"
5019 " operator+() {\n"
5020 " return 1;\n"
5021 " }\n"
5022 " int\n"
5023 " operator()() {\n"
5024 " return 1;\n"
5025 " }\n"
5026 "};\n",
5027 Style);
5028 verifyFormat("void\n"
5029 "A::operator()() {}\n"
5030 "void\n"
5031 "A::operator>>() {}\n"
5032 "void\n"
5033 "A::operator+() {}\n",
5034 Style);
5035 verifyFormat("void *operator new(std::size_t s);", // No break here.
5036 Style);
5037 verifyFormat("void *\n"
5038 "operator new(std::size_t s) {}",
5039 Style);
5040 verifyFormat("void *\n"
5041 "operator delete[](void *ptr) {}",
5042 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005043 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005044 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005045 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005046 "{\n"
5047 " return \"\";\n"
5048 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005049 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005050 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005051 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005052 "T *\n" // Problem here: no line break
5053 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005054 "{\n"
5055 " return NULL;\n"
5056 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005057 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005058 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005059}
5060
Alexander Kornienko58611712013-07-04 12:02:44 +00005061TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5062 FormatStyle NoBreak = getLLVMStyle();
5063 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5064 FormatStyle Break = getLLVMStyle();
5065 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005066 verifyFormat("aaaa = \"bbbb\"\n"
5067 " \"cccc\";",
5068 NoBreak);
5069 verifyFormat("aaaa =\n"
5070 " \"bbbb\"\n"
5071 " \"cccc\";",
5072 Break);
5073 verifyFormat("aaaa(\"bbbb\"\n"
5074 " \"cccc\");",
5075 NoBreak);
5076 verifyFormat("aaaa(\n"
5077 " \"bbbb\"\n"
5078 " \"cccc\");",
5079 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005080 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5081 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005082 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005083 verifyFormat("aaaa(qqq,\n"
5084 " \"bbbb\"\n"
5085 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005086 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005087 verifyFormat("aaaa(qqq,\n"
5088 " L\"bbbb\"\n"
5089 " L\"cccc\");",
5090 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005091 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5092 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005093 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005094 verifyFormat("string s = someFunction(\n"
5095 " \"abc\"\n"
5096 " \"abc\");",
5097 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005098
Daniel Jasper3251fff2014-06-10 06:27:23 +00005099 // As we break before unary operators, breaking right after them is bad.
5100 verifyFormat("string foo = abc ? \"x\"\n"
5101 " \"blah blah blah blah blah blah\"\n"
5102 " : \"y\";",
5103 Break);
5104
Daniel Jasperc834c702013-07-17 15:38:19 +00005105 // Don't break if there is no column gain.
5106 verifyFormat("f(\"aaaa\"\n"
5107 " \"bbbb\");",
5108 Break);
5109
5110 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005111 EXPECT_EQ("x = \"a\\\n"
5112 "b\\\n"
5113 "c\";",
5114 format("x = \"a\\\n"
5115 "b\\\n"
5116 "c\";",
5117 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005118 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005119 " \"a\\\n"
5120 "b\\\n"
5121 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005122 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005123 "b\\\n"
5124 "c\";",
5125 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005126
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00005127 EXPECT_EQ("NSString *const kString =\n"
5128 " @\"aaaa\"\n"
5129 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005130 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005131 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005132 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005133
5134 Break.ColumnLimit = 0;
5135 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005136}
5137
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005138TEST_F(FormatTest, AlignsPipes) {
5139 verifyFormat(
5140 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5141 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5142 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5143 verifyFormat(
5144 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5145 " << aaaaaaaaaaaaaaaaaaaa;");
5146 verifyFormat(
5147 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5148 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5149 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005150 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5151 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5152 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005153 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5154 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5155 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5156 verifyFormat(
5157 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5158 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5159 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005160 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5161 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5162 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5163 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005164 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5165 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005166 verifyFormat(
5167 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5168 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00005169 verifyFormat(
5170 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5171 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005172
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005173 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5174 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005175 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5176 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5177 " aaaaaaaaaaaaaaaaaaaaa)\n"
5178 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005179 verifyFormat("LOG_IF(aaa == //\n"
5180 " bbb)\n"
5181 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005182
Daniel Jasper467ddb12013-08-12 12:58:05 +00005183 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005184 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5185 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005186 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5187 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5188 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005189 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5190 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005191 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5192 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5193 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5194 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5195 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5196 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5197 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005198
Daniel Jasperc238c872013-04-02 14:33:13 +00005199 verifyFormat(
5200 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5201 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005202
5203 // Incomplete string literal.
5204 EXPECT_EQ("llvm::errs() << \"\n"
5205 " << a;",
5206 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005207
5208 verifyFormat("void f() {\n"
5209 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5210 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5211 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005212
5213 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005214 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5215 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5216 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005217
5218 // Handle '\n'.
5219 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5220 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5221 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5222 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5223 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5224 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5225 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005226}
5227
Daniel Jasper7209bb92016-12-13 11:16:42 +00005228TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5229 verifyFormat("return out << \"somepacket = {\\n\"\n"
5230 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5231 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5232 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5233 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5234 " << \"}\";");
5235
5236 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5237 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5238 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5239 verifyFormat(
5240 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5241 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5242 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5243 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5244 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5245 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5246 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5247 verifyFormat(
5248 "void f() {\n"
5249 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5250 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5251 "}");
5252
5253 // Breaking before the first "<<" is generally not desirable.
5254 verifyFormat(
5255 "llvm::errs()\n"
5256 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5257 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5258 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5259 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5260 getLLVMStyleWithColumns(70));
5261 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5262 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5263 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5264 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5265 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5266 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5267 getLLVMStyleWithColumns(70));
5268
5269 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5270 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5271 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5272 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5273 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5274 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005275 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5276 " (aaaa + aaaa);",
5277 getLLVMStyleWithColumns(40));
5278 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5279 " (aaaaaaa + aaaaa));",
5280 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005281 verifyFormat(
5282 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5283 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5284 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005285}
5286
Daniel Jasperf7935112012-12-03 18:12:45 +00005287TEST_F(FormatTest, UnderstandsEquals) {
5288 verifyFormat(
5289 "aaaaaaaaaaaaaaaaa =\n"
5290 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5291 verifyFormat(
5292 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005293 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005294 verifyFormat(
5295 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005296 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005297 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005298 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5299 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005300
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005301 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5302 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005303}
5304
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005305TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005306 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5307 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005308
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005309 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5310 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005311
5312 verifyFormat(
5313 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5314 " Parameter2);");
5315
5316 verifyFormat(
5317 "ShortObject->shortFunction(\n"
5318 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5319 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5320
5321 verifyFormat("loooooooooooooongFunction(\n"
5322 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5323
5324 verifyFormat(
5325 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5326 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5327
Daniel Jasper687af3b2013-02-14 14:26:07 +00005328 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5329 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005330 verifyFormat("void f() {\n"
5331 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5332 " .Times(2)\n"
5333 " .WillRepeatedly(Return(SomeValue));\n"
5334 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005335 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5336 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005337 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005338 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5339 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005340 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005341 verifyFormat("void f() {\n"
5342 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5343 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5344 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005345 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5346 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5347 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5348 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5349 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005350 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5351 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5352 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5353 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5354 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005355
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005356 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005357 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005358 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005359 verifyFormat(
5360 "aaaaaaaaaaa->aaaaaaaaa(\n"
5361 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5362 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005363
5364 verifyFormat(
5365 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5366 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005367 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5368 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5369 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5370 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005371
Daniel Jasper9b334242013-03-15 14:57:30 +00005372 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005373 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5374 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005375
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005376 FormatStyle NoBinPacking = getLLVMStyle();
5377 NoBinPacking.BinPackParameters = false;
5378 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5379 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5380 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5381 " aaaaaaaaaaaaaaaaaaa,\n"
5382 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5383 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005384
5385 // If there is a subsequent call, change to hanging indentation.
5386 verifyFormat(
5387 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5388 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5389 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5390 verifyFormat(
5391 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5392 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005393 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5394 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5395 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5396 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5397 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5398 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005399}
5400
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005401TEST_F(FormatTest, WrapsTemplateDeclarations) {
5402 verifyFormat("template <typename T>\n"
5403 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005404 verifyFormat("template <typename T>\n"
5405 "// T should be one of {A, B}.\n"
5406 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005407 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005408 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005409 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005410 verifyFormat("template <typename T>\n"
5411 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5412 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005413 verifyFormat(
5414 "template <typename T>\n"
5415 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5416 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005417 verifyFormat(
5418 "template <typename T>\n"
5419 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5420 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5421 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005422 verifyFormat("template <typename T>\n"
5423 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005424 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005425 verifyFormat(
5426 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5427 " typename T4 = char>\n"
5428 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005429 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5430 " template <typename> class cccccccccccccccccccccc,\n"
5431 " typename ddddddddddddd>\n"
5432 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005433 verifyFormat(
5434 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5435 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005436
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005437 verifyFormat("void f() {\n"
5438 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5439 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5440 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005441
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005442 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005443 verifyFormat("template <typename T> void f();");
5444 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005445 verifyFormat(
5446 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5447 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5448 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5449 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5450 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5451 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5452 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5453 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005454 EXPECT_EQ("static_cast<A< //\n"
5455 " B> *>(\n"
5456 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00005457 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00005458 format("static_cast<A<//\n"
5459 " B>*>(\n"
5460 "\n"
5461 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005462 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5463 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005464
5465 FormatStyle AlwaysBreak = getLLVMStyle();
5466 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5467 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5468 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5469 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5470 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5471 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5472 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5473 verifyFormat("template <template <typename> class Fooooooo,\n"
5474 " template <typename> class Baaaaaaar>\n"
5475 "struct C {};",
5476 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005477 verifyFormat("template <typename T> // T can be A, B or C.\n"
5478 "struct C {};",
5479 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005480 verifyFormat("template <enum E> class A {\n"
5481 "public:\n"
5482 " E *f();\n"
5483 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005484}
5485
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005486TEST_F(FormatTest, WrapsTemplateParameters) {
5487 FormatStyle Style = getLLVMStyle();
5488 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5489 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5490 verifyFormat(
5491 "template <typename... a> struct q {};\n"
5492 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5493 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5494 " y;",
5495 Style);
5496 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5497 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5498 verifyFormat(
5499 "template <typename... a> struct r {};\n"
5500 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5501 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5502 " y;",
5503 Style);
5504 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5505 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5506 verifyFormat(
5507 "template <typename... a> struct s {};\n"
5508 "extern s<\n"
5509 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5510 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5511 " y;",
5512 Style);
5513 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5514 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5515 verifyFormat(
5516 "template <typename... a> struct t {};\n"
5517 "extern t<\n"
5518 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5519 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5520 " y;",
5521 Style);
5522}
5523
Daniel Jasper45797022013-01-25 10:57:27 +00005524TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5525 verifyFormat(
5526 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5527 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5528 verifyFormat(
5529 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5530 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5531 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5532
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005533 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005534 verifyFormat(
5535 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5536 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005537 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005538
Daniel Jasper45797022013-01-25 10:57:27 +00005539 verifyFormat(
5540 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005541 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005542
5543 // Breaking at nested name specifiers is generally not desirable.
5544 verifyFormat(
5545 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5546 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005547
5548 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005549 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5550 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005552 " aaaaaaaaaaaaaaaaaaaaa);",
5553 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005554
5555 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5556 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5557 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005558}
5559
Daniel Jasperf7935112012-12-03 18:12:45 +00005560TEST_F(FormatTest, UnderstandsTemplateParameters) {
5561 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005562 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005563 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5564 verifyFormat("bool x = a < 1 || 2 > a;");
5565 verifyFormat("bool x = 5 < f<int>();");
5566 verifyFormat("bool x = f<int>() > 5;");
5567 verifyFormat("bool x = 5 < a<int>::x;");
5568 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5569 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5570
5571 verifyGoogleFormat("A<A<int>> a;");
5572 verifyGoogleFormat("A<A<A<int>>> a;");
5573 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005574 verifyGoogleFormat("A<A<int> > a;");
5575 verifyGoogleFormat("A<A<A<int> > > a;");
5576 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005577 verifyGoogleFormat("A<::A<int>> a;");
5578 verifyGoogleFormat("A<::A> a;");
5579 verifyGoogleFormat("A< ::A> a;");
5580 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005581 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5582 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005583 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5584 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005585 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5586 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005587
Nico Weber7533b4d2014-09-24 17:17:32 +00005588 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5589
Daniel Jasperf7935112012-12-03 18:12:45 +00005590 verifyFormat("test >> a >> b;");
5591 verifyFormat("test << a >> b;");
5592
5593 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005594 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005595 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005596 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5597 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005598 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005599 verifyFormat("f(a.operator()<A>());");
5600 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5601 " .template operator()<A>());",
5602 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005603
5604 // Not template parameters.
5605 verifyFormat("return a < b && c > d;");
5606 verifyFormat("void f() {\n"
5607 " while (a < b && c > d) {\n"
5608 " }\n"
5609 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005610 verifyFormat("template <typename... Types>\n"
5611 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005612
5613 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5614 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5615 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005616 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005617 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005618 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005619}
5620
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005621TEST_F(FormatTest, BitshiftOperatorWidth) {
5622 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5623 " bar */",
5624 format("int a=1<<2; /* foo\n"
5625 " bar */"));
5626
5627 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5628 " bar */",
5629 format("int b =256>>1 ; /* foo\n"
5630 " bar */"));
5631}
5632
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005633TEST_F(FormatTest, UnderstandsBinaryOperators) {
5634 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005635 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005636}
5637
5638TEST_F(FormatTest, UnderstandsPointersToMembers) {
5639 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005640 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005641 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005642 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005643 verifyFormat("void f() {\n"
5644 " (a->*f)();\n"
5645 " a->*x;\n"
5646 " (a.*f)();\n"
5647 " ((*a).*f)();\n"
5648 " a.*x;\n"
5649 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005650 verifyFormat("void f() {\n"
5651 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5652 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5653 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005654 verifyFormat(
5655 "(aaaaaaaaaa->*bbbbbbb)(\n"
5656 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005657 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005658 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005659 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005660}
5661
Daniel Jasper8dd40472012-12-21 09:41:31 +00005662TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005663 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005664 verifyFormat("f(-1, -2, -3);");
5665 verifyFormat("a[-1] = 5;");
5666 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005667 verifyFormat("if (i == -1) {\n}");
5668 verifyFormat("if (i != -1) {\n}");
5669 verifyFormat("if (i > -1) {\n}");
5670 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005671 verifyFormat("++(a->f());");
5672 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005673 verifyFormat("(a->f())++;");
5674 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005675 verifyFormat("if (!(a->f())) {\n}");
Krasimir Georgiev446d6ec2018-03-06 13:56:28 +00005676 verifyFormat("if (!+i) {\n}");
5677 verifyFormat("~&a;");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005678
5679 verifyFormat("a-- > b;");
5680 verifyFormat("b ? -a : c;");
5681 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005682 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005683 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005684 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005685
5686 verifyFormat("return -1;");
5687 verifyFormat("switch (a) {\n"
5688 "case -1:\n"
5689 " break;\n"
5690 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005691 verifyFormat("#define X -1");
5692 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005693
Chandler Carruthf8b72662014-03-02 12:37:31 +00005694 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5695 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005696
5697 verifyFormat("int a = /* confusing comment */ -1;");
5698 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5699 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005700}
5701
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005702TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005703 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005704 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005705 "}");
5706 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005707 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005708 verifyFormat("*aaa = aaaaaaa( // break\n"
5709 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005710}
5711
Daniel Jasper8863ada2013-08-26 08:10:17 +00005712TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005713 verifyFormat("bool operator<();");
5714 verifyFormat("bool operator>();");
5715 verifyFormat("bool operator=();");
5716 verifyFormat("bool operator==();");
5717 verifyFormat("bool operator!=();");
5718 verifyFormat("int operator+();");
5719 verifyFormat("int operator++();");
Daniel Jasperbbf5f4e2017-11-06 12:11:51 +00005720 verifyFormat("int operator++(int) volatile noexcept;");
Daniel Jasper804a2762016-01-09 15:56:40 +00005721 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005722 verifyFormat("bool operator();");
5723 verifyFormat("bool operator()();");
5724 verifyFormat("bool operator[]();");
5725 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005726 verifyFormat("operator int();");
5727 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005728 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005729 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005730 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005731 verifyFormat("void *operator new(std::size_t size);");
5732 verifyFormat("void *operator new[](std::size_t size);");
5733 verifyFormat("void operator delete(void *ptr);");
5734 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005735 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5736 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005737 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005738 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005739
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005740 verifyFormat(
5741 "ostream &operator<<(ostream &OutputStream,\n"
5742 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005743 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5744 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5745 " return left.group < right.group;\n"
5746 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005747 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005748 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005749
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005750 verifyGoogleFormat("operator void*();");
5751 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005752 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005753
5754 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005755 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5756 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005757}
5758
Daniel Jasper1c220482015-02-25 10:30:06 +00005759TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005760 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5761 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5762 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5763 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5764 verifyFormat("Deleted &operator=(const Deleted &) &;");
5765 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5766 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5767 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5768 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5769 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5770 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005771 verifyFormat("void Fn(T const &) const &;");
5772 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005773 verifyFormat("template <typename T>\n"
5774 "void F(T) && = delete;",
5775 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005776
Daniel Jasperaf642c62015-08-25 13:40:51 +00005777 FormatStyle AlignLeft = getLLVMStyle();
5778 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005779 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005780 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5781 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5782 AlignLeft);
5783 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5784 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005785 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5786 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5787 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5788 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005789 verifyFormat("void Fn(T const&) const&;", AlignLeft);
5790 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005791
5792 FormatStyle Spaces = getLLVMStyle();
5793 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005794 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5795 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5796 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5797 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005798
5799 Spaces.SpacesInCStyleCastParentheses = false;
5800 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005801 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5802 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5803 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5804 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005805}
5806
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005807TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005808 verifyFormat("void f() {\n"
5809 " A *a = new A;\n"
5810 " A *a = new (placement) A;\n"
5811 " delete a;\n"
5812 " delete (A *)a;\n"
5813 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005814 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5815 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005816 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5817 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5818 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005819 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005820}
5821
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005822TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005823 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005824 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005825 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005826 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005827 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005828 verifyIndependentOfContext("int a = b * 10;");
5829 verifyIndependentOfContext("int a = 10 * b;");
5830 verifyIndependentOfContext("int a = b * c;");
5831 verifyIndependentOfContext("int a += b * c;");
5832 verifyIndependentOfContext("int a -= b * c;");
5833 verifyIndependentOfContext("int a *= b * c;");
5834 verifyIndependentOfContext("int a /= b * c;");
5835 verifyIndependentOfContext("int a = *b;");
5836 verifyIndependentOfContext("int a = *b * c;");
5837 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005838 verifyIndependentOfContext("int a = b * (10);");
5839 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005840 verifyIndependentOfContext("return 10 * b;");
5841 verifyIndependentOfContext("return *b * *c;");
5842 verifyIndependentOfContext("return a & ~b;");
5843 verifyIndependentOfContext("f(b ? *c : *d);");
5844 verifyIndependentOfContext("int a = b ? *c : *d;");
5845 verifyIndependentOfContext("*b = a;");
5846 verifyIndependentOfContext("a * ~b;");
5847 verifyIndependentOfContext("a * !b;");
5848 verifyIndependentOfContext("a * +b;");
5849 verifyIndependentOfContext("a * -b;");
5850 verifyIndependentOfContext("a * ++b;");
5851 verifyIndependentOfContext("a * --b;");
5852 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005853 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005854 verifyIndependentOfContext("f() * b;");
5855 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005856 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005857 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005858 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005859 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005860 verifyIndependentOfContext("return sizeof(int **);");
5861 verifyIndependentOfContext("return sizeof(int ******);");
5862 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005863 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005864 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005865 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005866 verifyGoogleFormat("return sizeof(int**);");
5867 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5868 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005869 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005870 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005871 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005872 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005873 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005874 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005875 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005876 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005877 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005878 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005879 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005880 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005881 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005882 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005883 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005884 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00005885 verifyFormat("void f(const MyOverride &override);");
5886 verifyFormat("void f(const MyFinal &final);");
5887 verifyIndependentOfContext("bool a = f() && override.f();");
5888 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00005889
Daniel Jasper5b49f472013-01-23 12:10:53 +00005890 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005891
Daniel Jasper5b49f472013-01-23 12:10:53 +00005892 verifyIndependentOfContext("A<int *> a;");
5893 verifyIndependentOfContext("A<int **> a;");
5894 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005895 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005896 verifyIndependentOfContext(
5897 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005898 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005899 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005900 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005901 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005902 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005903
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005904 verifyFormat(
5905 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5906 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5907
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005908 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005909 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005910 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005911 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005912 verifyGoogleFormat("A<int*> a;");
5913 verifyGoogleFormat("A<int**> a;");
5914 verifyGoogleFormat("A<int*, int*> a;");
5915 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005916 verifyGoogleFormat("f(b ? *c : *d);");
5917 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005918 verifyGoogleFormat("Type* t = **x;");
5919 verifyGoogleFormat("Type* t = *++*x;");
5920 verifyGoogleFormat("*++*x;");
5921 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5922 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005923 verifyGoogleFormat(
5924 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005925 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005926 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5927 verifyGoogleFormat("template <typename T>\n"
5928 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005929
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005930 FormatStyle Left = getLLVMStyle();
5931 Left.PointerAlignment = FormatStyle::PAS_Left;
5932 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005933 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005934 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00005935 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00005936 verifyFormat("delete *x;", Left);
5937 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
5938 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
5939 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005940
Daniel Jasper5b49f472013-01-23 12:10:53 +00005941 verifyIndependentOfContext("a = *(x + y);");
5942 verifyIndependentOfContext("a = &(x + y);");
5943 verifyIndependentOfContext("*(x + y).call();");
5944 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005945 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005946
Daniel Jasper5b49f472013-01-23 12:10:53 +00005947 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005948 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005949 "int *MyValues = {\n"
5950 " *A, // Operator detection might be confused by the '{'\n"
5951 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005952 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005953
Daniel Jasper5b49f472013-01-23 12:10:53 +00005954 verifyIndependentOfContext("if (int *a = &b)");
5955 verifyIndependentOfContext("if (int &a = *b)");
5956 verifyIndependentOfContext("if (a & b[i])");
5957 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5958 verifyIndependentOfContext("if (*b[i])");
5959 verifyIndependentOfContext("if (int *a = (&b))");
5960 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005961 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005962 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005963 verifyFormat("void f() {\n"
5964 " for (const int &v : Values) {\n"
5965 " }\n"
5966 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005967 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5968 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005969 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005970
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005971 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005972 verifyFormat("#define MACRO \\\n"
5973 " int *i = a * b; \\\n"
5974 " void f(a *b);",
5975 getLLVMStyleWithColumns(19));
5976
Daniel Jasper97b89482013-03-13 07:49:51 +00005977 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005978 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005979 verifyIndependentOfContext("T **t = new T *;");
5980 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005981 verifyGoogleFormat("A = new SomeType*[Length]();");
5982 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005983 verifyGoogleFormat("T** t = new T*;");
5984 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005985
Daniel Jaspera65e8872014-03-25 10:52:45 +00005986 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5987 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005988 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005989 "typename t::if<x && y>::type f() {}");
5990 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005991 verifyFormat("vector<int *> v;");
5992 verifyFormat("vector<int *const> v;");
5993 verifyFormat("vector<int *const **const *> v;");
5994 verifyFormat("vector<int *volatile> v;");
5995 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005996 verifyFormat("foo<b && false>();");
5997 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005998 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005999 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006000 "template <class T, class = typename std::enable_if<\n"
6001 " std::is_integral<T>::value &&\n"
6002 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
6003 "void F();",
6004 getLLVMStyleWithColumns(70));
6005 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006006 "template <class T,\n"
6007 " class = typename std::enable_if<\n"
6008 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006009 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
6010 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006011 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006012 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006013 verifyFormat(
6014 "template <class T,\n"
6015 " class = typename ::std::enable_if<\n"
6016 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6017 "void F();",
6018 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006019
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006020 verifyIndependentOfContext("MACRO(int *i);");
6021 verifyIndependentOfContext("MACRO(auto *a);");
6022 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00006023 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006024 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006025 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006026 // FIXME: Is there a way to make this work?
6027 // verifyIndependentOfContext("MACRO(A *a);");
6028
Daniel Jasper32ccb032014-06-23 07:36:18 +00006029 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006030 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006031
Daniel Jasper866468a2014-04-14 13:15:29 +00006032 EXPECT_EQ("#define OP(x) \\\n"
6033 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6034 " return s << a.DebugString(); \\\n"
6035 " }",
6036 format("#define OP(x) \\\n"
6037 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6038 " return s << a.DebugString(); \\\n"
6039 " }",
6040 getLLVMStyleWithColumns(50)));
6041
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006042 // FIXME: We cannot handle this case yet; we might be able to figure out that
6043 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006044 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006045
6046 FormatStyle PointerMiddle = getLLVMStyle();
6047 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6048 verifyFormat("delete *x;", PointerMiddle);
6049 verifyFormat("int * x;", PointerMiddle);
6050 verifyFormat("template <int * y> f() {}", PointerMiddle);
6051 verifyFormat("int * f(int * a) {}", PointerMiddle);
6052 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6053 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6054 verifyFormat("A<int *> a;", PointerMiddle);
6055 verifyFormat("A<int **> a;", PointerMiddle);
6056 verifyFormat("A<int *, int *> a;", PointerMiddle);
6057 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006058 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6059 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006060 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006061
6062 // Member function reference qualifiers aren't binary operators.
6063 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006064 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006065 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006066 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006067 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006068 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006069}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006070
Daniel Jasperee6d6502013-07-17 20:25:02 +00006071TEST_F(FormatTest, UnderstandsAttributes) {
6072 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006073 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6074 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006075 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006076 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006077 verifyFormat("__attribute__((nodebug)) void\n"
6078 "foo() {}\n",
6079 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006080}
6081
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006082TEST_F(FormatTest, UnderstandsSquareAttributes) {
6083 verifyFormat("SomeType s [[unused]] (InitValue);");
6084 verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
6085 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
6086 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
6087 verifyFormat("void f() [[deprecated(\"so sorry\")]];");
6088 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6089 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
6090}
6091
Daniel Jasper10cd5812013-05-06 06:35:44 +00006092TEST_F(FormatTest, UnderstandsEllipsis) {
6093 verifyFormat("int printf(const char *fmt, ...);");
6094 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006095 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6096
6097 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006098 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006099 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006100}
6101
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006102TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006103 EXPECT_EQ("int *a;\n"
6104 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006105 "int *a;",
6106 format("int *a;\n"
6107 "int* a;\n"
6108 "int *a;",
6109 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006110 EXPECT_EQ("int* a;\n"
6111 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006112 "int* a;",
6113 format("int* a;\n"
6114 "int* a;\n"
6115 "int *a;",
6116 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006117 EXPECT_EQ("int *a;\n"
6118 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006119 "int *a;",
6120 format("int *a;\n"
6121 "int * a;\n"
6122 "int * a;",
6123 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006124 EXPECT_EQ("auto x = [] {\n"
6125 " int *a;\n"
6126 " int *a;\n"
6127 " int *a;\n"
6128 "};",
6129 format("auto x=[]{int *a;\n"
6130 "int * a;\n"
6131 "int * a;};",
6132 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006133}
6134
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006135TEST_F(FormatTest, UnderstandsRvalueReferences) {
6136 verifyFormat("int f(int &&a) {}");
6137 verifyFormat("int f(int a, char &&b) {}");
6138 verifyFormat("void f() { int &&a = b; }");
6139 verifyGoogleFormat("int f(int a, char&& b) {}");
6140 verifyGoogleFormat("void f() { int&& a = b; }");
6141
Daniel Jasper1eff9082013-05-27 16:36:33 +00006142 verifyIndependentOfContext("A<int &&> a;");
6143 verifyIndependentOfContext("A<int &&, int &&> a;");
6144 verifyGoogleFormat("A<int&&> a;");
6145 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006146
6147 // Not rvalue references:
6148 verifyFormat("template <bool B, bool C> class A {\n"
6149 " static_assert(B && C, \"Something is wrong\");\n"
6150 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006151 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6152 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006153 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006154}
6155
Manuel Klimekc1237a82013-01-23 14:08:21 +00006156TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6157 verifyFormat("void f() {\n"
6158 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006159 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006160 "}",
6161 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006162}
6163
Daniel Jasperef906a92013-01-13 08:01:36 +00006164TEST_F(FormatTest, FormatsCasts) {
6165 verifyFormat("Type *A = static_cast<Type *>(P);");
6166 verifyFormat("Type *A = (Type *)P;");
6167 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6168 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006169 verifyFormat("int a = (int)2.0f;");
6170 verifyFormat("x[(int32)y];");
6171 verifyFormat("x = (int32)y;");
6172 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6173 verifyFormat("int a = (int)*b;");
6174 verifyFormat("int a = (int)2.0f;");
6175 verifyFormat("int a = (int)~0;");
6176 verifyFormat("int a = (int)++a;");
6177 verifyFormat("int a = (int)sizeof(int);");
6178 verifyFormat("int a = (int)+2;");
6179 verifyFormat("my_int a = (my_int)2.0f;");
6180 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006181 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006182 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006183 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006184 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006185 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006186
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006187 verifyFormat("void f() { my_int a = (my_int)*b; }");
6188 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6189 verifyFormat("my_int a = (my_int)~0;");
6190 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006191 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006192 verifyFormat("my_int a = (my_int)1;");
6193 verifyFormat("my_int a = (my_int *)1;");
6194 verifyFormat("my_int a = (const my_int)-1;");
6195 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006196 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006197 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006198 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006199 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006200
6201 // FIXME: single value wrapped with paren will be treated as cast.
6202 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006203
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006204 verifyFormat("{ (void)F; }");
6205
Daniel Jasper998cabc2013-07-18 14:46:07 +00006206 // Don't break after a cast's
6207 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6208 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6209 " bbbbbbbbbbbbbbbbbbbbbb);");
6210
Daniel Jasperef906a92013-01-13 08:01:36 +00006211 // These are not casts.
6212 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006213 verifyFormat("f(foo)->b;");
6214 verifyFormat("f(foo).b;");
6215 verifyFormat("f(foo)(b);");
6216 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006217 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006218 verifyFormat("(*funptr)(foo)[4];");
6219 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006220 verifyFormat("void f(int *);");
6221 verifyFormat("void f(int *) = 0;");
6222 verifyFormat("void f(SmallVector<int>) {}");
6223 verifyFormat("void f(SmallVector<int>);");
6224 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006225 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006226 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006227 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006228 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6229 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006230 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006231
Daniel Jasperba0bda92013-02-23 08:07:18 +00006232 // These are not casts, but at some point were confused with casts.
6233 verifyFormat("virtual void foo(int *) override;");
6234 verifyFormat("virtual void foo(char &) const;");
6235 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006236 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006237 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006238 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006239 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006240
6241 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6242 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006243 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006244 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006245 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6246 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6247 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006248}
6249
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006250TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006251 verifyFormat("A<bool()> a;");
6252 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006253 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006254 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006255 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006256 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006257 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006258 verifyFormat("template <class CallbackClass>\n"
6259 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006260
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006261 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6262 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006263 verifyGoogleFormat(
6264 "template <class CallbackClass>\n"
6265 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006266
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006267 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006268 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006269 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006270 verifyFormat("some_var = function(*some_pointer_var)[0];");
6271 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006272 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006273 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00006274 verifyFormat("std::function<\n"
6275 " LooooooooooongTemplatedType<\n"
6276 " SomeType>*(\n"
6277 " LooooooooooooooooongType type)>\n"
6278 " function;",
6279 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006280}
6281
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006282TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6283 verifyFormat("A (*foo_)[6];");
6284 verifyFormat("vector<int> (*foo_)[6];");
6285}
6286
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006287TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6288 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6289 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6290 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6291 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006292 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6293 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006294
6295 // Different ways of ()-initializiation.
6296 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6297 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6298 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6299 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6300 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6301 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006302 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6303 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006304
6305 // Lambdas should not confuse the variable declaration heuristic.
6306 verifyFormat("LooooooooooooooooongType\n"
6307 " variable(nullptr, [](A *a) {});",
6308 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006309}
6310
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006311TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006312 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006313 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006314 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006315 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006316 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006317 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006318 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6319 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006320 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6321 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006322 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6323 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006324 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6325 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006326 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6327 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006328 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6329 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6330 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6331 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006332 FormatStyle Indented = getLLVMStyle();
6333 Indented.IndentWrappedFunctionNames = true;
6334 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6335 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6336 Indented);
6337 verifyFormat(
6338 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6339 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6340 Indented);
6341 verifyFormat(
6342 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6343 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6344 Indented);
6345 verifyFormat(
6346 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6347 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6348 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006349
6350 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006351 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6352 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6353 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006354
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006355 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006356 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006357 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006358 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6359 " SourceLocation L, IdentifierIn *II,\n"
6360 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006361 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006362 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006363 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006364 " const SomeType<string, SomeOtherTemplateParameter>\n"
6365 " &ReallyReallyLongParameterName,\n"
6366 " const SomeType<string, SomeOtherTemplateParameter>\n"
6367 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006368 verifyFormat("template <typename A>\n"
6369 "SomeLoooooooooooooooooooooongType<\n"
6370 " typename some_namespace::SomeOtherType<A>::Type>\n"
6371 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006372
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006373 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006374 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6375 " aaaaaaaaaaaaaaaaaaaaaaa;");
6376 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006377 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6378 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006379 verifyGoogleFormat(
6380 "some_namespace::LongReturnType\n"
6381 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006382 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006383
6384 verifyGoogleFormat("template <typename T>\n"
6385 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006386 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006387 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6388 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006389
6390 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006391 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6392 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006393 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6394 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6395 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6396 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6397 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6398 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6399 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006400
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006401 verifyFormat("template <typename T> // Templates on own line.\n"
6402 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006403 "MyFunction(int a);",
6404 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006405}
6406
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006407TEST_F(FormatTest, FormatsArrays) {
6408 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6409 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006410 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6411 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006412 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6413 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006414 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6415 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6416 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6417 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6418 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6419 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6420 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6421 verifyFormat(
6422 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6423 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6424 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006425 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6426 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006427
6428 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6429 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006430 verifyFormat(
6431 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6432 " .aaaaaaa[0]\n"
6433 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006434 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006435
6436 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006437
6438 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6439 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006440}
6441
Daniel Jaspere9de2602012-12-06 09:56:08 +00006442TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6443 verifyFormat("(a)->b();");
6444 verifyFormat("--a;");
6445}
6446
Daniel Jasper8b529712012-12-04 13:02:32 +00006447TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006448 verifyFormat("#include <string>\n"
6449 "#include <a/b/c.h>\n"
6450 "#include \"a/b/string\"\n"
6451 "#include \"string.h\"\n"
6452 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006453 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006454 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006455 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006456 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006457 "#include \"some long include\" // with a comment\n"
Manuel Klimek45ab5592017-11-14 09:19:53 +00006458 "#include \"some very long include path\"\n"
6459 "#include <some/very/long/include/path>\n",
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006460 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006461 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6462 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006463
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006464 verifyFormat("#import <string>");
6465 verifyFormat("#import <a/b/c.h>");
6466 verifyFormat("#import \"a/b/string\"");
6467 verifyFormat("#import \"string.h\"");
6468 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006469 verifyFormat("#if __has_include(<strstream>)\n"
6470 "#include <strstream>\n"
6471 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006472
Daniel Jasper343643b2014-08-13 08:29:18 +00006473 verifyFormat("#define MY_IMPORT <a/b>");
6474
Nico Weber21088802017-02-10 19:36:52 +00006475 verifyFormat("#if __has_include(<a/b>)");
6476 verifyFormat("#if __has_include_next(<a/b>)");
6477 verifyFormat("#define F __has_include(<a/b>)");
6478 verifyFormat("#define F __has_include_next(<a/b>)");
6479
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006480 // Protocol buffer definition or missing "#".
6481 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6482 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006483
6484 FormatStyle Style = getLLVMStyle();
6485 Style.AlwaysBreakBeforeMultilineStrings = true;
6486 Style.ColumnLimit = 0;
6487 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006488
6489 // But 'import' might also be a regular C++ namespace.
6490 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6491 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006492}
6493
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006494//===----------------------------------------------------------------------===//
6495// Error recovery tests.
6496//===----------------------------------------------------------------------===//
6497
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006498TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006499 FormatStyle NoBinPacking = getLLVMStyle();
6500 NoBinPacking.BinPackParameters = false;
6501 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6502 " double *min_x,\n"
6503 " double *max_x,\n"
6504 " double *min_y,\n"
6505 " double *max_y,\n"
6506 " double *min_z,\n"
6507 " double *max_z, ) {}",
6508 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006509}
6510
Daniel Jasper83a54d22013-01-10 09:26:47 +00006511TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006512 verifyFormat("void f() { return; }\n42");
6513 verifyFormat("void f() {\n"
6514 " if (0)\n"
6515 " return;\n"
6516 "}\n"
6517 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006518 verifyFormat("void f() { return }\n42");
6519 verifyFormat("void f() {\n"
6520 " if (0)\n"
6521 " return\n"
6522 "}\n"
6523 "42");
6524}
6525
6526TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6527 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6528 EXPECT_EQ("void f() {\n"
6529 " if (a)\n"
6530 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006531 "}",
6532 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006533 EXPECT_EQ("namespace N {\n"
6534 "void f()\n"
6535 "}",
6536 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006537 EXPECT_EQ("namespace N {\n"
6538 "void f() {}\n"
6539 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006540 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006541 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006542}
6543
Daniel Jasper2df93312013-01-09 10:16:05 +00006544TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6545 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006546 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006547 " b;",
6548 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006549 verifyFormat("function(\n"
6550 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006551 " LoooooooooooongArgument);\n",
6552 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006553}
6554
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006555TEST_F(FormatTest, IncorrectAccessSpecifier) {
6556 verifyFormat("public:");
6557 verifyFormat("class A {\n"
6558 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006559 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006560 "};");
6561 verifyFormat("public\n"
6562 "int qwerty;");
6563 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006564 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006565 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006566 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006567 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006568 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006569}
Daniel Jasperf7935112012-12-03 18:12:45 +00006570
Daniel Jasper291f9362013-03-20 15:58:10 +00006571TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6572 verifyFormat("{");
6573 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006574 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006575}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006576
6577TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006578 verifyFormat("do {\n}");
6579 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006580 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006581 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006582 "wheeee(fun);");
6583 verifyFormat("do {\n"
6584 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006585 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006586}
6587
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006588TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006589 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006590 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006591 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006592 verifyFormat("while {\n foo;\n foo();\n}");
6593 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006594}
6595
Daniel Jasperc0880a92013-01-04 18:52:56 +00006596TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006597 verifyIncompleteFormat("namespace {\n"
6598 "class Foo { Foo (\n"
6599 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006600 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006601}
6602
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006603TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006604 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006605 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6606 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006607 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006608
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006609 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006610 " {\n"
6611 " breakme(\n"
6612 " qwe);\n"
6613 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006614 format("{\n"
6615 " {\n"
6616 " breakme(qwe);\n"
6617 "}\n",
6618 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006619}
6620
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006621TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006622 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006623 " avariable,\n"
6624 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006625 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006626}
6627
Manuel Klimek762dd182013-01-21 10:07:49 +00006628TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006629 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006630}
6631
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006632TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006633 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006634 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006635 " 1,\n"
6636 " 2,\n"
6637 " 3,\n"
6638 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006639 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006640 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6641 verifyFormat("f({1, 2});");
6642 verifyFormat("auto v = Foo{-1};");
6643 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6644 verifyFormat("Class::Class : member{1, 2, 3} {}");
6645 verifyFormat("new vector<int>{1, 2, 3};");
6646 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006647 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006648 verifyFormat("return {arg1, arg2};");
6649 verifyFormat("return {arg1, SomeType{parameter}};");
6650 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6651 verifyFormat("new T{arg1, arg2};");
6652 verifyFormat("f(MyMap[{composite, key}]);");
6653 verifyFormat("class Class {\n"
6654 " T member = {arg1, arg2};\n"
6655 "};");
6656 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006657 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6658 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006659 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6660 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006661
Daniel Jasper438059e2014-05-22 12:11:13 +00006662 verifyFormat("int foo(int i) { return fo1{}(i); }");
6663 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006664 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006665 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006666 verifyFormat("Node n{1, Node{1000}, //\n"
6667 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006668 verifyFormat("Aaaa aaaaaaa{\n"
6669 " {\n"
6670 " aaaa,\n"
6671 " },\n"
6672 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006673 verifyFormat("class C : public D {\n"
6674 " SomeClass SC{2};\n"
6675 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006676 verifyFormat("class C : public A {\n"
6677 " class D : public B {\n"
6678 " void f() { int i{2}; }\n"
6679 " };\n"
6680 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006681 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006682
Francois Ferrandd2130f52017-06-30 20:00:02 +00006683 // Binpacking only if there is no trailing comma
6684 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6685 " cccccccccc, dddddddddd};",
6686 getLLVMStyleWithColumns(50));
6687 verifyFormat("const Aaaaaa aaaaa = {\n"
6688 " aaaaaaaaaaa,\n"
6689 " bbbbbbbbbbb,\n"
6690 " ccccccccccc,\n"
6691 " ddddddddddd,\n"
6692 "};", getLLVMStyleWithColumns(50));
6693
Daniel Jaspere4ada022016-12-13 10:05:03 +00006694 // Cases where distinguising braced lists and blocks is hard.
6695 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6696 verifyFormat("void f() {\n"
6697 " return; // comment\n"
6698 "}\n"
6699 "SomeType t;");
6700 verifyFormat("void f() {\n"
6701 " if (a) {\n"
6702 " f();\n"
6703 " }\n"
6704 "}\n"
6705 "SomeType t;");
6706
Daniel Jasper08434342015-05-26 07:26:26 +00006707 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006708 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006709 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006710 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6711 " bbbbb,\n"
6712 " ccccc,\n"
6713 " ddddd,\n"
6714 " eeeee,\n"
6715 " ffffff,\n"
6716 " ggggg,\n"
6717 " hhhhhh,\n"
6718 " iiiiii,\n"
6719 " jjjjjj,\n"
6720 " kkkkkk};",
6721 NoBinPacking);
6722 verifyFormat("const Aaaaaa aaaaa = {\n"
6723 " aaaaa,\n"
6724 " bbbbb,\n"
6725 " ccccc,\n"
6726 " ddddd,\n"
6727 " eeeee,\n"
6728 " ffffff,\n"
6729 " ggggg,\n"
6730 " hhhhhh,\n"
6731 " iiiiii,\n"
6732 " jjjjjj,\n"
6733 " kkkkkk,\n"
6734 "};",
6735 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006736 verifyFormat(
6737 "const Aaaaaa aaaaa = {\n"
6738 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6739 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6740 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6741 "};",
6742 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006743
Chandler Carruthf8b72662014-03-02 12:37:31 +00006744 // FIXME: The alignment of these trailing comments might be bad. Then again,
6745 // this might be utterly useless in real code.
6746 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006747 " : some_value{ //\n"
6748 " aaaaaaa, //\n"
6749 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006750
Chandler Carruthf8b72662014-03-02 12:37:31 +00006751 // In braced lists, the first comment is always assumed to belong to the
6752 // first element. Thus, it can be moved to the next or previous line as
6753 // appropriate.
6754 EXPECT_EQ("function({// First element:\n"
6755 " 1,\n"
6756 " // Second element:\n"
6757 " 2});",
6758 format("function({\n"
6759 " // First element:\n"
6760 " 1,\n"
6761 " // Second element:\n"
6762 " 2});"));
6763 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6764 " // First element:\n"
6765 " 1,\n"
6766 " // Second element:\n"
6767 " 2};",
6768 format("std::vector<int> MyNumbers{// First element:\n"
6769 " 1,\n"
6770 " // Second element:\n"
6771 " 2};",
6772 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00006773 // A trailing comma should still lead to an enforced line break and no
6774 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00006775 EXPECT_EQ("vector<int> SomeVector = {\n"
6776 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006777 " 1,\n"
6778 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006779 "};",
6780 format("vector<int> SomeVector = { // aaa\n"
6781 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006782
Chandler Carruthf8b72662014-03-02 12:37:31 +00006783 FormatStyle ExtraSpaces = getLLVMStyle();
6784 ExtraSpaces.Cpp11BracedListStyle = false;
6785 ExtraSpaces.ColumnLimit = 75;
6786 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6787 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6788 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6789 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6790 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6791 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6792 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6793 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6794 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6795 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6796 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6797 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6798 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6799 verifyFormat("class Class {\n"
6800 " T member = { arg1, arg2 };\n"
6801 "};",
6802 ExtraSpaces);
6803 verifyFormat(
6804 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6805 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6806 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6807 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6808 ExtraSpaces);
6809 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006810 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006811 ExtraSpaces);
6812 verifyFormat(
6813 "someFunction(OtherParam,\n"
6814 " BracedList{ // comment 1 (Forcing interesting break)\n"
6815 " param1, param2,\n"
6816 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006817 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006818 ExtraSpaces);
6819 verifyFormat(
6820 "std::this_thread::sleep_for(\n"
6821 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6822 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006823 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006824 " aaaaaaa,\n"
6825 " aaaaaaaaaa,\n"
6826 " aaaaa,\n"
6827 " aaaaaaaaaaaaaaa,\n"
6828 " aaa,\n"
6829 " aaaaaaaaaa,\n"
6830 " a,\n"
6831 " aaaaaaaaaaaaaaaaaaaaa,\n"
6832 " aaaaaaaaaaaa,\n"
6833 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6834 " aaaaaaa,\n"
6835 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006836 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00006837 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
6838 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006839}
6840
Daniel Jasper33b909c2013-10-25 14:29:37 +00006841TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006842 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6843 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6844 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6845 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6846 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6847 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006848 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006849 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006850 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006851 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6852 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006853 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006854 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6855 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6856 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6857 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6858 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6859 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6860 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006861 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006862 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6863 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006864 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6865 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6866 " // Separating comment.\n"
6867 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6868 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6869 " // Leading comment\n"
6870 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6871 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006872 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6873 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006874 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006875 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6876 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006877 getLLVMStyleWithColumns(38));
6878 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006879 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6880 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006881 verifyFormat(
6882 "static unsigned SomeValues[10][3] = {\n"
6883 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6884 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6885 verifyFormat("static auto fields = new vector<string>{\n"
6886 " \"aaaaaaaaaaaaa\",\n"
6887 " \"aaaaaaaaaaaaa\",\n"
6888 " \"aaaaaaaaaaaa\",\n"
6889 " \"aaaaaaaaaaaaaa\",\n"
6890 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6891 " \"aaaaaaaaaaaa\",\n"
6892 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6893 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006894 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6895 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6896 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6897 " 3, cccccccccccccccccccccc};",
6898 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006899
6900 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006901 verifyFormat("vector<int> x = {\n"
6902 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6903 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006904 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006905 verifyFormat("vector<int> x = {\n"
6906 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006907 "};",
6908 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006909 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6910 " 1, 1, 1, 1,\n"
6911 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006912 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006913
Daniel Jasper60c27072015-05-13 08:16:00 +00006914 // Trailing comment in the first line.
6915 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6916 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6917 " 111111111, 222222222, 3333333333, 444444444, //\n"
6918 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006919 // Trailing comment in the last line.
6920 verifyFormat("int aaaaa[] = {\n"
6921 " 1, 2, 3, // comment\n"
6922 " 4, 5, 6 // comment\n"
6923 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006924
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006925 // With nested lists, we should either format one item per line or all nested
6926 // lists one on line.
6927 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006928 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6929 " {aaaaaaaaaaaaaaaaaaa},\n"
6930 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6931 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006932 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006933 verifyFormat(
6934 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006935 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6936 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6937 " {aaa, aaa},\n"
6938 " {aaa, aaa},\n"
6939 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6940 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6941 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006942
6943 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00006944 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006945 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006946
6947 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006948
Daniel Jaspereb65e912015-12-21 18:31:15 +00006949 // No braced initializer here.
6950 verifyFormat("void f() {\n"
6951 " struct Dummy {};\n"
6952 " f(v);\n"
6953 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006954
6955 // Long lists should be formatted in columns even if they are nested.
6956 verifyFormat(
6957 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6958 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6959 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6960 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6961 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6962 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006963
6964 // Allow "single-column" layout even if that violates the column limit. There
6965 // isn't going to be a better way.
6966 verifyFormat("std::vector<int> a = {\n"
6967 " aaaaaaaa,\n"
6968 " aaaaaaaa,\n"
6969 " aaaaaaaa,\n"
6970 " aaaaaaaa,\n"
6971 " aaaaaaaaaa,\n"
6972 " aaaaaaaa,\n"
6973 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6974 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006975 verifyFormat("vector<int> aaaa = {\n"
6976 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6977 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6978 " aaaaaa.aaaaaaa,\n"
6979 " aaaaaa.aaaaaaa,\n"
6980 " aaaaaa.aaaaaaa,\n"
6981 " aaaaaa.aaaaaaa,\n"
6982 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006983
6984 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006985 verifyFormat("someFunction(Param, {List1, List2,\n"
6986 " List3});",
6987 getLLVMStyleWithColumns(35));
6988 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006989 " {List1, List2,\n"
6990 " List3});",
6991 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006992 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6993 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006994}
6995
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006996TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006997 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006998 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006999
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007000 verifyFormat("void f() { return 42; }");
7001 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007002 " return 42;\n"
7003 "}",
7004 DoNotMerge);
7005 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007006 " // Comment\n"
7007 "}");
7008 verifyFormat("{\n"
7009 "#error {\n"
7010 " int a;\n"
7011 "}");
7012 verifyFormat("{\n"
7013 " int a;\n"
7014 "#error {\n"
7015 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007016 verifyFormat("void f() {} // comment");
7017 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007018 verifyFormat("void f() {\n"
7019 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007020 DoNotMerge);
7021 verifyFormat("void f() {\n"
7022 " int a;\n"
7023 "} // comment",
7024 DoNotMerge);
7025 verifyFormat("void f() {\n"
7026 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007027 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007028
7029 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7030 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7031
7032 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7033 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007034 verifyFormat("class C {\n"
7035 " C()\n"
7036 " : iiiiiiii(nullptr),\n"
7037 " kkkkkkk(nullptr),\n"
7038 " mmmmmmm(nullptr),\n"
7039 " nnnnnnn(nullptr) {}\n"
7040 "};",
7041 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007042
7043 FormatStyle NoColumnLimit = getLLVMStyle();
7044 NoColumnLimit.ColumnLimit = 0;
7045 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7046 EXPECT_EQ("class C {\n"
7047 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007048 "};",
7049 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007050 EXPECT_EQ("A()\n"
7051 " : b(0) {\n"
7052 "}",
7053 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7054
7055 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007056 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7057 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007058 EXPECT_EQ("A()\n"
7059 " : b(0) {\n"
7060 "}",
7061 format("A():b(0){}", DoNotMergeNoColumnLimit));
7062 EXPECT_EQ("A()\n"
7063 " : b(0) {\n"
7064 "}",
7065 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007066
7067 verifyFormat("#define A \\\n"
7068 " void f() { \\\n"
7069 " int i; \\\n"
7070 " }",
7071 getLLVMStyleWithColumns(20));
7072 verifyFormat("#define A \\\n"
7073 " void f() { int i; }",
7074 getLLVMStyleWithColumns(21));
7075 verifyFormat("#define A \\\n"
7076 " void f() { \\\n"
7077 " int i; \\\n"
7078 " } \\\n"
7079 " int j;",
7080 getLLVMStyleWithColumns(22));
7081 verifyFormat("#define A \\\n"
7082 " void f() { int i; } \\\n"
7083 " int j;",
7084 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007085}
7086
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007087TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
7088 FormatStyle MergeEmptyOnly = getLLVMStyle();
7089 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7090 verifyFormat("class C {\n"
7091 " int f() {}\n"
7092 "};",
7093 MergeEmptyOnly);
7094 verifyFormat("class C {\n"
7095 " int f() {\n"
7096 " return 42;\n"
7097 " }\n"
7098 "};",
7099 MergeEmptyOnly);
7100 verifyFormat("int f() {}", MergeEmptyOnly);
7101 verifyFormat("int f() {\n"
7102 " return 42;\n"
7103 "}",
7104 MergeEmptyOnly);
7105
7106 // Also verify behavior when BraceWrapping.AfterFunction = true
7107 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7108 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
7109 verifyFormat("int f() {}", MergeEmptyOnly);
7110 verifyFormat("class C {\n"
7111 " int f() {}\n"
7112 "};",
7113 MergeEmptyOnly);
7114}
7115
Daniel Jasperd74cf402014-04-08 12:46:38 +00007116TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7117 FormatStyle MergeInlineOnly = getLLVMStyle();
7118 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7119 verifyFormat("class C {\n"
7120 " int f() { return 42; }\n"
7121 "};",
7122 MergeInlineOnly);
7123 verifyFormat("int f() {\n"
7124 " return 42;\n"
7125 "}",
7126 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007127
7128 // SFS_Inline implies SFS_Empty
7129 verifyFormat("class C {\n"
7130 " int f() {}\n"
7131 "};",
7132 MergeInlineOnly);
7133 verifyFormat("int f() {}", MergeInlineOnly);
7134
7135 // Also verify behavior when BraceWrapping.AfterFunction = true
7136 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7137 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7138 verifyFormat("class C {\n"
7139 " int f() { return 42; }\n"
7140 "};",
7141 MergeInlineOnly);
7142 verifyFormat("int f()\n"
7143 "{\n"
7144 " return 42;\n"
7145 "}",
7146 MergeInlineOnly);
7147
7148 // SFS_Inline implies SFS_Empty
7149 verifyFormat("int f() {}", MergeInlineOnly);
7150 verifyFormat("class C {\n"
7151 " int f() {}\n"
7152 "};",
7153 MergeInlineOnly);
7154}
7155
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00007156TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
7157 FormatStyle MergeInlineOnly = getLLVMStyle();
7158 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
7159 FormatStyle::SFS_InlineOnly;
7160 verifyFormat("class C {\n"
7161 " int f() { return 42; }\n"
7162 "};",
7163 MergeInlineOnly);
7164 verifyFormat("int f() {\n"
7165 " return 42;\n"
7166 "}",
7167 MergeInlineOnly);
7168
7169 // SFS_InlineOnly does not imply SFS_Empty
7170 verifyFormat("class C {\n"
7171 " int f() {}\n"
7172 "};",
7173 MergeInlineOnly);
7174 verifyFormat("int f() {\n"
7175 "}",
7176 MergeInlineOnly);
7177
7178 // Also verify behavior when BraceWrapping.AfterFunction = true
7179 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7180 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7181 verifyFormat("class C {\n"
7182 " int f() { return 42; }\n"
7183 "};",
7184 MergeInlineOnly);
7185 verifyFormat("int f()\n"
7186 "{\n"
7187 " return 42;\n"
7188 "}",
7189 MergeInlineOnly);
7190
7191 // SFS_InlineOnly does not imply SFS_Empty
7192 verifyFormat("int f()\n"
7193 "{\n"
7194 "}",
7195 MergeInlineOnly);
7196 verifyFormat("class C {\n"
7197 " int f() {}\n"
7198 "};",
7199 MergeInlineOnly);
7200}
7201
Francois Ferrandad722562017-06-30 20:25:55 +00007202TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007203 FormatStyle Style = getLLVMStyle();
7204 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7205 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7206 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00007207 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007208 Style.ColumnLimit = 40;
7209
7210 verifyFormat("int f()\n"
7211 "{}",
7212 Style);
7213 verifyFormat("int f()\n"
7214 "{\n"
7215 " return 42;\n"
7216 "}",
7217 Style);
7218 verifyFormat("int f()\n"
7219 "{\n"
7220 " // some comment\n"
7221 "}",
7222 Style);
7223
7224 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7225 verifyFormat("int f() {}", Style);
7226 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7227 "{}",
7228 Style);
7229 verifyFormat("int f()\n"
7230 "{\n"
7231 " return 0;\n"
7232 "}",
7233 Style);
7234
7235 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7236 verifyFormat("class Foo {\n"
7237 " int f() {}\n"
7238 "};\n",
7239 Style);
7240 verifyFormat("class Foo {\n"
7241 " int f() { return 0; }\n"
7242 "};\n",
7243 Style);
7244 verifyFormat("class Foo {\n"
7245 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7246 " {}\n"
7247 "};\n",
7248 Style);
7249 verifyFormat("class Foo {\n"
7250 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7251 " {\n"
7252 " return 0;\n"
7253 " }\n"
7254 "};\n",
7255 Style);
7256
7257 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7258 verifyFormat("int f() {}", Style);
7259 verifyFormat("int f() { return 0; }", Style);
7260 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7261 "{}",
7262 Style);
7263 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7264 "{\n"
7265 " return 0;\n"
7266 "}",
7267 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00007268}
Krasimir Georgiev6a1c9d52017-10-02 15:53:37 +00007269TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
7270 FormatStyle Style = getLLVMStyle();
7271 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7272 verifyFormat("#ifdef A\n"
7273 "int f() {}\n"
7274 "#else\n"
7275 "int g() {}\n"
7276 "#endif",
7277 Style);
7278}
Daniel Jasperd74cf402014-04-08 12:46:38 +00007279
Francois Ferrandad722562017-06-30 20:25:55 +00007280TEST_F(FormatTest, SplitEmptyClass) {
7281 FormatStyle Style = getLLVMStyle();
7282 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7283 Style.BraceWrapping.AfterClass = true;
7284 Style.BraceWrapping.SplitEmptyRecord = false;
7285
7286 verifyFormat("class Foo\n"
7287 "{};",
7288 Style);
7289 verifyFormat("/* something */ class Foo\n"
7290 "{};",
7291 Style);
7292 verifyFormat("template <typename X> class Foo\n"
7293 "{};",
7294 Style);
7295 verifyFormat("class Foo\n"
7296 "{\n"
7297 " Foo();\n"
7298 "};",
7299 Style);
7300 verifyFormat("typedef class Foo\n"
7301 "{\n"
7302 "} Foo_t;",
7303 Style);
7304}
7305
7306TEST_F(FormatTest, SplitEmptyStruct) {
7307 FormatStyle Style = getLLVMStyle();
7308 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7309 Style.BraceWrapping.AfterStruct = true;
7310 Style.BraceWrapping.SplitEmptyRecord = false;
7311
7312 verifyFormat("struct Foo\n"
7313 "{};",
7314 Style);
7315 verifyFormat("/* something */ struct Foo\n"
7316 "{};",
7317 Style);
7318 verifyFormat("template <typename X> struct Foo\n"
7319 "{};",
7320 Style);
7321 verifyFormat("struct Foo\n"
7322 "{\n"
7323 " Foo();\n"
7324 "};",
7325 Style);
7326 verifyFormat("typedef struct Foo\n"
7327 "{\n"
7328 "} Foo_t;",
7329 Style);
7330 //typedef struct Bar {} Bar_t;
7331}
7332
7333TEST_F(FormatTest, SplitEmptyUnion) {
7334 FormatStyle Style = getLLVMStyle();
7335 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7336 Style.BraceWrapping.AfterUnion = true;
7337 Style.BraceWrapping.SplitEmptyRecord = false;
7338
7339 verifyFormat("union Foo\n"
7340 "{};",
7341 Style);
7342 verifyFormat("/* something */ union Foo\n"
7343 "{};",
7344 Style);
7345 verifyFormat("union Foo\n"
7346 "{\n"
7347 " A,\n"
7348 "};",
7349 Style);
7350 verifyFormat("typedef union Foo\n"
7351 "{\n"
7352 "} Foo_t;",
7353 Style);
7354}
7355
7356TEST_F(FormatTest, SplitEmptyNamespace) {
7357 FormatStyle Style = getLLVMStyle();
7358 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7359 Style.BraceWrapping.AfterNamespace = true;
7360 Style.BraceWrapping.SplitEmptyNamespace = false;
7361
7362 verifyFormat("namespace Foo\n"
7363 "{};",
7364 Style);
7365 verifyFormat("/* something */ namespace Foo\n"
7366 "{};",
7367 Style);
7368 verifyFormat("inline namespace Foo\n"
7369 "{};",
7370 Style);
7371 verifyFormat("namespace Foo\n"
7372 "{\n"
7373 "void Bar();\n"
7374 "};",
7375 Style);
7376}
7377
7378TEST_F(FormatTest, NeverMergeShortRecords) {
7379 FormatStyle Style = getLLVMStyle();
7380
7381 verifyFormat("class Foo {\n"
7382 " Foo();\n"
7383 "};",
7384 Style);
7385 verifyFormat("typedef class Foo {\n"
7386 " Foo();\n"
7387 "} Foo_t;",
7388 Style);
7389 verifyFormat("struct Foo {\n"
7390 " Foo();\n"
7391 "};",
7392 Style);
7393 verifyFormat("typedef struct Foo {\n"
7394 " Foo();\n"
7395 "} Foo_t;",
7396 Style);
7397 verifyFormat("union Foo {\n"
7398 " A,\n"
7399 "};",
7400 Style);
7401 verifyFormat("typedef union Foo {\n"
7402 " A,\n"
7403 "} Foo_t;",
7404 Style);
7405 verifyFormat("namespace Foo {\n"
7406 "void Bar();\n"
7407 "};",
7408 Style);
7409
7410 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7411 Style.BraceWrapping.AfterClass = true;
7412 Style.BraceWrapping.AfterStruct = true;
7413 Style.BraceWrapping.AfterUnion = true;
7414 Style.BraceWrapping.AfterNamespace = true;
7415 verifyFormat("class Foo\n"
7416 "{\n"
7417 " Foo();\n"
7418 "};",
7419 Style);
7420 verifyFormat("typedef class Foo\n"
7421 "{\n"
7422 " Foo();\n"
7423 "} Foo_t;",
7424 Style);
7425 verifyFormat("struct Foo\n"
7426 "{\n"
7427 " Foo();\n"
7428 "};",
7429 Style);
7430 verifyFormat("typedef struct Foo\n"
7431 "{\n"
7432 " Foo();\n"
7433 "} Foo_t;",
7434 Style);
7435 verifyFormat("union Foo\n"
7436 "{\n"
7437 " A,\n"
7438 "};",
7439 Style);
7440 verifyFormat("typedef union Foo\n"
7441 "{\n"
7442 " A,\n"
7443 "} Foo_t;",
7444 Style);
7445 verifyFormat("namespace Foo\n"
7446 "{\n"
7447 "void Bar();\n"
7448 "};",
7449 Style);
7450}
7451
Manuel Klimeke01bab52013-01-15 13:38:33 +00007452TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7453 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007454 verifyFormat("struct foo a = {bar};\nint n;");
7455 verifyFormat("class foo a = {bar};\nint n;");
7456 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007457
7458 // Elaborate types inside function definitions.
7459 verifyFormat("struct foo f() {}\nint n;");
7460 verifyFormat("class foo f() {}\nint n;");
7461 verifyFormat("union foo f() {}\nint n;");
7462
7463 // Templates.
7464 verifyFormat("template <class X> void f() {}\nint n;");
7465 verifyFormat("template <struct X> void f() {}\nint n;");
7466 verifyFormat("template <union X> void f() {}\nint n;");
7467
7468 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007469 verifyFormat("struct {\n} n;");
7470 verifyFormat(
7471 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007472 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007473 verifyFormat("class MACRO Z {\n} n;");
7474 verifyFormat("class MACRO(X) Z {\n} n;");
7475 verifyFormat("class __attribute__(X) Z {\n} n;");
7476 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007477 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007478 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007479 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7480 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007481
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007482 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007483 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007484
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007485 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007486 verifyFormat(
7487 "template <typename F>\n"
7488 "Matcher(const Matcher<F> &Other,\n"
7489 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7490 " !is_same<F, T>::value>::type * = 0)\n"
7491 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7492
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007493 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007494 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007495 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007496
7497 // FIXME:
7498 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007499 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007500
Manuel Klimeke01bab52013-01-15 13:38:33 +00007501 // Elaborate types where incorrectly parsing the structural element would
7502 // break the indent.
7503 verifyFormat("if (true)\n"
7504 " class X x;\n"
7505 "else\n"
7506 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007507
7508 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007509 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007510}
7511
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007512TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007513 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7514 format("#error Leave all white!!!!! space* alone!\n"));
7515 EXPECT_EQ(
7516 "#warning Leave all white!!!!! space* alone!\n",
7517 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007518 EXPECT_EQ("#error 1", format(" # error 1"));
7519 EXPECT_EQ("#warning 1", format(" # warning 1"));
7520}
7521
Daniel Jasper4431aa92013-04-23 13:54:04 +00007522TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007523 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007524 verifyFormat("#if (AAAA && BBBB)");
7525 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007526 // FIXME: Come up with a better indentation for #elif.
7527 verifyFormat(
7528 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7529 " defined(BBBBBBBB)\n"
7530 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7531 " defined(BBBBBBBB)\n"
7532 "#endif",
7533 getLLVMStyleWithColumns(65));
7534}
7535
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007536TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7537 FormatStyle AllowsMergedIf = getGoogleStyle();
7538 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7539 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7540 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007541 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7542 EXPECT_EQ("if (true) return 42;",
7543 format("if (true)\nreturn 42;", AllowsMergedIf));
7544 FormatStyle ShortMergedIf = AllowsMergedIf;
7545 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007546 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007547 " if (true) return 42;",
7548 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007549 verifyFormat("#define A \\\n"
7550 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007551 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007552 "#define B",
7553 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007554 verifyFormat("#define A \\\n"
7555 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007556 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007557 "g();",
7558 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007559 verifyFormat("{\n"
7560 "#ifdef A\n"
7561 " // Comment\n"
7562 " if (true) continue;\n"
7563 "#endif\n"
7564 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007565 " if (true) continue;\n"
7566 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007567 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007568 ShortMergedIf.ColumnLimit = 33;
7569 verifyFormat("#define A \\\n"
7570 " if constexpr (true) return 42;",
7571 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007572 ShortMergedIf.ColumnLimit = 29;
7573 verifyFormat("#define A \\\n"
7574 " if (aaaaaaaaaa) return 1; \\\n"
7575 " return 2;",
7576 ShortMergedIf);
7577 ShortMergedIf.ColumnLimit = 28;
7578 verifyFormat("#define A \\\n"
7579 " if (aaaaaaaaaa) \\\n"
7580 " return 1; \\\n"
7581 " return 2;",
7582 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007583 verifyFormat("#define A \\\n"
7584 " if constexpr (aaaaaaa) \\\n"
7585 " return 1; \\\n"
7586 " return 2;",
7587 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007588}
7589
Manuel Klimekd33516e2013-01-23 10:09:28 +00007590TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007591 verifyFormat("void f(int *a);");
7592 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007593 verifyFormat("class A {\n void f(int *a);\n};");
7594 verifyFormat("class A {\n int *a;\n};");
7595 verifyFormat("namespace a {\n"
7596 "namespace b {\n"
7597 "class A {\n"
7598 " void f() {}\n"
7599 " int *a;\n"
7600 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00007601 "} // namespace b\n"
7602 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007603}
7604
Manuel Klimekd33516e2013-01-23 10:09:28 +00007605TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7606 verifyFormat("while");
7607 verifyFormat("operator");
7608}
7609
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007610TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7611 // This code would be painfully slow to format if we didn't skip it.
7612 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
7613 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7614 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7615 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7616 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7617 "A(1, 1)\n"
7618 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7619 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7620 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7621 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7622 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7623 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7624 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7625 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7626 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7627 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7628 // Deeply nested part is untouched, rest is formatted.
7629 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7630 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00007631 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007632}
7633
Nico Weber7e6a7a12013-01-08 17:56:31 +00007634//===----------------------------------------------------------------------===//
7635// Objective-C tests.
7636//===----------------------------------------------------------------------===//
7637
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007638TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7639 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7640 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7641 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007642 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007643 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7644 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7645 format("-(NSInteger)Method3:(id)anObject;"));
7646 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7647 format("-(NSInteger)Method4:(id)anObject;"));
7648 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7649 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7650 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7651 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007652 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7653 "forAllCells:(BOOL)flag;",
7654 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7655 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007656
7657 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007658 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7659 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007660 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7661 " inRange:(NSRange)range\n"
7662 " outRange:(NSRange)out_range\n"
7663 " outRange1:(NSRange)out_range1\n"
7664 " outRange2:(NSRange)out_range2\n"
7665 " outRange3:(NSRange)out_range3\n"
7666 " outRange4:(NSRange)out_range4\n"
7667 " outRange5:(NSRange)out_range5\n"
7668 " outRange6:(NSRange)out_range6\n"
7669 " outRange7:(NSRange)out_range7\n"
7670 " outRange8:(NSRange)out_range8\n"
7671 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007672
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007673 // When the function name has to be wrapped.
7674 FormatStyle Style = getLLVMStyle();
7675 Style.IndentWrappedFunctionNames = false;
7676 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7677 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7678 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7679 "}",
7680 Style);
7681 Style.IndentWrappedFunctionNames = true;
7682 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7683 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7684 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7685 "}",
7686 Style);
7687
Nico Weberd6f962f2013-01-10 20:18:33 +00007688 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007689 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007690 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7691 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007692 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007693
Daniel Jasper37194282013-05-28 08:33:00 +00007694 verifyFormat("- (int (*)())foo:(int (*)())f;");
7695 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007696
7697 // If there's no return type (very rare in practice!), LLVM and Google style
7698 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007699 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007700 verifyFormat("- foo:(int)f;");
7701 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007702}
7703
Nico Weber0588b502013-02-07 00:19:29 +00007704
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007705TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007706 EXPECT_EQ("\"some text \"\n"
7707 "\"other\";",
7708 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007709 EXPECT_EQ("\"some text \"\n"
7710 "\"other\";",
7711 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007712 EXPECT_EQ(
7713 "#define A \\\n"
7714 " \"some \" \\\n"
7715 " \"text \" \\\n"
7716 " \"other\";",
7717 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7718 EXPECT_EQ(
7719 "#define A \\\n"
7720 " \"so \" \\\n"
7721 " \"text \" \\\n"
7722 " \"other\";",
7723 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7724
7725 EXPECT_EQ("\"some text\"",
7726 format("\"some text\"", getLLVMStyleWithColumns(1)));
7727 EXPECT_EQ("\"some text\"",
7728 format("\"some text\"", getLLVMStyleWithColumns(11)));
7729 EXPECT_EQ("\"some \"\n"
7730 "\"text\"",
7731 format("\"some text\"", getLLVMStyleWithColumns(10)));
7732 EXPECT_EQ("\"some \"\n"
7733 "\"text\"",
7734 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007735 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007736 "\" tex\"\n"
7737 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007738 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007739 EXPECT_EQ("\"some\"\n"
7740 "\" tex\"\n"
7741 "\" and\"",
7742 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7743 EXPECT_EQ("\"some\"\n"
7744 "\"/tex\"\n"
7745 "\"/and\"",
7746 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007747
7748 EXPECT_EQ("variable =\n"
7749 " \"long string \"\n"
7750 " \"literal\";",
7751 format("variable = \"long string literal\";",
7752 getLLVMStyleWithColumns(20)));
7753
7754 EXPECT_EQ("variable = f(\n"
7755 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007756 " \"literal\",\n"
7757 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007758 " loooooooooooooooooooong);",
7759 format("variable = f(\"long string literal\", short, "
7760 "loooooooooooooooooooong);",
7761 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007762
Daniel Jaspera44991332015-04-29 13:06:49 +00007763 EXPECT_EQ(
7764 "f(g(\"long string \"\n"
7765 " \"literal\"),\n"
7766 " b);",
7767 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007768 EXPECT_EQ("f(g(\"long string \"\n"
7769 " \"literal\",\n"
7770 " a),\n"
7771 " b);",
7772 format("f(g(\"long string literal\", a), b);",
7773 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007774 EXPECT_EQ(
7775 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007776 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007777 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7778 EXPECT_EQ("f(\"one two three four five six \"\n"
7779 " \"seven\".split(\n"
7780 " really_looooong_variable));",
7781 format("f(\"one two three four five six seven\"."
7782 "split(really_looooong_variable));",
7783 getLLVMStyleWithColumns(33)));
7784
7785 EXPECT_EQ("f(\"some \"\n"
7786 " \"text\",\n"
7787 " other);",
7788 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007789
7790 // Only break as a last resort.
7791 verifyFormat(
7792 "aaaaaaaaaaaaaaaaaaaa(\n"
7793 " aaaaaaaaaaaaaaaaaaaa,\n"
7794 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007795
Daniel Jaspera44991332015-04-29 13:06:49 +00007796 EXPECT_EQ("\"splitmea\"\n"
7797 "\"trandomp\"\n"
7798 "\"oint\"",
7799 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007800
Daniel Jaspera44991332015-04-29 13:06:49 +00007801 EXPECT_EQ("\"split/\"\n"
7802 "\"pathat/\"\n"
7803 "\"slashes\"",
7804 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007805
Daniel Jaspera44991332015-04-29 13:06:49 +00007806 EXPECT_EQ("\"split/\"\n"
7807 "\"pathat/\"\n"
7808 "\"slashes\"",
7809 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007810 EXPECT_EQ("\"split at \"\n"
7811 "\"spaces/at/\"\n"
7812 "\"slashes.at.any$\"\n"
7813 "\"non-alphanumeric%\"\n"
7814 "\"1111111111characte\"\n"
7815 "\"rs\"",
7816 format("\"split at "
7817 "spaces/at/"
7818 "slashes.at."
7819 "any$non-"
7820 "alphanumeric%"
7821 "1111111111characte"
7822 "rs\"",
7823 getLLVMStyleWithColumns(20)));
7824
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007825 // Verify that splitting the strings understands
7826 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007827 EXPECT_EQ(
7828 "aaaaaaaaaaaa(\n"
7829 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7830 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7831 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7832 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7833 "aaaaaaaaaaaaaaaaaaaaaa\");",
7834 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007835 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7836 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7837 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7838 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7839 "aaaaaaaaaaaaaaaaaaaaaa\";",
7840 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007841 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7842 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7843 format("llvm::outs() << "
7844 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7845 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007846 EXPECT_EQ("ffff(\n"
7847 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7848 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7849 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7850 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7851 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007852
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007853 FormatStyle Style = getLLVMStyleWithColumns(12);
7854 Style.BreakStringLiterals = false;
7855 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7856
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007857 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007858 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00007859 EXPECT_EQ("#define A \\\n"
7860 " \"some \" \\\n"
7861 " \"text \" \\\n"
7862 " \"other\";",
7863 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007864}
7865
Manuel Klimek93699f42017-11-29 14:29:43 +00007866TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
7867 EXPECT_EQ("C a = \"some more \"\n"
7868 " \"text\";",
7869 format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
7870}
7871
Manuel Klimek9e321992015-07-28 15:50:24 +00007872TEST_F(FormatTest, FullyRemoveEmptyLines) {
7873 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7874 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7875 EXPECT_EQ("int i = a(b());",
7876 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7877}
7878
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007879TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7880 EXPECT_EQ(
7881 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7882 "(\n"
7883 " \"x\t\");",
7884 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7885 "aaaaaaa("
7886 "\"x\t\");"));
7887}
7888
Daniel Jasper174b0122014-01-09 14:18:12 +00007889TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007890 EXPECT_EQ(
7891 "u8\"utf8 string \"\n"
7892 "u8\"literal\";",
7893 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7894 EXPECT_EQ(
7895 "u\"utf16 string \"\n"
7896 "u\"literal\";",
7897 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7898 EXPECT_EQ(
7899 "U\"utf32 string \"\n"
7900 "U\"literal\";",
7901 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7902 EXPECT_EQ("L\"wide string \"\n"
7903 "L\"literal\";",
7904 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007905 EXPECT_EQ("@\"NSString \"\n"
7906 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007907 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00007908 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007909
7910 // This input makes clang-format try to split the incomplete unicode escape
7911 // sequence, which used to lead to a crasher.
7912 verifyNoCrash(
7913 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7914 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007915}
7916
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007917TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7918 FormatStyle Style = getGoogleStyleWithColumns(15);
7919 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7920 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7921 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7922 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7923 EXPECT_EQ("u8R\"x(raw literal)x\";",
7924 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007925}
7926
7927TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7928 FormatStyle Style = getLLVMStyleWithColumns(20);
7929 EXPECT_EQ(
7930 "_T(\"aaaaaaaaaaaaaa\")\n"
7931 "_T(\"aaaaaaaaaaaaaa\")\n"
7932 "_T(\"aaaaaaaaaaaa\")",
7933 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007934 EXPECT_EQ("f(x,\n"
7935 " _T(\"aaaaaaaaaaaa\")\n"
7936 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00007937 " z);",
7938 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7939
7940 // FIXME: Handle embedded spaces in one iteration.
7941 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7942 // "_T(\"aaaaaaaaaaaaa\")\n"
7943 // "_T(\"aaaaaaaaaaaaa\")\n"
7944 // "_T(\"a\")",
7945 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7946 // getLLVMStyleWithColumns(20)));
7947 EXPECT_EQ(
7948 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7949 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007950 EXPECT_EQ("f(\n"
7951 "#if !TEST\n"
7952 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7953 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00007954 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007955 format("f(\n"
7956 "#if !TEST\n"
7957 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7958 "#endif\n"
7959 ");"));
7960 EXPECT_EQ("f(\n"
7961 "\n"
7962 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7963 format("f(\n"
7964 "\n"
7965 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007966}
7967
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007968TEST_F(FormatTest, BreaksStringLiteralOperands) {
7969 // In a function call with two operands, the second can be broken with no line
7970 // break before it.
7971 EXPECT_EQ("func(a, \"long long \"\n"
7972 " \"long long\");",
7973 format("func(a, \"long long long long\");",
7974 getLLVMStyleWithColumns(24)));
7975 // In a function call with three operands, the second must be broken with a
7976 // line break before it.
7977 EXPECT_EQ("func(a,\n"
7978 " \"long long long \"\n"
7979 " \"long\",\n"
7980 " c);",
7981 format("func(a, \"long long long long\", c);",
7982 getLLVMStyleWithColumns(24)));
7983 // In a function call with three operands, the third must be broken with a
7984 // line break before it.
7985 EXPECT_EQ("func(a, b,\n"
7986 " \"long long long \"\n"
7987 " \"long\");",
7988 format("func(a, b, \"long long long long\");",
7989 getLLVMStyleWithColumns(24)));
7990 // In a function call with three operands, both the second and the third must
7991 // be broken with a line break before them.
7992 EXPECT_EQ("func(a,\n"
7993 " \"long long long \"\n"
7994 " \"long\",\n"
7995 " \"long long long \"\n"
7996 " \"long\");",
7997 format("func(a, \"long long long long\", \"long long long long\");",
7998 getLLVMStyleWithColumns(24)));
7999 // In a chain of << with two operands, the second can be broken with no line
8000 // break before it.
8001 EXPECT_EQ("a << \"line line \"\n"
8002 " \"line\";",
8003 format("a << \"line line line\";",
8004 getLLVMStyleWithColumns(20)));
8005 // In a chain of << with three operands, the second can be broken with no line
8006 // break before it.
8007 EXPECT_EQ("abcde << \"line \"\n"
8008 " \"line line\"\n"
8009 " << c;",
8010 format("abcde << \"line line line\" << c;",
8011 getLLVMStyleWithColumns(20)));
8012 // In a chain of << with three operands, the third must be broken with a line
8013 // break before it.
8014 EXPECT_EQ("a << b\n"
8015 " << \"line line \"\n"
8016 " \"line\";",
8017 format("a << b << \"line line line\";",
8018 getLLVMStyleWithColumns(20)));
8019 // In a chain of << with three operands, the second can be broken with no line
8020 // break before it and the third must be broken with a line break before it.
8021 EXPECT_EQ("abcd << \"line line \"\n"
8022 " \"line\"\n"
8023 " << \"line line \"\n"
8024 " \"line\";",
8025 format("abcd << \"line line line\" << \"line line line\";",
8026 getLLVMStyleWithColumns(20)));
8027 // In a chain of binary operators with two operands, the second can be broken
8028 // with no line break before it.
8029 EXPECT_EQ("abcd + \"line line \"\n"
8030 " \"line line\";",
8031 format("abcd + \"line line line line\";",
8032 getLLVMStyleWithColumns(20)));
8033 // In a chain of binary operators with three operands, the second must be
8034 // broken with a line break before it.
8035 EXPECT_EQ("abcd +\n"
8036 " \"line line \"\n"
8037 " \"line line\" +\n"
8038 " e;",
8039 format("abcd + \"line line line line\" + e;",
8040 getLLVMStyleWithColumns(20)));
8041 // In a function call with two operands, with AlignAfterOpenBracket enabled,
8042 // the first must be broken with a line break before it.
8043 FormatStyle Style = getLLVMStyleWithColumns(25);
8044 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8045 EXPECT_EQ("someFunction(\n"
8046 " \"long long long \"\n"
8047 " \"long\",\n"
8048 " a);",
8049 format("someFunction(\"long long long long\", a);", Style));
8050}
8051
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008052TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008053 EXPECT_EQ(
8054 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8055 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8056 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8057 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8058 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8059 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8060}
8061
8062TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8063 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008064 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008065 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8066 "multiline raw string literal xxxxxxxxxxxxxx\n"
8067 ")x\",\n"
8068 " a),\n"
8069 " b);",
8070 format("fffffffffff(g(R\"x(\n"
8071 "multiline raw string literal xxxxxxxxxxxxxx\n"
8072 ")x\", a), b);",
8073 getGoogleStyleWithColumns(20)));
8074 EXPECT_EQ("fffffffffff(\n"
8075 " g(R\"x(qqq\n"
8076 "multiline raw string literal xxxxxxxxxxxxxx\n"
8077 ")x\",\n"
8078 " a),\n"
8079 " b);",
8080 format("fffffffffff(g(R\"x(qqq\n"
8081 "multiline raw string literal xxxxxxxxxxxxxx\n"
8082 ")x\", a), b);",
8083 getGoogleStyleWithColumns(20)));
8084
8085 EXPECT_EQ("fffffffffff(R\"x(\n"
8086 "multiline raw string literal xxxxxxxxxxxxxx\n"
8087 ")x\");",
8088 format("fffffffffff(R\"x(\n"
8089 "multiline raw string literal xxxxxxxxxxxxxx\n"
8090 ")x\");",
8091 getGoogleStyleWithColumns(20)));
8092 EXPECT_EQ("fffffffffff(R\"x(\n"
8093 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008094 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008095 format("fffffffffff(R\"x(\n"
8096 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008097 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008098 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008099 EXPECT_EQ("fffffffffff(\n"
8100 " R\"x(\n"
8101 "multiline raw string literal xxxxxxxxxxxxxx\n"
8102 ")x\" +\n"
8103 " bbbbbb);",
8104 format("fffffffffff(\n"
8105 " R\"x(\n"
8106 "multiline raw string literal xxxxxxxxxxxxxx\n"
8107 ")x\" + bbbbbb);",
8108 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008109}
8110
Alexander Kornienkobe633902013-06-14 11:46:10 +00008111TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008112 verifyFormat("string a = \"unterminated;");
8113 EXPECT_EQ("function(\"unterminated,\n"
8114 " OtherParameter);",
8115 format("function( \"unterminated,\n"
8116 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008117}
8118
8119TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008120 FormatStyle Style = getLLVMStyle();
8121 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008122 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008123 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008124}
8125
Daniel Jaspera44991332015-04-29 13:06:49 +00008126TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008127
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008128TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8129 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8130 " \"ddeeefff\");",
8131 format("someFunction(\"aaabbbcccdddeeefff\");",
8132 getLLVMStyleWithColumns(25)));
8133 EXPECT_EQ("someFunction1234567890(\n"
8134 " \"aaabbbcccdddeeefff\");",
8135 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8136 getLLVMStyleWithColumns(26)));
8137 EXPECT_EQ("someFunction1234567890(\n"
8138 " \"aaabbbcccdddeeeff\"\n"
8139 " \"f\");",
8140 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8141 getLLVMStyleWithColumns(25)));
8142 EXPECT_EQ("someFunction1234567890(\n"
8143 " \"aaabbbcccdddeeeff\"\n"
8144 " \"f\");",
8145 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8146 getLLVMStyleWithColumns(24)));
Manuel Klimek77866142017-11-17 11:17:15 +00008147 EXPECT_EQ("someFunction(\n"
8148 " \"aaabbbcc ddde \"\n"
8149 " \"efff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008150 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008151 getLLVMStyleWithColumns(25)));
8152 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8153 " \"ddeeefff\");",
8154 format("someFunction(\"aaabbbccc ddeeefff\");",
8155 getLLVMStyleWithColumns(25)));
8156 EXPECT_EQ("someFunction1234567890(\n"
8157 " \"aaabb \"\n"
8158 " \"cccdddeeefff\");",
8159 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8160 getLLVMStyleWithColumns(25)));
8161 EXPECT_EQ("#define A \\\n"
8162 " string s = \\\n"
8163 " \"123456789\" \\\n"
8164 " \"0\"; \\\n"
8165 " int i;",
8166 format("#define A string s = \"1234567890\"; int i;",
8167 getLLVMStyleWithColumns(20)));
Manuel Klimek77866142017-11-17 11:17:15 +00008168 EXPECT_EQ("someFunction(\n"
8169 " \"aaabbbcc \"\n"
8170 " \"dddeeefff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008171 format("someFunction(\"aaabbbcc dddeeefff\");",
8172 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008173}
8174
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008175TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008176 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8177 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008178 EXPECT_EQ("\"test\"\n"
8179 "\"\\n\"",
8180 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8181 EXPECT_EQ("\"tes\\\\\"\n"
8182 "\"n\"",
8183 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8184 EXPECT_EQ("\"\\\\\\\\\"\n"
8185 "\"\\n\"",
8186 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008187 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008188 EXPECT_EQ("\"\\uff01\"\n"
8189 "\"test\"",
8190 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8191 EXPECT_EQ("\"\\Uff01ff02\"",
8192 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8193 EXPECT_EQ("\"\\x000000000001\"\n"
8194 "\"next\"",
8195 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8196 EXPECT_EQ("\"\\x000000000001next\"",
8197 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8198 EXPECT_EQ("\"\\x000000000001\"",
8199 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8200 EXPECT_EQ("\"test\"\n"
8201 "\"\\000000\"\n"
8202 "\"000001\"",
8203 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8204 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008205 "\"00000000\"\n"
8206 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008207 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008208}
8209
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008210TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8211 verifyFormat("void f() {\n"
8212 " return g() {}\n"
8213 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008214 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008215 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008216 "}");
8217}
8218
Manuel Klimek421147e2014-01-24 09:25:23 +00008219TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8220 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008221 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008222}
8223
Manuel Klimek13b97d82013-05-13 08:42:42 +00008224TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8225 verifyFormat("class X {\n"
8226 " void f() {\n"
8227 " }\n"
8228 "};",
8229 getLLVMStyleWithColumns(12));
8230}
8231
8232TEST_F(FormatTest, ConfigurableIndentWidth) {
8233 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8234 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008235 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008236 verifyFormat("void f() {\n"
8237 " someFunction();\n"
8238 " if (true) {\n"
8239 " f();\n"
8240 " }\n"
8241 "}",
8242 EightIndent);
8243 verifyFormat("class X {\n"
8244 " void f() {\n"
8245 " }\n"
8246 "};",
8247 EightIndent);
8248 verifyFormat("int x[] = {\n"
8249 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008250 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008251 EightIndent);
8252}
8253
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008254TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008255 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008256 "f();",
8257 getLLVMStyleWithColumns(8));
8258}
8259
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008260TEST_F(FormatTest, ConfigurableUseOfTab) {
8261 FormatStyle Tab = getLLVMStyleWithColumns(42);
8262 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008263 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008264 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008265
8266 EXPECT_EQ("if (aaaaaaaa && // q\n"
8267 " bb)\t\t// w\n"
8268 "\t;",
8269 format("if (aaaaaaaa &&// q\n"
8270 "bb)// w\n"
8271 ";",
8272 Tab));
8273 EXPECT_EQ("if (aaa && bbb) // w\n"
8274 "\t;",
8275 format("if(aaa&&bbb)// w\n"
8276 ";",
8277 Tab));
8278
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008279 verifyFormat("class X {\n"
8280 "\tvoid f() {\n"
8281 "\t\tsomeFunction(parameter1,\n"
8282 "\t\t\t parameter2);\n"
8283 "\t}\n"
8284 "};",
8285 Tab);
8286 verifyFormat("#define A \\\n"
8287 "\tvoid f() { \\\n"
8288 "\t\tsomeFunction( \\\n"
8289 "\t\t parameter1, \\\n"
8290 "\t\t parameter2); \\\n"
8291 "\t}",
8292 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008293
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008294 Tab.TabWidth = 4;
8295 Tab.IndentWidth = 8;
8296 verifyFormat("class TabWidth4Indent8 {\n"
8297 "\t\tvoid f() {\n"
8298 "\t\t\t\tsomeFunction(parameter1,\n"
8299 "\t\t\t\t\t\t\t parameter2);\n"
8300 "\t\t}\n"
8301 "};",
8302 Tab);
8303
8304 Tab.TabWidth = 4;
8305 Tab.IndentWidth = 4;
8306 verifyFormat("class TabWidth4Indent4 {\n"
8307 "\tvoid f() {\n"
8308 "\t\tsomeFunction(parameter1,\n"
8309 "\t\t\t\t\t parameter2);\n"
8310 "\t}\n"
8311 "};",
8312 Tab);
8313
8314 Tab.TabWidth = 8;
8315 Tab.IndentWidth = 4;
8316 verifyFormat("class TabWidth8Indent4 {\n"
8317 " void f() {\n"
8318 "\tsomeFunction(parameter1,\n"
8319 "\t\t parameter2);\n"
8320 " }\n"
8321 "};",
8322 Tab);
8323
Alexander Kornienko39856b72013-09-10 09:38:25 +00008324 Tab.TabWidth = 8;
8325 Tab.IndentWidth = 8;
8326 EXPECT_EQ("/*\n"
8327 "\t a\t\tcomment\n"
8328 "\t in multiple lines\n"
8329 " */",
8330 format(" /*\t \t \n"
8331 " \t \t a\t\tcomment\t \t\n"
8332 " \t \t in multiple lines\t\n"
8333 " \t */",
8334 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008335
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008336 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008337 verifyFormat("{\n"
8338 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8339 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8340 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8341 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8342 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8343 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008344 "};",
8345 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008346 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008347 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008348 "\ta2,\n"
8349 "\ta3\n"
8350 "};",
8351 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008352 EXPECT_EQ("if (aaaaaaaa && // q\n"
8353 " bb) // w\n"
8354 "\t;",
8355 format("if (aaaaaaaa &&// q\n"
8356 "bb)// w\n"
8357 ";",
8358 Tab));
8359 verifyFormat("class X {\n"
8360 "\tvoid f() {\n"
8361 "\t\tsomeFunction(parameter1,\n"
8362 "\t\t parameter2);\n"
8363 "\t}\n"
8364 "};",
8365 Tab);
8366 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008367 "\tQ(\n"
8368 "\t {\n"
8369 "\t\t int a;\n"
8370 "\t\t someFunction(aaaaaaaa,\n"
8371 "\t\t bbbbbbb);\n"
8372 "\t },\n"
8373 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008374 "}",
8375 Tab);
8376 EXPECT_EQ("{\n"
8377 "\t/* aaaa\n"
8378 "\t bbbb */\n"
8379 "}",
8380 format("{\n"
8381 "/* aaaa\n"
8382 " bbbb */\n"
8383 "}",
8384 Tab));
8385 EXPECT_EQ("{\n"
8386 "\t/*\n"
8387 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8388 "\t bbbbbbbbbbbbb\n"
8389 "\t*/\n"
8390 "}",
8391 format("{\n"
8392 "/*\n"
8393 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8394 "*/\n"
8395 "}",
8396 Tab));
8397 EXPECT_EQ("{\n"
8398 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8399 "\t// bbbbbbbbbbbbb\n"
8400 "}",
8401 format("{\n"
8402 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8403 "}",
8404 Tab));
8405 EXPECT_EQ("{\n"
8406 "\t/*\n"
8407 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8408 "\t bbbbbbbbbbbbb\n"
8409 "\t*/\n"
8410 "}",
8411 format("{\n"
8412 "\t/*\n"
8413 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8414 "\t*/\n"
8415 "}",
8416 Tab));
8417 EXPECT_EQ("{\n"
8418 "\t/*\n"
8419 "\n"
8420 "\t*/\n"
8421 "}",
8422 format("{\n"
8423 "\t/*\n"
8424 "\n"
8425 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008426 "}",
8427 Tab));
8428 EXPECT_EQ("{\n"
8429 "\t/*\n"
8430 " asdf\n"
8431 "\t*/\n"
8432 "}",
8433 format("{\n"
8434 "\t/*\n"
8435 " asdf\n"
8436 "\t*/\n"
8437 "}",
8438 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008439
8440 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008441 EXPECT_EQ("/*\n"
8442 " a\t\tcomment\n"
8443 " in multiple lines\n"
8444 " */",
8445 format(" /*\t \t \n"
8446 " \t \t a\t\tcomment\t \t\n"
8447 " \t \t in multiple lines\t\n"
8448 " \t */",
8449 Tab));
8450 EXPECT_EQ("/* some\n"
8451 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008452 format(" \t \t /* some\n"
8453 " \t \t comment */",
8454 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008455 EXPECT_EQ("int a; /* some\n"
8456 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008457 format(" \t \t int a; /* some\n"
8458 " \t \t comment */",
8459 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008460
Alexander Kornienko39856b72013-09-10 09:38:25 +00008461 EXPECT_EQ("int a; /* some\n"
8462 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008463 format(" \t \t int\ta; /* some\n"
8464 " \t \t comment */",
8465 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008466 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8467 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008468 format(" \t \t f(\"\t\t\"); /* some\n"
8469 " \t \t comment */",
8470 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008471 EXPECT_EQ("{\n"
8472 " /*\n"
8473 " * Comment\n"
8474 " */\n"
8475 " int i;\n"
8476 "}",
8477 format("{\n"
8478 "\t/*\n"
8479 "\t * Comment\n"
8480 "\t */\n"
8481 "\t int i;\n"
8482 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008483
8484 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8485 Tab.TabWidth = 8;
8486 Tab.IndentWidth = 8;
8487 EXPECT_EQ("if (aaaaaaaa && // q\n"
8488 " bb) // w\n"
8489 "\t;",
8490 format("if (aaaaaaaa &&// q\n"
8491 "bb)// w\n"
8492 ";",
8493 Tab));
8494 EXPECT_EQ("if (aaa && bbb) // w\n"
8495 "\t;",
8496 format("if(aaa&&bbb)// w\n"
8497 ";",
8498 Tab));
8499 verifyFormat("class X {\n"
8500 "\tvoid f() {\n"
8501 "\t\tsomeFunction(parameter1,\n"
8502 "\t\t\t parameter2);\n"
8503 "\t}\n"
8504 "};",
8505 Tab);
8506 verifyFormat("#define A \\\n"
8507 "\tvoid f() { \\\n"
8508 "\t\tsomeFunction( \\\n"
8509 "\t\t parameter1, \\\n"
8510 "\t\t parameter2); \\\n"
8511 "\t}",
8512 Tab);
8513 Tab.TabWidth = 4;
8514 Tab.IndentWidth = 8;
8515 verifyFormat("class TabWidth4Indent8 {\n"
8516 "\t\tvoid f() {\n"
8517 "\t\t\t\tsomeFunction(parameter1,\n"
8518 "\t\t\t\t\t\t\t parameter2);\n"
8519 "\t\t}\n"
8520 "};",
8521 Tab);
8522 Tab.TabWidth = 4;
8523 Tab.IndentWidth = 4;
8524 verifyFormat("class TabWidth4Indent4 {\n"
8525 "\tvoid f() {\n"
8526 "\t\tsomeFunction(parameter1,\n"
8527 "\t\t\t\t\t parameter2);\n"
8528 "\t}\n"
8529 "};",
8530 Tab);
8531 Tab.TabWidth = 8;
8532 Tab.IndentWidth = 4;
8533 verifyFormat("class TabWidth8Indent4 {\n"
8534 " void f() {\n"
8535 "\tsomeFunction(parameter1,\n"
8536 "\t\t parameter2);\n"
8537 " }\n"
8538 "};",
8539 Tab);
8540 Tab.TabWidth = 8;
8541 Tab.IndentWidth = 8;
8542 EXPECT_EQ("/*\n"
8543 "\t a\t\tcomment\n"
8544 "\t in multiple lines\n"
8545 " */",
8546 format(" /*\t \t \n"
8547 " \t \t a\t\tcomment\t \t\n"
8548 " \t \t in multiple lines\t\n"
8549 " \t */",
8550 Tab));
8551 verifyFormat("{\n"
8552 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8553 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8554 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8555 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8556 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8557 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8558 "};",
8559 Tab);
8560 verifyFormat("enum AA {\n"
8561 "\ta1, // Force multiple lines\n"
8562 "\ta2,\n"
8563 "\ta3\n"
8564 "};",
8565 Tab);
8566 EXPECT_EQ("if (aaaaaaaa && // q\n"
8567 " bb) // w\n"
8568 "\t;",
8569 format("if (aaaaaaaa &&// q\n"
8570 "bb)// w\n"
8571 ";",
8572 Tab));
8573 verifyFormat("class X {\n"
8574 "\tvoid f() {\n"
8575 "\t\tsomeFunction(parameter1,\n"
8576 "\t\t\t parameter2);\n"
8577 "\t}\n"
8578 "};",
8579 Tab);
8580 verifyFormat("{\n"
8581 "\tQ(\n"
8582 "\t {\n"
8583 "\t\t int a;\n"
8584 "\t\t someFunction(aaaaaaaa,\n"
8585 "\t\t\t\t bbbbbbb);\n"
8586 "\t },\n"
8587 "\t p);\n"
8588 "}",
8589 Tab);
8590 EXPECT_EQ("{\n"
8591 "\t/* aaaa\n"
8592 "\t bbbb */\n"
8593 "}",
8594 format("{\n"
8595 "/* aaaa\n"
8596 " bbbb */\n"
8597 "}",
8598 Tab));
8599 EXPECT_EQ("{\n"
8600 "\t/*\n"
8601 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8602 "\t bbbbbbbbbbbbb\n"
8603 "\t*/\n"
8604 "}",
8605 format("{\n"
8606 "/*\n"
8607 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8608 "*/\n"
8609 "}",
8610 Tab));
8611 EXPECT_EQ("{\n"
8612 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8613 "\t// bbbbbbbbbbbbb\n"
8614 "}",
8615 format("{\n"
8616 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8617 "}",
8618 Tab));
8619 EXPECT_EQ("{\n"
8620 "\t/*\n"
8621 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8622 "\t bbbbbbbbbbbbb\n"
8623 "\t*/\n"
8624 "}",
8625 format("{\n"
8626 "\t/*\n"
8627 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8628 "\t*/\n"
8629 "}",
8630 Tab));
8631 EXPECT_EQ("{\n"
8632 "\t/*\n"
8633 "\n"
8634 "\t*/\n"
8635 "}",
8636 format("{\n"
8637 "\t/*\n"
8638 "\n"
8639 "\t*/\n"
8640 "}",
8641 Tab));
8642 EXPECT_EQ("{\n"
8643 "\t/*\n"
8644 " asdf\n"
8645 "\t*/\n"
8646 "}",
8647 format("{\n"
8648 "\t/*\n"
8649 " asdf\n"
8650 "\t*/\n"
8651 "}",
8652 Tab));
8653 EXPECT_EQ("/*\n"
8654 "\t a\t\tcomment\n"
8655 "\t in multiple lines\n"
8656 " */",
8657 format(" /*\t \t \n"
8658 " \t \t a\t\tcomment\t \t\n"
8659 " \t \t in multiple lines\t\n"
8660 " \t */",
8661 Tab));
8662 EXPECT_EQ("/* some\n"
8663 " comment */",
8664 format(" \t \t /* some\n"
8665 " \t \t comment */",
8666 Tab));
8667 EXPECT_EQ("int a; /* some\n"
8668 " comment */",
8669 format(" \t \t int a; /* some\n"
8670 " \t \t comment */",
8671 Tab));
8672 EXPECT_EQ("int a; /* some\n"
8673 "comment */",
8674 format(" \t \t int\ta; /* some\n"
8675 " \t \t comment */",
8676 Tab));
8677 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8678 " comment */",
8679 format(" \t \t f(\"\t\t\"); /* some\n"
8680 " \t \t comment */",
8681 Tab));
8682 EXPECT_EQ("{\n"
8683 " /*\n"
8684 " * Comment\n"
8685 " */\n"
8686 " int i;\n"
8687 "}",
8688 format("{\n"
8689 "\t/*\n"
8690 "\t * Comment\n"
8691 "\t */\n"
8692 "\t int i;\n"
8693 "}"));
8694 Tab.AlignConsecutiveAssignments = true;
8695 Tab.AlignConsecutiveDeclarations = true;
8696 Tab.TabWidth = 4;
8697 Tab.IndentWidth = 4;
8698 verifyFormat("class Assign {\n"
8699 "\tvoid f() {\n"
8700 "\t\tint x = 123;\n"
8701 "\t\tint random = 4;\n"
8702 "\t\tstd::string alphabet =\n"
8703 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8704 "\t}\n"
8705 "};",
8706 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008707}
8708
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008709TEST_F(FormatTest, CalculatesOriginalColumn) {
8710 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8711 "q\"; /* some\n"
8712 " comment */",
8713 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8714 "q\"; /* some\n"
8715 " comment */",
8716 getLLVMStyle()));
8717 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8718 "/* some\n"
8719 " comment */",
8720 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8721 " /* some\n"
8722 " comment */",
8723 getLLVMStyle()));
8724 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8725 "qqq\n"
8726 "/* some\n"
8727 " comment */",
8728 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8729 "qqq\n"
8730 " /* some\n"
8731 " comment */",
8732 getLLVMStyle()));
8733 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8734 "wwww; /* some\n"
8735 " comment */",
8736 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8737 "wwww; /* some\n"
8738 " comment */",
8739 getLLVMStyle()));
8740}
8741
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008742TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008743 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008744 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008745
8746 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008747 " continue;",
8748 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008749 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008750 " continue;",
8751 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008752 verifyFormat("if(true)\n"
8753 " f();\n"
8754 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008755 " f();",
8756 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008757 verifyFormat("do {\n"
8758 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008759 "} while(something());",
8760 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008761 verifyFormat("switch(x) {\n"
8762 "default:\n"
8763 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008764 "}",
8765 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008766 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008767 verifyFormat("size_t x = sizeof(x);", NoSpace);
8768 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8769 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8770 verifyFormat("alignas(128) char a[128];", NoSpace);
8771 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8772 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8773 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008774 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008775 verifyFormat("T A::operator()();", NoSpace);
8776 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008777
8778 FormatStyle Space = getLLVMStyle();
8779 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8780
8781 verifyFormat("int f ();", Space);
8782 verifyFormat("void f (int a, T b) {\n"
8783 " while (true)\n"
8784 " continue;\n"
8785 "}",
8786 Space);
8787 verifyFormat("if (true)\n"
8788 " f ();\n"
8789 "else if (true)\n"
8790 " f ();",
8791 Space);
8792 verifyFormat("do {\n"
8793 " do_something ();\n"
8794 "} while (something ());",
8795 Space);
8796 verifyFormat("switch (x) {\n"
8797 "default:\n"
8798 " break;\n"
8799 "}",
8800 Space);
8801 verifyFormat("A::A () : a (1) {}", Space);
8802 verifyFormat("void f () __attribute__ ((asdf));", Space);
8803 verifyFormat("*(&a + 1);\n"
8804 "&((&a)[1]);\n"
8805 "a[(b + c) * d];\n"
8806 "(((a + 1) * 2) + 3) * 4;",
8807 Space);
8808 verifyFormat("#define A(x) x", Space);
8809 verifyFormat("#define A (x) x", Space);
8810 verifyFormat("#if defined(x)\n"
8811 "#endif",
8812 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008813 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008814 verifyFormat("size_t x = sizeof (x);", Space);
8815 verifyFormat("auto f (int x) -> decltype (x);", Space);
8816 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8817 verifyFormat("alignas (128) char a[128];", Space);
8818 verifyFormat("size_t x = alignof (MyType);", Space);
8819 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8820 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008821 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008822 verifyFormat("T A::operator() ();", Space);
8823 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008824}
8825
8826TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8827 FormatStyle Spaces = getLLVMStyle();
8828
8829 Spaces.SpacesInParentheses = true;
Daniel Jasperd5e9ff42018-03-22 14:30:28 +00008830 verifyFormat("do_something( ::globalVar );", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008831 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008832 verifyFormat("call();", Spaces);
8833 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008834 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8835 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008836 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008837 " continue;",
8838 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008839 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008840 " continue;",
8841 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008842 verifyFormat("if ( true )\n"
8843 " f();\n"
8844 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008845 " f();",
8846 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008847 verifyFormat("do {\n"
8848 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008849 "} while ( something() );",
8850 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008851 verifyFormat("switch ( x ) {\n"
8852 "default:\n"
8853 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008854 "}",
8855 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008856
8857 Spaces.SpacesInParentheses = false;
8858 Spaces.SpacesInCStyleCastParentheses = true;
8859 verifyFormat("Type *A = ( Type * )P;", Spaces);
8860 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8861 verifyFormat("x = ( int32 )y;", Spaces);
8862 verifyFormat("int a = ( int )(2.0f);", Spaces);
8863 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8864 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8865 verifyFormat("#define x (( int )-1)", Spaces);
8866
Daniel Jasper92e09822015-03-18 12:59:19 +00008867 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008868 Spaces.SpacesInParentheses = false;
8869 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008870 Spaces.SpacesInCStyleCastParentheses = true;
8871 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008872 verifyFormat("call( );", Spaces);
8873 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008874 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008875 " continue;",
8876 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008877 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008878 " continue;",
8879 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008880 verifyFormat("if (true)\n"
8881 " f( );\n"
8882 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008883 " f( );",
8884 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008885 verifyFormat("do {\n"
8886 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008887 "} while (something( ));",
8888 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008889 verifyFormat("switch (x) {\n"
8890 "default:\n"
8891 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008892 "}",
8893 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008894
Daniel Jasper92e09822015-03-18 12:59:19 +00008895 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008896 Spaces.SpaceAfterCStyleCast = true;
8897 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008898 verifyFormat("call( );", Spaces);
8899 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008900 verifyFormat("while (( bool ) 1)\n"
8901 " continue;",
8902 Spaces);
8903 verifyFormat("for (;;)\n"
8904 " continue;",
8905 Spaces);
8906 verifyFormat("if (true)\n"
8907 " f( );\n"
8908 "else if (true)\n"
8909 " f( );",
8910 Spaces);
8911 verifyFormat("do {\n"
8912 " do_something(( int ) i);\n"
8913 "} while (something( ));",
8914 Spaces);
8915 verifyFormat("switch (x) {\n"
8916 "default:\n"
8917 " break;\n"
8918 "}",
8919 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008920
8921 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008922 Spaces.SpacesInCStyleCastParentheses = false;
8923 Spaces.SpaceAfterCStyleCast = true;
8924 verifyFormat("while ((bool) 1)\n"
8925 " continue;",
8926 Spaces);
8927 verifyFormat("do {\n"
8928 " do_something((int) i);\n"
8929 "} while (something( ));",
8930 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008931}
8932
Daniel Jasperad981f82014-08-26 11:41:14 +00008933TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8934 verifyFormat("int a[5];");
8935 verifyFormat("a[3] += 42;");
8936
8937 FormatStyle Spaces = getLLVMStyle();
8938 Spaces.SpacesInSquareBrackets = true;
8939 // Lambdas unchanged.
8940 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8941 verifyFormat("return [i, args...] {};", Spaces);
8942
8943 // Not lambdas.
8944 verifyFormat("int a[ 5 ];", Spaces);
8945 verifyFormat("a[ 3 ] += 42;", Spaces);
8946 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8947 verifyFormat("double &operator[](int i) { return 0; }\n"
8948 "int i;",
8949 Spaces);
8950 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8951 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8952 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8953}
8954
Daniel Jasperd94bff32013-09-25 15:15:02 +00008955TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8956 verifyFormat("int a = 5;");
8957 verifyFormat("a += 42;");
8958 verifyFormat("a or_eq 8;");
8959
8960 FormatStyle Spaces = getLLVMStyle();
8961 Spaces.SpaceBeforeAssignmentOperators = false;
8962 verifyFormat("int a= 5;", Spaces);
8963 verifyFormat("a+= 42;", Spaces);
8964 verifyFormat("a or_eq 8;", Spaces);
8965}
8966
Francois Ferrand2a9ea782018-03-01 10:09:13 +00008967TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
8968 verifyFormat("class Foo : public Bar {};");
8969 verifyFormat("Foo::Foo() : foo(1) {}");
8970 verifyFormat("for (auto a : b) {\n}");
8971 verifyFormat("int x = a ? b : c;");
8972 verifyFormat("{\n"
8973 "label0:\n"
8974 " int x = 0;\n"
8975 "}");
8976 verifyFormat("switch (x) {\n"
8977 "case 1:\n"
8978 "default:\n"
8979 "}");
8980
8981 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
8982 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
8983 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
8984 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
8985 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
8986 verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
8987 verifyFormat("{\n"
8988 "label1:\n"
8989 " int x = 0;\n"
8990 "}",
8991 CtorInitializerStyle);
8992 verifyFormat("switch (x) {\n"
8993 "case 1:\n"
8994 "default:\n"
8995 "}",
8996 CtorInitializerStyle);
8997 CtorInitializerStyle.BreakConstructorInitializers =
8998 FormatStyle::BCIS_AfterColon;
8999 verifyFormat("Fooooooooooo::Fooooooooooo():\n"
9000 " aaaaaaaaaaaaaaaa(1),\n"
9001 " bbbbbbbbbbbbbbbb(2) {}",
9002 CtorInitializerStyle);
9003 CtorInitializerStyle.BreakConstructorInitializers =
9004 FormatStyle::BCIS_BeforeComma;
9005 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9006 " : aaaaaaaaaaaaaaaa(1)\n"
9007 " , bbbbbbbbbbbbbbbb(2) {}",
9008 CtorInitializerStyle);
9009 CtorInitializerStyle.BreakConstructorInitializers =
9010 FormatStyle::BCIS_BeforeColon;
9011 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9012 " : aaaaaaaaaaaaaaaa(1),\n"
9013 " bbbbbbbbbbbbbbbb(2) {}",
9014 CtorInitializerStyle);
9015 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
9016 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9017 ": aaaaaaaaaaaaaaaa(1),\n"
9018 " bbbbbbbbbbbbbbbb(2) {}",
9019 CtorInitializerStyle);
9020
9021 FormatStyle InheritanceStyle = getLLVMStyle();
9022 InheritanceStyle.SpaceBeforeInheritanceColon = false;
9023 verifyFormat("class Foo: public Bar {};", InheritanceStyle);
9024 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
9025 verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
9026 verifyFormat("int x = a ? b : c;", InheritanceStyle);
9027 verifyFormat("{\n"
9028 "label2:\n"
9029 " int x = 0;\n"
9030 "}",
9031 InheritanceStyle);
9032 verifyFormat("switch (x) {\n"
9033 "case 1:\n"
9034 "default:\n"
9035 "}",
9036 InheritanceStyle);
9037
9038 FormatStyle ForLoopStyle = getLLVMStyle();
9039 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
9040 verifyFormat("class Foo : public Bar {};", ForLoopStyle);
9041 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
9042 verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
9043 verifyFormat("int x = a ? b : c;", ForLoopStyle);
9044 verifyFormat("{\n"
9045 "label2:\n"
9046 " int x = 0;\n"
9047 "}",
9048 ForLoopStyle);
9049 verifyFormat("switch (x) {\n"
9050 "case 1:\n"
9051 "default:\n"
9052 "}",
9053 ForLoopStyle);
9054
9055 FormatStyle NoSpaceStyle = getLLVMStyle();
9056 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
9057 NoSpaceStyle.SpaceBeforeInheritanceColon = false;
9058 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
9059 verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
9060 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
9061 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
9062 verifyFormat("int x = a ? b : c;", NoSpaceStyle);
9063 verifyFormat("{\n"
9064 "label3:\n"
9065 " int x = 0;\n"
9066 "}",
9067 NoSpaceStyle);
9068 verifyFormat("switch (x) {\n"
9069 "case 1:\n"
9070 "default:\n"
9071 "}",
9072 NoSpaceStyle);
9073}
9074
Daniel Jaspera44991332015-04-29 13:06:49 +00009075TEST_F(FormatTest, AlignConsecutiveAssignments) {
9076 FormatStyle Alignment = getLLVMStyle();
9077 Alignment.AlignConsecutiveAssignments = false;
9078 verifyFormat("int a = 5;\n"
9079 "int oneTwoThree = 123;",
9080 Alignment);
9081 verifyFormat("int a = 5;\n"
9082 "int oneTwoThree = 123;",
9083 Alignment);
9084
9085 Alignment.AlignConsecutiveAssignments = true;
9086 verifyFormat("int a = 5;\n"
9087 "int oneTwoThree = 123;",
9088 Alignment);
9089 verifyFormat("int a = method();\n"
9090 "int oneTwoThree = 133;",
9091 Alignment);
9092 verifyFormat("a &= 5;\n"
9093 "bcd *= 5;\n"
9094 "ghtyf += 5;\n"
9095 "dvfvdb -= 5;\n"
9096 "a /= 5;\n"
9097 "vdsvsv %= 5;\n"
9098 "sfdbddfbdfbb ^= 5;\n"
9099 "dvsdsv |= 5;\n"
9100 "int dsvvdvsdvvv = 123;",
9101 Alignment);
9102 verifyFormat("int i = 1, j = 10;\n"
9103 "something = 2000;",
9104 Alignment);
9105 verifyFormat("something = 2000;\n"
9106 "int i = 1, j = 10;\n",
9107 Alignment);
9108 verifyFormat("something = 2000;\n"
9109 "another = 911;\n"
9110 "int i = 1, j = 10;\n"
9111 "oneMore = 1;\n"
9112 "i = 2;",
9113 Alignment);
9114 verifyFormat("int a = 5;\n"
9115 "int one = 1;\n"
9116 "method();\n"
9117 "int oneTwoThree = 123;\n"
9118 "int oneTwo = 12;",
9119 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009120 verifyFormat("int oneTwoThree = 123;\n"
9121 "int oneTwo = 12;\n"
9122 "method();\n",
9123 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009124 verifyFormat("int oneTwoThree = 123; // comment\n"
9125 "int oneTwo = 12; // comment",
9126 Alignment);
9127 EXPECT_EQ("int a = 5;\n"
9128 "\n"
9129 "int oneTwoThree = 123;",
9130 format("int a = 5;\n"
9131 "\n"
9132 "int oneTwoThree= 123;",
9133 Alignment));
9134 EXPECT_EQ("int a = 5;\n"
9135 "int one = 1;\n"
9136 "\n"
9137 "int oneTwoThree = 123;",
9138 format("int a = 5;\n"
9139 "int one = 1;\n"
9140 "\n"
9141 "int oneTwoThree = 123;",
9142 Alignment));
9143 EXPECT_EQ("int a = 5;\n"
9144 "int one = 1;\n"
9145 "\n"
9146 "int oneTwoThree = 123;\n"
9147 "int oneTwo = 12;",
9148 format("int a = 5;\n"
9149 "int one = 1;\n"
9150 "\n"
9151 "int oneTwoThree = 123;\n"
9152 "int oneTwo = 12;",
9153 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009154 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9155 verifyFormat("#define A \\\n"
9156 " int aaaa = 12; \\\n"
9157 " int b = 23; \\\n"
9158 " int ccc = 234; \\\n"
9159 " int dddddddddd = 2345;",
9160 Alignment);
9161 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00009162 verifyFormat("#define A \\\n"
9163 " int aaaa = 12; \\\n"
9164 " int b = 23; \\\n"
9165 " int ccc = 234; \\\n"
9166 " int dddddddddd = 2345;",
9167 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009168 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00009169 verifyFormat("#define A "
9170 " \\\n"
9171 " int aaaa = 12; "
9172 " \\\n"
9173 " int b = 23; "
9174 " \\\n"
9175 " int ccc = 234; "
9176 " \\\n"
9177 " int dddddddddd = 2345;",
9178 Alignment);
9179 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9180 "k = 4, int l = 5,\n"
9181 " int m = 6) {\n"
9182 " int j = 10;\n"
9183 " otherThing = 1;\n"
9184 "}",
9185 Alignment);
9186 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9187 " int i = 1;\n"
9188 " int j = 2;\n"
9189 " int big = 10000;\n"
9190 "}",
9191 Alignment);
9192 verifyFormat("class C {\n"
9193 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009194 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009195 " virtual void f() = 0;\n"
9196 "};",
9197 Alignment);
9198 verifyFormat("int i = 1;\n"
9199 "if (SomeType t = getSomething()) {\n"
9200 "}\n"
9201 "int j = 2;\n"
9202 "int big = 10000;",
9203 Alignment);
9204 verifyFormat("int j = 7;\n"
9205 "for (int k = 0; k < N; ++k) {\n"
9206 "}\n"
9207 "int j = 2;\n"
9208 "int big = 10000;\n"
9209 "}",
9210 Alignment);
9211 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9212 verifyFormat("int i = 1;\n"
9213 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9214 " = someLooooooooooooooooongFunction();\n"
9215 "int j = 2;",
9216 Alignment);
9217 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9218 verifyFormat("int i = 1;\n"
9219 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9220 " someLooooooooooooooooongFunction();\n"
9221 "int j = 2;",
9222 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009223
9224 verifyFormat("auto lambda = []() {\n"
9225 " auto i = 0;\n"
9226 " return 0;\n"
9227 "};\n"
9228 "int i = 0;\n"
9229 "auto v = type{\n"
9230 " i = 1, //\n"
9231 " (i = 2), //\n"
9232 " i = 3 //\n"
9233 "};",
9234 Alignment);
9235
Daniel Jaspera44991332015-04-29 13:06:49 +00009236 verifyFormat(
9237 "int i = 1;\n"
9238 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9239 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009240 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00009241 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009242
9243 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9244 " typename B = very_long_type_name_1,\n"
9245 " typename T_2 = very_long_type_name_2>\n"
9246 "auto foo() {}\n",
9247 Alignment);
9248 verifyFormat("int a, b = 1;\n"
9249 "int c = 2;\n"
9250 "int dd = 3;\n",
9251 Alignment);
9252 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9253 "float b[1][] = {{3.f}};\n",
9254 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009255 verifyFormat("for (int i = 0; i < 1; i++)\n"
9256 " int x = 1;\n",
9257 Alignment);
9258 verifyFormat("for (i = 0; i < 1; i++)\n"
9259 " x = 1;\n"
9260 "y = 1;\n",
9261 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009262}
9263
Daniel Jaspere12597c2015-10-01 10:06:54 +00009264TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9265 FormatStyle Alignment = getLLVMStyle();
9266 Alignment.AlignConsecutiveDeclarations = false;
9267 verifyFormat("float const a = 5;\n"
9268 "int oneTwoThree = 123;",
9269 Alignment);
9270 verifyFormat("int a = 5;\n"
9271 "float const oneTwoThree = 123;",
9272 Alignment);
9273
9274 Alignment.AlignConsecutiveDeclarations = true;
9275 verifyFormat("float const a = 5;\n"
9276 "int oneTwoThree = 123;",
9277 Alignment);
9278 verifyFormat("int a = method();\n"
9279 "float const oneTwoThree = 133;",
9280 Alignment);
9281 verifyFormat("int i = 1, j = 10;\n"
9282 "something = 2000;",
9283 Alignment);
9284 verifyFormat("something = 2000;\n"
9285 "int i = 1, j = 10;\n",
9286 Alignment);
9287 verifyFormat("float something = 2000;\n"
9288 "double another = 911;\n"
9289 "int i = 1, j = 10;\n"
9290 "const int *oneMore = 1;\n"
9291 "unsigned i = 2;",
9292 Alignment);
9293 verifyFormat("float a = 5;\n"
9294 "int one = 1;\n"
9295 "method();\n"
9296 "const double oneTwoThree = 123;\n"
9297 "const unsigned int oneTwo = 12;",
9298 Alignment);
9299 verifyFormat("int oneTwoThree{0}; // comment\n"
9300 "unsigned oneTwo; // comment",
9301 Alignment);
9302 EXPECT_EQ("float const a = 5;\n"
9303 "\n"
9304 "int oneTwoThree = 123;",
9305 format("float const a = 5;\n"
9306 "\n"
9307 "int oneTwoThree= 123;",
9308 Alignment));
9309 EXPECT_EQ("float a = 5;\n"
9310 "int one = 1;\n"
9311 "\n"
9312 "unsigned oneTwoThree = 123;",
9313 format("float a = 5;\n"
9314 "int one = 1;\n"
9315 "\n"
9316 "unsigned oneTwoThree = 123;",
9317 Alignment));
9318 EXPECT_EQ("float a = 5;\n"
9319 "int one = 1;\n"
9320 "\n"
9321 "unsigned oneTwoThree = 123;\n"
9322 "int oneTwo = 12;",
9323 format("float a = 5;\n"
9324 "int one = 1;\n"
9325 "\n"
9326 "unsigned oneTwoThree = 123;\n"
9327 "int oneTwo = 12;",
9328 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009329 // Function prototype alignment
9330 verifyFormat("int a();\n"
9331 "double b();",
9332 Alignment);
9333 verifyFormat("int a(int x);\n"
9334 "double b();",
9335 Alignment);
9336 unsigned OldColumnLimit = Alignment.ColumnLimit;
9337 // We need to set ColumnLimit to zero, in order to stress nested alignments,
9338 // otherwise the function parameters will be re-flowed onto a single line.
9339 Alignment.ColumnLimit = 0;
9340 EXPECT_EQ("int a(int x,\n"
9341 " float y);\n"
9342 "double b(int x,\n"
9343 " double y);",
9344 format("int a(int x,\n"
9345 " float y);\n"
9346 "double b(int x,\n"
9347 " double y);",
9348 Alignment));
9349 // This ensures that function parameters of function declarations are
9350 // correctly indented when their owning functions are indented.
9351 // The failure case here is for 'double y' to not be indented enough.
9352 EXPECT_EQ("double a(int x);\n"
9353 "int b(int y,\n"
9354 " double z);",
9355 format("double a(int x);\n"
9356 "int b(int y,\n"
9357 " double z);",
9358 Alignment));
9359 // Set ColumnLimit low so that we induce wrapping immediately after
9360 // the function name and opening paren.
9361 Alignment.ColumnLimit = 13;
9362 verifyFormat("int function(\n"
9363 " int x,\n"
9364 " bool y);",
9365 Alignment);
9366 Alignment.ColumnLimit = OldColumnLimit;
9367 // Ensure function pointers don't screw up recursive alignment
9368 verifyFormat("int a(int x, void (*fp)(int y));\n"
9369 "double b();",
9370 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009371 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009372 // Ensure recursive alignment is broken by function braces, so that the
9373 // "a = 1" does not align with subsequent assignments inside the function
9374 // body.
9375 verifyFormat("int func(int a = 1) {\n"
9376 " int b = 2;\n"
9377 " int cc = 3;\n"
9378 "}",
9379 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009380 verifyFormat("float something = 2000;\n"
9381 "double another = 911;\n"
9382 "int i = 1, j = 10;\n"
9383 "const int *oneMore = 1;\n"
9384 "unsigned i = 2;",
9385 Alignment);
9386 verifyFormat("int oneTwoThree = {0}; // comment\n"
9387 "unsigned oneTwo = 0; // comment",
9388 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009389 // Make sure that scope is correctly tracked, in the absence of braces
9390 verifyFormat("for (int i = 0; i < n; i++)\n"
9391 " j = i;\n"
9392 "double x = 1;\n",
9393 Alignment);
9394 verifyFormat("if (int i = 0)\n"
9395 " j = i;\n"
9396 "double x = 1;\n",
9397 Alignment);
9398 // Ensure operator[] and operator() are comprehended
9399 verifyFormat("struct test {\n"
9400 " long long int foo();\n"
9401 " int operator[](int a);\n"
9402 " double bar();\n"
9403 "};\n",
9404 Alignment);
9405 verifyFormat("struct test {\n"
9406 " long long int foo();\n"
9407 " int operator()(int a);\n"
9408 " double bar();\n"
9409 "};\n",
9410 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009411 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9412 " int const i = 1;\n"
9413 " int * j = 2;\n"
9414 " int big = 10000;\n"
9415 "\n"
9416 " unsigned oneTwoThree = 123;\n"
9417 " int oneTwo = 12;\n"
9418 " method();\n"
9419 " float k = 2;\n"
9420 " int ll = 10000;\n"
9421 "}",
9422 format("void SomeFunction(int parameter= 0) {\n"
9423 " int const i= 1;\n"
9424 " int *j=2;\n"
9425 " int big = 10000;\n"
9426 "\n"
9427 "unsigned oneTwoThree =123;\n"
9428 "int oneTwo = 12;\n"
9429 " method();\n"
9430 "float k= 2;\n"
9431 "int ll=10000;\n"
9432 "}",
9433 Alignment));
9434 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009435 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9436 verifyFormat("#define A \\\n"
9437 " int aaaa = 12; \\\n"
9438 " float b = 23; \\\n"
9439 " const int ccc = 234; \\\n"
9440 " unsigned dddddddddd = 2345;",
9441 Alignment);
9442 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009443 verifyFormat("#define A \\\n"
9444 " int aaaa = 12; \\\n"
9445 " float b = 23; \\\n"
9446 " const int ccc = 234; \\\n"
9447 " unsigned dddddddddd = 2345;",
9448 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009449 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009450 Alignment.ColumnLimit = 30;
9451 verifyFormat("#define A \\\n"
9452 " int aaaa = 12; \\\n"
9453 " float b = 23; \\\n"
9454 " const int ccc = 234; \\\n"
9455 " int dddddddddd = 2345;",
9456 Alignment);
9457 Alignment.ColumnLimit = 80;
9458 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9459 "k = 4, int l = 5,\n"
9460 " int m = 6) {\n"
9461 " const int j = 10;\n"
9462 " otherThing = 1;\n"
9463 "}",
9464 Alignment);
9465 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9466 " int const i = 1;\n"
9467 " int * j = 2;\n"
9468 " int big = 10000;\n"
9469 "}",
9470 Alignment);
9471 verifyFormat("class C {\n"
9472 "public:\n"
9473 " int i = 1;\n"
9474 " virtual void f() = 0;\n"
9475 "};",
9476 Alignment);
9477 verifyFormat("float i = 1;\n"
9478 "if (SomeType t = getSomething()) {\n"
9479 "}\n"
9480 "const unsigned j = 2;\n"
9481 "int big = 10000;",
9482 Alignment);
9483 verifyFormat("float j = 7;\n"
9484 "for (int k = 0; k < N; ++k) {\n"
9485 "}\n"
9486 "unsigned j = 2;\n"
9487 "int big = 10000;\n"
9488 "}",
9489 Alignment);
9490 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9491 verifyFormat("float i = 1;\n"
9492 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9493 " = someLooooooooooooooooongFunction();\n"
9494 "int j = 2;",
9495 Alignment);
9496 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9497 verifyFormat("int i = 1;\n"
9498 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9499 " someLooooooooooooooooongFunction();\n"
9500 "int j = 2;",
9501 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009502
9503 Alignment.AlignConsecutiveAssignments = true;
9504 verifyFormat("auto lambda = []() {\n"
9505 " auto ii = 0;\n"
9506 " float j = 0;\n"
9507 " return 0;\n"
9508 "};\n"
9509 "int i = 0;\n"
9510 "float i2 = 0;\n"
9511 "auto v = type{\n"
9512 " i = 1, //\n"
9513 " (i = 2), //\n"
9514 " i = 3 //\n"
9515 "};",
9516 Alignment);
9517 Alignment.AlignConsecutiveAssignments = false;
9518
Daniel Jaspere12597c2015-10-01 10:06:54 +00009519 verifyFormat(
9520 "int i = 1;\n"
9521 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9522 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009523 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009524 Alignment);
9525
9526 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9527 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009528 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00009529 // happens.
9530 Alignment.AlignConsecutiveAssignments = true;
9531 Alignment.ColumnLimit = 30;
9532 verifyFormat("float ii = 1;\n"
9533 "unsigned j = 2;\n"
9534 "int someVerylongVariable = 1;\n"
9535 "AnotherLongType ll = 123456;\n"
9536 "VeryVeryLongType k = 2;\n"
9537 "int myvar = 1;",
9538 Alignment);
9539 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009540 Alignment.AlignConsecutiveAssignments = false;
9541
9542 verifyFormat(
9543 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9544 " typename LongType, typename B>\n"
9545 "auto foo() {}\n",
9546 Alignment);
9547 verifyFormat("float a, b = 1;\n"
9548 "int c = 2;\n"
9549 "int dd = 3;\n",
9550 Alignment);
9551 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9552 "float b[1][] = {{3.f}};\n",
9553 Alignment);
9554 Alignment.AlignConsecutiveAssignments = true;
9555 verifyFormat("float a, b = 1;\n"
9556 "int c = 2;\n"
9557 "int dd = 3;\n",
9558 Alignment);
9559 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9560 "float b[1][] = {{3.f}};\n",
9561 Alignment);
9562 Alignment.AlignConsecutiveAssignments = false;
9563
9564 Alignment.ColumnLimit = 30;
9565 Alignment.BinPackParameters = false;
9566 verifyFormat("void foo(float a,\n"
9567 " float b,\n"
9568 " int c,\n"
9569 " uint32_t *d) {\n"
9570 " int * e = 0;\n"
9571 " float f = 0;\n"
9572 " double g = 0;\n"
9573 "}\n"
9574 "void bar(ino_t a,\n"
9575 " int b,\n"
9576 " uint32_t *c,\n"
9577 " bool d) {}\n",
9578 Alignment);
9579 Alignment.BinPackParameters = true;
9580 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +00009581
9582 // Bug 33507
9583 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
9584 verifyFormat(
9585 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
9586 " static const Version verVs2017;\n"
9587 " return true;\n"
9588 "});\n",
9589 Alignment);
9590 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009591}
9592
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009593TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009594 FormatStyle LinuxBraceStyle = getLLVMStyle();
9595 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009596 verifyFormat("namespace a\n"
9597 "{\n"
9598 "class A\n"
9599 "{\n"
9600 " void f()\n"
9601 " {\n"
9602 " if (true) {\n"
9603 " a();\n"
9604 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009605 " } else {\n"
9606 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009607 " }\n"
9608 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009609 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009610 "};\n"
9611 "struct B {\n"
9612 " int x;\n"
9613 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009614 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009615 LinuxBraceStyle);
9616 verifyFormat("enum X {\n"
9617 " Y = 0,\n"
9618 "}\n",
9619 LinuxBraceStyle);
9620 verifyFormat("struct S {\n"
9621 " int Type;\n"
9622 " union {\n"
9623 " int x;\n"
9624 " double y;\n"
9625 " } Value;\n"
9626 " class C\n"
9627 " {\n"
9628 " MyFavoriteType Value;\n"
9629 " } Class;\n"
9630 "}\n",
9631 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009632}
9633
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009634TEST_F(FormatTest, MozillaBraceBreaking) {
9635 FormatStyle MozillaBraceStyle = getLLVMStyle();
9636 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009637 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009638 verifyFormat("namespace a {\n"
9639 "class A\n"
9640 "{\n"
9641 " void f()\n"
9642 " {\n"
9643 " if (true) {\n"
9644 " a();\n"
9645 " b();\n"
9646 " }\n"
9647 " }\n"
9648 " void g() { return; }\n"
9649 "};\n"
9650 "enum E\n"
9651 "{\n"
9652 " A,\n"
9653 " // foo\n"
9654 " B,\n"
9655 " C\n"
9656 "};\n"
9657 "struct B\n"
9658 "{\n"
9659 " int x;\n"
9660 "};\n"
9661 "}\n",
9662 MozillaBraceStyle);
9663 verifyFormat("struct S\n"
9664 "{\n"
9665 " int Type;\n"
9666 " union\n"
9667 " {\n"
9668 " int x;\n"
9669 " double y;\n"
9670 " } Value;\n"
9671 " class C\n"
9672 " {\n"
9673 " MyFavoriteType Value;\n"
9674 " } Class;\n"
9675 "}\n",
9676 MozillaBraceStyle);
9677}
9678
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009679TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009680 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9681 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009682 verifyFormat("namespace a {\n"
9683 "class A {\n"
9684 " void f()\n"
9685 " {\n"
9686 " if (true) {\n"
9687 " a();\n"
9688 " b();\n"
9689 " }\n"
9690 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009691 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009692 "};\n"
9693 "struct B {\n"
9694 " int x;\n"
9695 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00009696 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009697 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009698
Daniel Jasperd9670872014-08-05 12:06:20 +00009699 verifyFormat("void foo()\n"
9700 "{\n"
9701 " if (a) {\n"
9702 " a();\n"
9703 " }\n"
9704 " else {\n"
9705 " b();\n"
9706 " }\n"
9707 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009708 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009709
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009710 verifyFormat("#ifdef _DEBUG\n"
9711 "int foo(int i = 0)\n"
9712 "#else\n"
9713 "int foo(int i = 5)\n"
9714 "#endif\n"
9715 "{\n"
9716 " return i;\n"
9717 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009718 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009719
9720 verifyFormat("void foo() {}\n"
9721 "void bar()\n"
9722 "#ifdef _DEBUG\n"
9723 "{\n"
9724 " foo();\n"
9725 "}\n"
9726 "#else\n"
9727 "{\n"
9728 "}\n"
9729 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009730 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009731
9732 verifyFormat("void foobar() { int i = 5; }\n"
9733 "#ifdef _DEBUG\n"
9734 "void bar() {}\n"
9735 "#else\n"
9736 "void bar() { foobar(); }\n"
9737 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009738 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009739}
9740
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009741TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009742 FormatStyle AllmanBraceStyle = getLLVMStyle();
9743 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009744
9745 EXPECT_EQ("namespace a\n"
9746 "{\n"
9747 "void f();\n"
9748 "void g();\n"
9749 "} // namespace a\n",
9750 format("namespace a\n"
9751 "{\n"
9752 "void f();\n"
9753 "void g();\n"
9754 "}\n",
9755 AllmanBraceStyle));
9756
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009757 verifyFormat("namespace a\n"
9758 "{\n"
9759 "class A\n"
9760 "{\n"
9761 " void f()\n"
9762 " {\n"
9763 " if (true)\n"
9764 " {\n"
9765 " a();\n"
9766 " b();\n"
9767 " }\n"
9768 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009769 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009770 "};\n"
9771 "struct B\n"
9772 "{\n"
9773 " int x;\n"
9774 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009775 "} // namespace a",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009776 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009777
9778 verifyFormat("void f()\n"
9779 "{\n"
9780 " if (true)\n"
9781 " {\n"
9782 " a();\n"
9783 " }\n"
9784 " else if (false)\n"
9785 " {\n"
9786 " b();\n"
9787 " }\n"
9788 " else\n"
9789 " {\n"
9790 " c();\n"
9791 " }\n"
9792 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009793 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009794
9795 verifyFormat("void f()\n"
9796 "{\n"
9797 " for (int i = 0; i < 10; ++i)\n"
9798 " {\n"
9799 " a();\n"
9800 " }\n"
9801 " while (false)\n"
9802 " {\n"
9803 " b();\n"
9804 " }\n"
9805 " do\n"
9806 " {\n"
9807 " c();\n"
9808 " } while (false)\n"
9809 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009810 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009811
9812 verifyFormat("void f(int a)\n"
9813 "{\n"
9814 " switch (a)\n"
9815 " {\n"
9816 " case 0:\n"
9817 " break;\n"
9818 " case 1:\n"
9819 " {\n"
9820 " break;\n"
9821 " }\n"
9822 " case 2:\n"
9823 " {\n"
9824 " }\n"
9825 " break;\n"
9826 " default:\n"
9827 " break;\n"
9828 " }\n"
9829 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009830 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009831
9832 verifyFormat("enum X\n"
9833 "{\n"
9834 " Y = 0,\n"
9835 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009836 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009837 verifyFormat("enum X\n"
9838 "{\n"
9839 " Y = 0\n"
9840 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009841 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009842
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009843 verifyFormat("@interface BSApplicationController ()\n"
9844 "{\n"
9845 "@private\n"
9846 " id _extraIvar;\n"
9847 "}\n"
9848 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009849 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009850
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009851 verifyFormat("#ifdef _DEBUG\n"
9852 "int foo(int i = 0)\n"
9853 "#else\n"
9854 "int foo(int i = 5)\n"
9855 "#endif\n"
9856 "{\n"
9857 " return i;\n"
9858 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009859 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009860
9861 verifyFormat("void foo() {}\n"
9862 "void bar()\n"
9863 "#ifdef _DEBUG\n"
9864 "{\n"
9865 " foo();\n"
9866 "}\n"
9867 "#else\n"
9868 "{\n"
9869 "}\n"
9870 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009871 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009872
9873 verifyFormat("void foobar() { int i = 5; }\n"
9874 "#ifdef _DEBUG\n"
9875 "void bar() {}\n"
9876 "#else\n"
9877 "void bar() { foobar(); }\n"
9878 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009879 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009880
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009881 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009882 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009883 " // ...\n"
9884 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009885 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009886 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009887 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009888 " // ...\n"
9889 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009890 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009891 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009892 // .. or dict literals.
9893 verifyFormat("void f()\n"
9894 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00009895 " // ...\n"
9896 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
9897 "}",
9898 AllmanBraceStyle);
9899 verifyFormat("void f()\n"
9900 "{\n"
9901 " // ...\n"
9902 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009903 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009904 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009905 verifyFormat("int f()\n"
9906 "{ // comment\n"
9907 " return 42;\n"
9908 "}",
9909 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009910
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009911 AllmanBraceStyle.ColumnLimit = 19;
9912 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9913 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009914 verifyFormat("void f()\n"
9915 "{\n"
9916 " int i;\n"
9917 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009918 AllmanBraceStyle);
9919 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009920
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009921 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009922 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9923 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9924 verifyFormat("void f(bool b)\n"
9925 "{\n"
9926 " if (b)\n"
9927 " {\n"
9928 " return;\n"
9929 " }\n"
9930 "}\n",
9931 BreakBeforeBraceShortIfs);
9932 verifyFormat("void f(bool b)\n"
9933 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009934 " if constexpr (b)\n"
9935 " {\n"
9936 " return;\n"
9937 " }\n"
9938 "}\n",
9939 BreakBeforeBraceShortIfs);
9940 verifyFormat("void f(bool b)\n"
9941 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009942 " if (b) return;\n"
9943 "}\n",
9944 BreakBeforeBraceShortIfs);
9945 verifyFormat("void f(bool b)\n"
9946 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009947 " if constexpr (b) return;\n"
9948 "}\n",
9949 BreakBeforeBraceShortIfs);
9950 verifyFormat("void f(bool b)\n"
9951 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009952 " while (b)\n"
9953 " {\n"
9954 " return;\n"
9955 " }\n"
9956 "}\n",
9957 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009958}
9959
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009960TEST_F(FormatTest, GNUBraceBreaking) {
9961 FormatStyle GNUBraceStyle = getLLVMStyle();
9962 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9963 verifyFormat("namespace a\n"
9964 "{\n"
9965 "class A\n"
9966 "{\n"
9967 " void f()\n"
9968 " {\n"
9969 " int a;\n"
9970 " {\n"
9971 " int b;\n"
9972 " }\n"
9973 " if (true)\n"
9974 " {\n"
9975 " a();\n"
9976 " b();\n"
9977 " }\n"
9978 " }\n"
9979 " void g() { return; }\n"
9980 "}\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009981 "} // namespace a",
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009982 GNUBraceStyle);
9983
9984 verifyFormat("void f()\n"
9985 "{\n"
9986 " if (true)\n"
9987 " {\n"
9988 " a();\n"
9989 " }\n"
9990 " else if (false)\n"
9991 " {\n"
9992 " b();\n"
9993 " }\n"
9994 " else\n"
9995 " {\n"
9996 " c();\n"
9997 " }\n"
9998 "}\n",
9999 GNUBraceStyle);
10000
10001 verifyFormat("void f()\n"
10002 "{\n"
10003 " for (int i = 0; i < 10; ++i)\n"
10004 " {\n"
10005 " a();\n"
10006 " }\n"
10007 " while (false)\n"
10008 " {\n"
10009 " b();\n"
10010 " }\n"
10011 " do\n"
10012 " {\n"
10013 " c();\n"
10014 " }\n"
10015 " while (false);\n"
10016 "}\n",
10017 GNUBraceStyle);
10018
10019 verifyFormat("void f(int a)\n"
10020 "{\n"
10021 " switch (a)\n"
10022 " {\n"
10023 " case 0:\n"
10024 " break;\n"
10025 " case 1:\n"
10026 " {\n"
10027 " break;\n"
10028 " }\n"
10029 " case 2:\n"
10030 " {\n"
10031 " }\n"
10032 " break;\n"
10033 " default:\n"
10034 " break;\n"
10035 " }\n"
10036 "}\n",
10037 GNUBraceStyle);
10038
10039 verifyFormat("enum X\n"
10040 "{\n"
10041 " Y = 0,\n"
10042 "}\n",
10043 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010044
10045 verifyFormat("@interface BSApplicationController ()\n"
10046 "{\n"
10047 "@private\n"
10048 " id _extraIvar;\n"
10049 "}\n"
10050 "@end\n",
10051 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010052
10053 verifyFormat("#ifdef _DEBUG\n"
10054 "int foo(int i = 0)\n"
10055 "#else\n"
10056 "int foo(int i = 5)\n"
10057 "#endif\n"
10058 "{\n"
10059 " return i;\n"
10060 "}",
10061 GNUBraceStyle);
10062
10063 verifyFormat("void foo() {}\n"
10064 "void bar()\n"
10065 "#ifdef _DEBUG\n"
10066 "{\n"
10067 " foo();\n"
10068 "}\n"
10069 "#else\n"
10070 "{\n"
10071 "}\n"
10072 "#endif",
10073 GNUBraceStyle);
10074
10075 verifyFormat("void foobar() { int i = 5; }\n"
10076 "#ifdef _DEBUG\n"
10077 "void bar() {}\n"
10078 "#else\n"
10079 "void bar() { foobar(); }\n"
10080 "#endif",
10081 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010082}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010083
10084TEST_F(FormatTest, WebKitBraceBreaking) {
10085 FormatStyle WebKitBraceStyle = getLLVMStyle();
10086 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010087 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010088 verifyFormat("namespace a {\n"
10089 "class A {\n"
10090 " void f()\n"
10091 " {\n"
10092 " if (true) {\n"
10093 " a();\n"
10094 " b();\n"
10095 " }\n"
10096 " }\n"
10097 " void g() { return; }\n"
10098 "};\n"
10099 "enum E {\n"
10100 " A,\n"
10101 " // foo\n"
10102 " B,\n"
10103 " C\n"
10104 "};\n"
10105 "struct B {\n"
10106 " int x;\n"
10107 "};\n"
10108 "}\n",
10109 WebKitBraceStyle);
10110 verifyFormat("struct S {\n"
10111 " int Type;\n"
10112 " union {\n"
10113 " int x;\n"
10114 " double y;\n"
10115 " } Value;\n"
10116 " class C {\n"
10117 " MyFavoriteType Value;\n"
10118 " } Class;\n"
10119 "};\n",
10120 WebKitBraceStyle);
10121}
10122
Manuel Klimekd5735502013-08-12 03:51:17 +000010123TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10124 verifyFormat("void f() {\n"
10125 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010126 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010127 " }\n"
10128 "}\n",
10129 getLLVMStyle());
10130}
10131
Daniel Jasper9613c812013-08-07 16:29:23 +000010132TEST_F(FormatTest, UnderstandsPragmas) {
10133 verifyFormat("#pragma omp reduction(| : var)");
10134 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010135
10136 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10137 "(including parentheses).",
10138 format("#pragma mark Any non-hyphenated or hyphenated string "
10139 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010140}
10141
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010142TEST_F(FormatTest, UnderstandPragmaOption) {
10143 verifyFormat("#pragma option -C -A");
10144
10145 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10146}
10147
Manuel Klimek77866142017-11-17 11:17:15 +000010148TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
10149 FormatStyle Style = getLLVMStyle();
10150 Style.ColumnLimit = 20;
10151
10152 verifyFormat("int a; // the\n"
10153 " // comment", Style);
10154 EXPECT_EQ("int a; /* first line\n"
10155 " * second\n"
10156 " * line third\n"
10157 " * line\n"
10158 " */",
10159 format("int a; /* first line\n"
10160 " * second\n"
10161 " * line third\n"
10162 " * line\n"
10163 " */",
10164 Style));
10165 EXPECT_EQ("int a; // first line\n"
10166 " // second\n"
10167 " // line third\n"
10168 " // line",
10169 format("int a; // first line\n"
10170 " // second line\n"
10171 " // third line",
10172 Style));
10173
10174 Style.PenaltyExcessCharacter = 90;
10175 verifyFormat("int a; // the comment", Style);
Manuel Klimek93699f42017-11-29 14:29:43 +000010176 EXPECT_EQ("int a; // the comment\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010177 " // aaa",
10178 format("int a; // the comment aaa", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010179 EXPECT_EQ("int a; /* first line\n"
10180 " * second line\n"
10181 " * third line\n"
10182 " */",
10183 format("int a; /* first line\n"
10184 " * second line\n"
10185 " * third line\n"
10186 " */",
10187 Style));
Manuel Klimek93699f42017-11-29 14:29:43 +000010188 EXPECT_EQ("int a; // first line\n"
10189 " // second line\n"
10190 " // third line",
10191 format("int a; // first line\n"
10192 " // second line\n"
10193 " // third line",
10194 Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010195 // FIXME: Investigate why this is not getting the same layout as the test
10196 // above.
10197 EXPECT_EQ("int a; /* first line\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010198 " * second line\n"
10199 " * third line\n"
Manuel Klimek77866142017-11-17 11:17:15 +000010200 " */",
10201 format("int a; /* first line second line third line"
10202 "\n*/",
10203 Style));
10204
10205 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010206 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010207 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010208 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010209 Style));
10210 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010211 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010212 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010213 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010214 Style));
10215
10216 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
10217 // next one.
Manuel Klimek93699f42017-11-29 14:29:43 +000010218 EXPECT_EQ("// foo bar baz bazfoo\n"
10219 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010220 format("// foo bar baz bazfoo bar\n"
10221 "// foo bar\n",
10222 Style));
10223
10224 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010225 "// foo bar baz bazfoo\n"
10226 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010227 format("// foo bar baz bazfoo\n"
10228 "// foo bar baz bazfoo bar\n"
10229 "// foo bar\n",
10230 Style));
10231
Manuel Klimek77866142017-11-17 11:17:15 +000010232 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010233 "// foo bar baz bazfoo\n"
10234 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010235 format("// foo bar baz bazfoo\n"
10236 "// foo bar baz bazfoo bar\n"
10237 "// foo bar\n",
10238 Style));
Manuel Klimek0b58c322017-12-01 13:28:08 +000010239
10240 // Make sure we do not keep protruding characters if strict mode reflow is
10241 // cheaper than keeping protruding characters.
10242 Style.ColumnLimit = 21;
10243 EXPECT_EQ("// foo foo foo foo\n"
10244 "// foo foo foo foo\n"
10245 "// foo foo foo foo\n",
10246 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
10247 Style));
10248
10249 EXPECT_EQ("int a = /* long block\n"
10250 " comment */\n"
10251 " 42;",
10252 format("int a = /* long block comment */ 42;", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010253}
10254
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010255#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10256 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010257 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10258 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010259
10260TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010261 SmallVector<FormatStyle, 3> Styles;
10262 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010263
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010264 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010265 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10266 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10267 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010268
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010269 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010270 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10271 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10272 EXPECT_ALL_STYLES_EQUAL(Styles);
10273
Nico Weber514ecc82014-02-02 20:50:45 +000010274 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010275 EXPECT_TRUE(
10276 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10277 EXPECT_TRUE(
10278 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10279 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010280
Nico Weber514ecc82014-02-02 20:50:45 +000010281 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010282 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10283 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10284 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010285
10286 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010287 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10288 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10289 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010290
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010291 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010292 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10293 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10294 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010295
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010296 Styles[0] = getGNUStyle();
10297 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10298 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10299 EXPECT_ALL_STYLES_EQUAL(Styles);
10300
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010301 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10302}
10303
10304TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10305 SmallVector<FormatStyle, 8> Styles;
10306 Styles.resize(2);
10307
10308 Styles[0] = getGoogleStyle();
10309 Styles[1] = getLLVMStyle();
10310 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10311 EXPECT_ALL_STYLES_EQUAL(Styles);
10312
10313 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010314 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010315 Styles[1] = getLLVMStyle();
10316 Styles[1].Language = FormatStyle::LK_JavaScript;
10317 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10318
10319 Styles[2] = getLLVMStyle();
10320 Styles[2].Language = FormatStyle::LK_JavaScript;
10321 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10322 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010323 &Styles[2])
10324 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010325
10326 Styles[3] = getLLVMStyle();
10327 Styles[3].Language = FormatStyle::LK_JavaScript;
10328 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10329 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010330 &Styles[3])
10331 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010332
10333 Styles[4] = getLLVMStyle();
10334 Styles[4].Language = FormatStyle::LK_JavaScript;
10335 EXPECT_EQ(0, parseConfiguration("---\n"
10336 "BasedOnStyle: LLVM\n"
10337 "IndentWidth: 123\n"
10338 "---\n"
10339 "BasedOnStyle: Google\n"
10340 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010341 &Styles[4])
10342 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010343 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010344}
10345
Daniel Jasper91881d92014-09-29 08:07:46 +000010346#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010347 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010348 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010349 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010350 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010351 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010352
Daniel Jasper91881d92014-09-29 08:07:46 +000010353#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10354
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010355#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10356 Style.STRUCT.FIELD = false; \
10357 EXPECT_EQ(0, \
10358 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10359 .value()); \
10360 EXPECT_TRUE(Style.STRUCT.FIELD); \
10361 EXPECT_EQ(0, \
10362 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10363 .value()); \
10364 EXPECT_FALSE(Style.STRUCT.FIELD);
10365
10366#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10367 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10368
Daniel Jasper00853002014-09-16 16:22:30 +000010369#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10370 EXPECT_NE(VALUE, Style.FIELD); \
10371 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10372 EXPECT_EQ(VALUE, Style.FIELD)
10373
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010374TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010375 FormatStyle Style = {};
10376 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +000010377 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010378 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010379 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010380 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010381 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010382 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010383 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010384 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010385 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010386 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010387 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010388 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010389 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010390 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010391 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +000010392 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Francois Ferrande56a8292017-06-14 12:29:47 +000010393 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010394 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010395 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010396 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010397 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010398 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010399 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010400 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010401 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010402 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010403 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010404 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010405 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +000010406 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010407 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010408 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010409 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010410 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010411 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010412 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010413 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010414 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010415 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Francois Ferrand2a9ea782018-03-01 10:09:13 +000010416 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
10417 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
10418 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010419
10420 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10421 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10422 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10423 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10424 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10425 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10426 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10427 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
Krasimir Georgievd6ce9372017-09-15 11:23:50 +000010428 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010429 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10430 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10431 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +000010432 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10433 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10434 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010435}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010436
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010437#undef CHECK_PARSE_BOOL
10438
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010439TEST_F(FormatTest, ParsesConfiguration) {
10440 FormatStyle Style = {};
10441 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010442 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010443 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10444 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010445 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010446 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10447 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +000010448 CHECK_PARSE("PenaltyBreakAssignment: 1234",
10449 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010450 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10451 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010452 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10453 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10454 PenaltyReturnTypeOnItsOwnLine, 1234u);
10455 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10456 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010457 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010458 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010459 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010460
Daniel Jasper553d4872014-06-17 12:40:34 +000010461 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010462 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10463 FormatStyle::PAS_Left);
10464 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10465 FormatStyle::PAS_Right);
10466 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10467 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010468 // For backward compatibility:
10469 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10470 FormatStyle::PAS_Left);
10471 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10472 FormatStyle::PAS_Right);
10473 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10474 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010475
Alexander Kornienkod6538332013-05-07 15:32:14 +000010476 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010477 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10478 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010479 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10480 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10481 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10482
Daniel Jasperac043c92014-09-15 11:11:00 +000010483 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010484 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10485 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010486 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10487 FormatStyle::BOS_None);
10488 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10489 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010490 // For backward compatibility:
10491 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10492 FormatStyle::BOS_None);
10493 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10494 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010495
Francois Ferranda6b6d512017-05-24 11:36:58 +000010496 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10497 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10498 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10499 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10500 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10501 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10502 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10503 // For backward compatibility:
10504 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10505 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10506
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010507 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10508 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10509 FormatStyle::BAS_Align);
10510 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10511 FormatStyle::BAS_DontAlign);
10512 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10513 FormatStyle::BAS_AlwaysBreak);
10514 // For backward compatibility:
10515 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10516 FormatStyle::BAS_DontAlign);
10517 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10518 FormatStyle::BAS_Align);
10519
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +000010520 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10521 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
10522 FormatStyle::ENAS_DontAlign);
10523 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
10524 FormatStyle::ENAS_Left);
10525 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
10526 FormatStyle::ENAS_Right);
10527 // For backward compatibility:
10528 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
10529 FormatStyle::ENAS_Left);
10530 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
10531 FormatStyle::ENAS_Right);
10532
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010533 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010534 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10535 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10536 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010537 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10538 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010539 // For backward compatibility:
10540 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10541 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010542
Daniel Jasperd74cf402014-04-08 12:46:38 +000010543 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010544 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10545 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10546 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10547 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010548 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10549 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010550 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10551 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010552 // For backward compatibility:
10553 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10554 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10555 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10556 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010557
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010558 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10559 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10560 FormatStyle::SBPO_Never);
10561 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10562 FormatStyle::SBPO_Always);
10563 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10564 FormatStyle::SBPO_ControlStatements);
10565 // For backward compatibility:
10566 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10567 FormatStyle::SBPO_Never);
10568 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10569 FormatStyle::SBPO_ControlStatements);
10570
Alexander Kornienkod6538332013-05-07 15:32:14 +000010571 Style.ColumnLimit = 123;
10572 FormatStyle BaseStyle = getLLVMStyle();
10573 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10574 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10575
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010576 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10577 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10578 FormatStyle::BS_Attach);
10579 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10580 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010581 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10582 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010583 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10584 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010585 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10586 FormatStyle::BS_Allman);
10587 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010588 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10589 FormatStyle::BS_WebKit);
10590 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10591 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010592
Zachary Turner448592e2015-12-18 22:20:15 +000010593 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10594 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10595 FormatStyle::RTBS_None);
10596 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10597 FormatStyle::RTBS_All);
10598 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010599 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010600 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10601 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10602 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10603 AlwaysBreakAfterReturnType,
10604 FormatStyle::RTBS_TopLevelDefinitions);
10605
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010606 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10607 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10608 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10609 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10610 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10611 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10612 AlwaysBreakAfterDefinitionReturnType,
10613 FormatStyle::DRTBS_TopLevel);
10614
Daniel Jasper65ee3472013-07-31 23:16:02 +000010615 Style.NamespaceIndentation = FormatStyle::NI_All;
10616 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10617 FormatStyle::NI_None);
10618 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10619 FormatStyle::NI_Inner);
10620 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10621 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010622
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010623 // FIXME: This is required because parsing a configuration simply overwrites
10624 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010625 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010626 std::vector<std::string> BoostForeach;
10627 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010628 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010629 std::vector<std::string> BoostAndQForeach;
10630 BoostAndQForeach.push_back("BOOST_FOREACH");
10631 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010632 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10633 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010634
10635 Style.IncludeCategories.clear();
10636 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10637 {".*", 1}};
10638 CHECK_PARSE("IncludeCategories:\n"
10639 " - Regex: abc/.*\n"
10640 " Priority: 2\n"
10641 " - Regex: .*\n"
10642 " Priority: 1",
10643 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010644 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010645
10646 Style.RawStringFormats.clear();
10647 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010648 {
10649 FormatStyle::LK_TextProto,
10650 {"pb", "proto"},
10651 {"PARSE_TEXT_PROTO"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010652 /*CanonicalDelimiter=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010653 "llvm",
10654 },
10655 {
10656 FormatStyle::LK_Cpp,
10657 {"cc", "cpp"},
10658 {"C_CODEBLOCK", "CPPEVAL"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010659 /*CanonicalDelimiter=*/"cc",
10660 /*BasedOnStyle=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010661 },
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010662 };
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010663
10664 CHECK_PARSE("RawStringFormats:\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010665 " - Language: TextProto\n"
10666 " Delimiters:\n"
10667 " - 'pb'\n"
10668 " - 'proto'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010669 " EnclosingFunctions:\n"
10670 " - 'PARSE_TEXT_PROTO'\n"
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010671 " BasedOnStyle: llvm\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010672 " - Language: Cpp\n"
10673 " Delimiters:\n"
10674 " - 'cc'\n"
10675 " - 'cpp'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010676 " EnclosingFunctions:\n"
10677 " - 'C_CODEBLOCK'\n"
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010678 " - 'CPPEVAL'\n"
10679 " CanonicalDelimiter: 'cc'",
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010680 RawStringFormats, ExpectedRawStringFormats);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010681}
10682
10683TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10684 FormatStyle Style = {};
10685 Style.Language = FormatStyle::LK_Cpp;
10686 CHECK_PARSE("Language: Cpp\n"
10687 "IndentWidth: 12",
10688 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010689 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10690 "IndentWidth: 34",
10691 &Style),
10692 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010693 EXPECT_EQ(12u, Style.IndentWidth);
10694 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10695 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10696
10697 Style.Language = FormatStyle::LK_JavaScript;
10698 CHECK_PARSE("Language: JavaScript\n"
10699 "IndentWidth: 12",
10700 IndentWidth, 12u);
10701 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010702 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10703 "IndentWidth: 34",
10704 &Style),
10705 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010706 EXPECT_EQ(23u, Style.IndentWidth);
10707 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10708 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10709
10710 CHECK_PARSE("BasedOnStyle: LLVM\n"
10711 "IndentWidth: 67",
10712 IndentWidth, 67u);
10713
10714 CHECK_PARSE("---\n"
10715 "Language: JavaScript\n"
10716 "IndentWidth: 12\n"
10717 "---\n"
10718 "Language: Cpp\n"
10719 "IndentWidth: 34\n"
10720 "...\n",
10721 IndentWidth, 12u);
10722
10723 Style.Language = FormatStyle::LK_Cpp;
10724 CHECK_PARSE("---\n"
10725 "Language: JavaScript\n"
10726 "IndentWidth: 12\n"
10727 "---\n"
10728 "Language: Cpp\n"
10729 "IndentWidth: 34\n"
10730 "...\n",
10731 IndentWidth, 34u);
10732 CHECK_PARSE("---\n"
10733 "IndentWidth: 78\n"
10734 "---\n"
10735 "Language: JavaScript\n"
10736 "IndentWidth: 56\n"
10737 "...\n",
10738 IndentWidth, 78u);
10739
10740 Style.ColumnLimit = 123;
10741 Style.IndentWidth = 234;
10742 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10743 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010744 EXPECT_FALSE(parseConfiguration("---\n"
10745 "IndentWidth: 456\n"
10746 "BreakBeforeBraces: Allman\n"
10747 "---\n"
10748 "Language: JavaScript\n"
10749 "IndentWidth: 111\n"
10750 "TabWidth: 111\n"
10751 "---\n"
10752 "Language: Cpp\n"
10753 "BreakBeforeBraces: Stroustrup\n"
10754 "TabWidth: 789\n"
10755 "...\n",
10756 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010757 EXPECT_EQ(123u, Style.ColumnLimit);
10758 EXPECT_EQ(456u, Style.IndentWidth);
10759 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10760 EXPECT_EQ(789u, Style.TabWidth);
10761
Rafael Espindola1f243172014-06-12 11:35:17 +000010762 EXPECT_EQ(parseConfiguration("---\n"
10763 "Language: JavaScript\n"
10764 "IndentWidth: 56\n"
10765 "---\n"
10766 "IndentWidth: 78\n"
10767 "...\n",
10768 &Style),
10769 ParseError::Error);
10770 EXPECT_EQ(parseConfiguration("---\n"
10771 "Language: JavaScript\n"
10772 "IndentWidth: 56\n"
10773 "---\n"
10774 "Language: JavaScript\n"
10775 "IndentWidth: 78\n"
10776 "...\n",
10777 &Style),
10778 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010779
10780 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10781}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010782
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010783#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010784
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010785TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10786 FormatStyle Style = {};
10787 Style.Language = FormatStyle::LK_JavaScript;
10788 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010789 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010790 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010791
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010792 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010793 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010794 "BasedOnStyle: Google\n"
10795 "---\n"
10796 "Language: JavaScript\n"
10797 "IndentWidth: 76\n"
10798 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010799 &Style)
10800 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010801 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010802 EXPECT_EQ(76u, Style.IndentWidth);
10803 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10804}
10805
Alexander Kornienkod6538332013-05-07 15:32:14 +000010806TEST_F(FormatTest, ConfigurationRoundTripTest) {
10807 FormatStyle Style = getLLVMStyle();
10808 std::string YAML = configurationAsText(Style);
10809 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010810 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010811 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10812 EXPECT_EQ(Style, ParsedStyle);
10813}
10814
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010815TEST_F(FormatTest, WorksFor8bitEncodings) {
10816 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10817 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10818 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10819 "\"\xef\xee\xf0\xf3...\"",
10820 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10821 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10822 "\xef\xee\xf0\xf3...\"",
10823 getLLVMStyleWithColumns(12)));
10824}
10825
Alexander Kornienko393e3082013-11-13 14:04:17 +000010826TEST_F(FormatTest, HandlesUTF8BOM) {
10827 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10828 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10829 format("\xef\xbb\xbf#include <iostream>"));
10830 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10831 format("\xef\xbb\xbf\n#include <iostream>"));
10832}
10833
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010834// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10835#if !defined(_MSC_VER)
10836
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010837TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10838 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10839 getLLVMStyleWithColumns(35));
10840 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010841 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010842 verifyFormat("// Однажды в студёную зимнюю пору...",
10843 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010844 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010845 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10846 getLLVMStyleWithColumns(39));
10847 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010848 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010849}
10850
10851TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010852 // Non-printable characters' width is currently considered to be the length in
10853 // bytes in UTF8. The characters can be displayed in very different manner
10854 // (zero-width, single width with a substitution glyph, expanded to their code
10855 // (e.g. "<8d>"), so there's no single correct way to handle them.
10856 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010857 "\"\xc2\x8d\";",
10858 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010859 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010860 "\"\xc2\x8d\";",
10861 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010862 EXPECT_EQ("\"Однажды, в \"\n"
10863 "\"студёную \"\n"
10864 "\"зимнюю \"\n"
10865 "\"пору,\"",
10866 format("\"Однажды, в студёную зимнюю пору,\"",
10867 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010868 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010869 "\"一 二 三 \"\n"
10870 "\"四 五六 \"\n"
10871 "\"七 八 九 \"\n"
10872 "\"十\"",
10873 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Manuel Klimek93699f42017-11-29 14:29:43 +000010874 EXPECT_EQ("\"一\t\"\n"
10875 "\"二 \t\"\n"
10876 "\"三 四 \"\n"
10877 "\"五\t\"\n"
10878 "\"六 \t\"\n"
10879 "\"七 \"\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010880 "\"八九十\tqq\"",
10881 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10882 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010883
10884 // UTF8 character in an escape sequence.
10885 EXPECT_EQ("\"aaaaaa\"\n"
10886 "\"\\\xC2\x8D\"",
10887 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010888}
10889
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010890TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10891 EXPECT_EQ("const char *sssss =\n"
10892 " \"一二三四五六七八\\\n"
10893 " 九 十\";",
10894 format("const char *sssss = \"一二三四五六七八\\\n"
10895 " 九 十\";",
10896 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010897}
10898
10899TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010900 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10901 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010902 EXPECT_EQ("// Я из лесу\n"
10903 "// вышел; был\n"
10904 "// сильный\n"
10905 "// мороз.",
10906 format("// Я из лесу вышел; был сильный мороз.",
10907 getLLVMStyleWithColumns(13)));
10908 EXPECT_EQ("// 一二三\n"
10909 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010910 "// 八 九\n"
10911 "// 十",
10912 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010913}
10914
10915TEST_F(FormatTest, SplitsUTF8BlockComments) {
10916 EXPECT_EQ("/* Гляжу,\n"
10917 " * поднимается\n"
10918 " * медленно в\n"
10919 " * гору\n"
10920 " * Лошадка,\n"
10921 " * везущая\n"
10922 " * хворосту\n"
10923 " * воз. */",
10924 format("/* Гляжу, поднимается медленно в гору\n"
10925 " * Лошадка, везущая хворосту воз. */",
10926 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010927 EXPECT_EQ(
10928 "/* 一二三\n"
10929 " * 四五六七\n"
10930 " * 八 九\n"
10931 " * 十 */",
10932 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010933 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10934 " * 𝕓𝕪𝕥𝕖\n"
10935 " * 𝖀𝕿𝕱-𝟠 */",
10936 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010937}
10938
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010939#endif // _MSC_VER
10940
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010941TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10942 FormatStyle Style = getLLVMStyle();
10943
10944 Style.ConstructorInitializerIndentWidth = 4;
10945 verifyFormat(
10946 "SomeClass::Constructor()\n"
10947 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10948 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10949 Style);
10950
10951 Style.ConstructorInitializerIndentWidth = 2;
10952 verifyFormat(
10953 "SomeClass::Constructor()\n"
10954 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10955 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10956 Style);
10957
10958 Style.ConstructorInitializerIndentWidth = 0;
10959 verifyFormat(
10960 "SomeClass::Constructor()\n"
10961 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10962 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10963 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010964 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10965 verifyFormat(
10966 "SomeLongTemplateVariableName<\n"
10967 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10968 Style);
10969 verifyFormat(
10970 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10971 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10972 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010973}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010974
Daniel Jasper00853002014-09-16 16:22:30 +000010975TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10976 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000010977 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010978 Style.ConstructorInitializerIndentWidth = 4;
10979 verifyFormat("SomeClass::Constructor()\n"
10980 " : a(a)\n"
10981 " , b(b)\n"
10982 " , c(c) {}",
10983 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010984 verifyFormat("SomeClass::Constructor()\n"
10985 " : a(a) {}",
10986 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010987
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010988 Style.ColumnLimit = 0;
10989 verifyFormat("SomeClass::Constructor()\n"
10990 " : a(a) {}",
10991 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010992 verifyFormat("SomeClass::Constructor() noexcept\n"
10993 " : a(a) {}",
10994 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010995 verifyFormat("SomeClass::Constructor()\n"
10996 " : a(a)\n"
10997 " , b(b)\n"
10998 " , c(c) {}",
10999 Style);
11000 verifyFormat("SomeClass::Constructor()\n"
11001 " : a(a) {\n"
11002 " foo();\n"
11003 " bar();\n"
11004 "}",
11005 Style);
11006
Daniel Jasperd74cf402014-04-08 12:46:38 +000011007 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011008 verifyFormat("SomeClass::Constructor()\n"
11009 " : a(a)\n"
11010 " , b(b)\n"
11011 " , c(c) {\n}",
11012 Style);
11013 verifyFormat("SomeClass::Constructor()\n"
11014 " : a(a) {\n}",
11015 Style);
11016
11017 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000011018 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011019 Style.ConstructorInitializerIndentWidth = 2;
11020 verifyFormat("SomeClass::Constructor()\n"
11021 " : a(a)\n"
11022 " , b(b)\n"
11023 " , c(c) {}",
11024 Style);
11025
11026 Style.ConstructorInitializerIndentWidth = 0;
11027 verifyFormat("SomeClass::Constructor()\n"
11028 ": a(a)\n"
11029 ", b(b)\n"
11030 ", c(c) {}",
11031 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011032
11033 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
11034 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011035 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
11036 verifyFormat(
11037 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
11038 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011039 verifyFormat(
11040 "SomeClass::Constructor()\n"
11041 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
11042 Style);
11043 Style.ConstructorInitializerIndentWidth = 4;
11044 Style.ColumnLimit = 60;
11045 verifyFormat("SomeClass::Constructor()\n"
11046 " : aaaaaaaa(aaaaaaaa)\n"
11047 " , aaaaaaaa(aaaaaaaa)\n"
11048 " , aaaaaaaa(aaaaaaaa) {}",
11049 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011050}
11051
Daniel Jasper38efc132014-10-21 07:51:54 +000011052TEST_F(FormatTest, Destructors) {
11053 verifyFormat("void F(int &i) { i.~int(); }");
11054 verifyFormat("void F(int &i) { i->~int(); }");
11055}
11056
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011057TEST_F(FormatTest, FormatsWithWebKitStyle) {
11058 FormatStyle Style = getWebKitStyle();
11059
11060 // Don't indent in outer namespaces.
11061 verifyFormat("namespace outer {\n"
11062 "int i;\n"
11063 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000011064 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011065 "} // namespace inner\n"
11066 "} // namespace outer\n"
11067 "namespace other_outer {\n"
11068 "int i;\n"
11069 "}",
11070 Style);
11071
11072 // Don't indent case labels.
11073 verifyFormat("switch (variable) {\n"
11074 "case 1:\n"
11075 "case 2:\n"
11076 " doSomething();\n"
11077 " break;\n"
11078 "default:\n"
11079 " ++variable;\n"
11080 "}",
11081 Style);
11082
11083 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000011084 EXPECT_EQ("void f()\n"
11085 "{\n"
11086 " if (aaaaaaaaaaaaaaaa\n"
11087 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
11088 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11089 " return;\n"
11090 "}",
11091 format("void f() {\n"
11092 "if (aaaaaaaaaaaaaaaa\n"
11093 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
11094 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11095 "return;\n"
11096 "}",
11097 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011098
Daniel Jasper35995672014-04-29 14:05:20 +000011099 // Allow functions on a single line.
11100 verifyFormat("void f() { return; }", Style);
11101
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011102 // Constructor initializers are formatted one per line with the "," on the
11103 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011104 verifyFormat("Constructor()\n"
11105 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
11106 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000011107 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011108 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
11109 "{\n"
11110 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011111 Style);
11112 verifyFormat("SomeClass::Constructor()\n"
11113 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011114 "{\n"
11115 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011116 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000011117 EXPECT_EQ("SomeClass::Constructor()\n"
11118 " : a(a)\n"
11119 "{\n"
11120 "}",
11121 format("SomeClass::Constructor():a(a){}", Style));
11122 verifyFormat("SomeClass::Constructor()\n"
11123 " : a(a)\n"
11124 " , b(b)\n"
11125 " , c(c)\n"
11126 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011127 "}",
11128 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011129 verifyFormat("SomeClass::Constructor()\n"
11130 " : a(a)\n"
11131 "{\n"
11132 " foo();\n"
11133 " bar();\n"
11134 "}",
11135 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011136
Daniel Jasper65ee3472013-07-31 23:16:02 +000011137 // Access specifiers should be aligned left.
11138 verifyFormat("class C {\n"
11139 "public:\n"
11140 " int i;\n"
11141 "};",
11142 Style);
11143
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011144 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000011145 verifyFormat("int a; // Do not\n"
11146 "double b; // align comments.",
11147 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011148
Daniel Jasper3219e432014-12-02 13:24:51 +000011149 // Do not align operands.
11150 EXPECT_EQ("ASSERT(aaaa\n"
11151 " || bbbb);",
11152 format("ASSERT ( aaaa\n||bbbb);", Style));
11153
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011154 // Accept input's line breaks.
11155 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
11156 " || bbbbbbbbbbbbbbb) {\n"
11157 " i++;\n"
11158 "}",
11159 format("if (aaaaaaaaaaaaaaa\n"
11160 "|| bbbbbbbbbbbbbbb) { i++; }",
11161 Style));
11162 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
11163 " i++;\n"
11164 "}",
11165 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000011166
11167 // Don't automatically break all macro definitions (llvm.org/PR17842).
11168 verifyFormat("#define aNumber 10", Style);
11169 // However, generally keep the line breaks that the user authored.
11170 EXPECT_EQ("#define aNumber \\\n"
11171 " 10",
11172 format("#define aNumber \\\n"
11173 " 10",
11174 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000011175
11176 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011177 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
11178 " copyItems:YES];",
11179 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
11180 "copyItems:YES];",
11181 Style));
11182 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
11183 " copyItems:YES];",
11184 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
11185 " copyItems:YES];",
11186 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000011187 // FIXME: This does not seem right, there should be more indentation before
11188 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011189 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000011190 " @\"a\",\n"
11191 " @\"a\"\n"
11192 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011193 " copyItems:YES];",
11194 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11195 " @\"a\",\n"
11196 " @\"a\"\n"
11197 " ]\n"
11198 " copyItems:YES];",
11199 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011200 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011201 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11202 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011203 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11204 " copyItems:YES];",
11205 Style));
11206
11207 verifyFormat("[self.a b:c c:d];", Style);
11208 EXPECT_EQ("[self.a b:c\n"
11209 " c:d];",
11210 format("[self.a b:c\n"
11211 "c:d];",
11212 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011213}
11214
Manuel Klimekffdeb592013-09-03 15:10:01 +000011215TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011216 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11217 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11218 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11219 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11220 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011221 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Manuel Klimek9f0a4e52017-09-19 09:59:30 +000011222 verifyFormat("auto c = [a = [b = 42] {}] {};\n");
11223 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011224 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011225 verifyFormat("void f() {\n"
11226 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11227 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011228 verifyFormat("void f() {\n"
11229 " other(x.begin(), //\n"
11230 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011231 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011232 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011233 verifyFormat("SomeFunction([]() { // A cool function...\n"
11234 " return 43;\n"
11235 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011236 EXPECT_EQ("SomeFunction([]() {\n"
11237 "#define A a\n"
11238 " return 43;\n"
11239 "});",
11240 format("SomeFunction([](){\n"
11241 "#define A a\n"
11242 "return 43;\n"
11243 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011244 verifyFormat("void f() {\n"
11245 " SomeFunction([](decltype(x), A *a) {});\n"
11246 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011247 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11248 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011249 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11250 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11251 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011252 verifyFormat("Constructor()\n"
11253 " : Field([] { // comment\n"
11254 " int i;\n"
11255 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011256 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11257 " return some_parameter.size();\n"
11258 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011259 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11260 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011261 verifyFormat("int i = aaaaaa ? 1 //\n"
11262 " : [] {\n"
11263 " return 2; //\n"
11264 " }();");
11265 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11266 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11267 " return x == 2; // force break\n"
11268 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011269 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11270 " [=](int iiiiiiiiiiii) {\n"
11271 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
11272 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
11273 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011274 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011275 verifyFormat("SomeFunction({[&] {\n"
11276 " // comment\n"
11277 " },\n"
11278 " [&] {\n"
11279 " // comment\n"
11280 " }});");
11281 verifyFormat("SomeFunction({[&] {\n"
11282 " // comment\n"
11283 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011284 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11285 " [&]() { return true; },\n"
11286 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011287
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011288 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011289 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011290 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011291 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11292 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011293 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011294 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011295 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11296 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011297 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011298 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11299 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011300 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011301 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011302 verifyFormat(
11303 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11304 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11305 " return aaaaaaaaaaaaaaaaa;\n"
11306 " });",
11307 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011308 verifyFormat("[]() //\n"
11309 " -> int {\n"
11310 " return 1; //\n"
11311 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011312
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011313 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011314 verifyFormat("SomeFunction(\n"
11315 " []() {\n"
11316 " int i = 42;\n"
11317 " return i;\n"
11318 " },\n"
11319 " []() {\n"
11320 " int j = 43;\n"
11321 " return j;\n"
11322 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011323
Daniel Jasperda18fd82014-06-10 06:39:03 +000011324 // More complex introducers.
11325 verifyFormat("return [i, args...] {};");
11326
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011327 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011328 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011329 verifyFormat("double &operator[](int i) { return 0; }\n"
11330 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011331 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011332 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011333 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011334
11335 // Other corner cases.
11336 verifyFormat("void f() {\n"
11337 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000011338 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000011339 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011340
11341 // Lambdas created through weird macros.
11342 verifyFormat("void f() {\n"
11343 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011344 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011345 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011346
11347 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11348 " doo_dah();\n"
11349 " doo_dah();\n"
11350 " })) {\n"
11351 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000011352 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
11353 " doo_dah();\n"
11354 " doo_dah();\n"
11355 " })) {\n"
11356 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011357 verifyFormat("auto lambda = []() {\n"
11358 " int a = 2\n"
11359 "#if A\n"
11360 " + 2\n"
11361 "#endif\n"
11362 " ;\n"
11363 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011364
11365 // Lambdas with complex multiline introducers.
11366 verifyFormat(
11367 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11368 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
11369 " -> ::std::unordered_set<\n"
11370 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
11371 " //\n"
11372 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011373}
11374
Martin Probsta004b3f2017-11-17 18:06:33 +000011375TEST_F(FormatTest, EmptyLinesInLambdas) {
11376 verifyFormat("auto lambda = []() {\n"
11377 " x(); //\n"
11378 "};",
11379 "auto lambda = []() {\n"
11380 "\n"
11381 " x(); //\n"
11382 "\n"
11383 "};");
11384}
11385
Manuel Klimek516e0542013-09-04 13:25:30 +000011386TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011387 FormatStyle ShortBlocks = getLLVMStyle();
11388 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11389 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11390 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11391 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11392 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11393 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11394 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011395
Daniel Jasper76284682014-10-22 09:12:44 +000011396 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11397 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11398 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011399
Daniel Jasper76284682014-10-22 09:12:44 +000011400 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011401 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011402 "}];");
11403 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011404 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011405 "}]};");
11406 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011407 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011408 "}];");
11409 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011410 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011411 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011412 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011413 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011414 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011415 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011416 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011417
11418 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011419 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011420 "}];",
11421 getLLVMStyleWithColumns(60));
11422 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011423 " NSString *path = [self sessionFilePath];\n"
11424 " if (path) {\n"
11425 " // ...\n"
11426 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011427 "});");
11428 verifyFormat("[[SessionService sharedService]\n"
11429 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011430 " if (window) {\n"
11431 " [self windowDidLoad:window];\n"
11432 " } else {\n"
11433 " [self errorLoadingWindow];\n"
11434 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011435 " }];");
11436 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011437 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011438 "};\n",
11439 getLLVMStyleWithColumns(40));
11440 verifyFormat("[[SessionService sharedService]\n"
11441 " loadWindowWithCompletionBlock: //\n"
11442 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011443 " if (window) {\n"
11444 " [self windowDidLoad:window];\n"
11445 " } else {\n"
11446 " [self errorLoadingWindow];\n"
11447 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011448 " }];",
11449 getLLVMStyleWithColumns(60));
11450 verifyFormat("[myObject doSomethingWith:arg1\n"
11451 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011452 " // ...\n"
11453 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011454 " }\n"
11455 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011456 " // ...\n"
11457 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011458 " }\n"
11459 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011460 " // ...\n"
11461 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011462 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011463 verifyFormat("[myObject doSomethingWith:arg1\n"
11464 " firstBlock:-1\n"
11465 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011466 " // ...\n"
11467 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011468 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011469
11470 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011471 " @autoreleasepool {\n"
11472 " if (a) {\n"
11473 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011474 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011475 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011476 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011477 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011478 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11479 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011480
11481 FormatStyle FourIndent = getLLVMStyle();
11482 FourIndent.ObjCBlockIndentWidth = 4;
11483 verifyFormat("[operation setCompletionBlock:^{\n"
11484 " [self onOperationDone];\n"
11485 "}];",
11486 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011487}
11488
Daniel Jasper289afc02015-04-23 09:23:17 +000011489TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11490 FormatStyle ZeroColumn = getLLVMStyle();
11491 ZeroColumn.ColumnLimit = 0;
11492
11493 verifyFormat("[[SessionService sharedService] "
11494 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11495 " if (window) {\n"
11496 " [self windowDidLoad:window];\n"
11497 " } else {\n"
11498 " [self errorLoadingWindow];\n"
11499 " }\n"
11500 "}];",
11501 ZeroColumn);
11502 EXPECT_EQ("[[SessionService sharedService]\n"
11503 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11504 " if (window) {\n"
11505 " [self windowDidLoad:window];\n"
11506 " } else {\n"
11507 " [self errorLoadingWindow];\n"
11508 " }\n"
11509 " }];",
11510 format("[[SessionService sharedService]\n"
11511 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11512 " if (window) {\n"
11513 " [self windowDidLoad:window];\n"
11514 " } else {\n"
11515 " [self errorLoadingWindow];\n"
11516 " }\n"
11517 "}];",
11518 ZeroColumn));
11519 verifyFormat("[myObject doSomethingWith:arg1\n"
11520 " firstBlock:^(Foo *a) {\n"
11521 " // ...\n"
11522 " int i;\n"
11523 " }\n"
11524 " secondBlock:^(Bar *b) {\n"
11525 " // ...\n"
11526 " int i;\n"
11527 " }\n"
11528 " thirdBlock:^Foo(Bar *b) {\n"
11529 " // ...\n"
11530 " int i;\n"
11531 " }];",
11532 ZeroColumn);
11533 verifyFormat("f(^{\n"
11534 " @autoreleasepool {\n"
11535 " if (a) {\n"
11536 " g();\n"
11537 " }\n"
11538 " }\n"
11539 "});",
11540 ZeroColumn);
11541 verifyFormat("void (^largeBlock)(void) = ^{\n"
11542 " // ...\n"
11543 "};",
11544 ZeroColumn);
11545
11546 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11547 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011548 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011549 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11550 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11551 " int i;\n"
11552 "};",
11553 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11554}
11555
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011556TEST_F(FormatTest, SupportsCRLF) {
11557 EXPECT_EQ("int a;\r\n"
11558 "int b;\r\n"
11559 "int c;\r\n",
11560 format("int a;\r\n"
11561 " int b;\r\n"
11562 " int c;\r\n",
11563 getLLVMStyle()));
11564 EXPECT_EQ("int a;\r\n"
11565 "int b;\r\n"
11566 "int c;\r\n",
11567 format("int a;\r\n"
11568 " int b;\n"
11569 " int c;\r\n",
11570 getLLVMStyle()));
11571 EXPECT_EQ("int a;\n"
11572 "int b;\n"
11573 "int c;\n",
11574 format("int a;\r\n"
11575 " int b;\n"
11576 " int c;\n",
11577 getLLVMStyle()));
11578 EXPECT_EQ("\"aaaaaaa \"\r\n"
11579 "\"bbbbbbb\";\r\n",
11580 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11581 EXPECT_EQ("#define A \\\r\n"
11582 " b; \\\r\n"
11583 " c; \\\r\n"
11584 " d;\r\n",
11585 format("#define A \\\r\n"
11586 " b; \\\r\n"
11587 " c; d; \r\n",
11588 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011589
11590 EXPECT_EQ("/*\r\n"
11591 "multi line block comments\r\n"
11592 "should not introduce\r\n"
11593 "an extra carriage return\r\n"
11594 "*/\r\n",
11595 format("/*\r\n"
11596 "multi line block comments\r\n"
11597 "should not introduce\r\n"
11598 "an extra carriage return\r\n"
11599 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011600}
11601
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011602TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11603 verifyFormat("MY_CLASS(C) {\n"
11604 " int i;\n"
11605 " int j;\n"
11606 "};");
11607}
11608
Daniel Jasper6633ab82013-10-18 10:38:14 +000011609TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11610 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11611 TwoIndent.ContinuationIndentWidth = 2;
11612
11613 EXPECT_EQ("int i =\n"
11614 " longFunction(\n"
11615 " arg);",
11616 format("int i = longFunction(arg);", TwoIndent));
11617
11618 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11619 SixIndent.ContinuationIndentWidth = 6;
11620
11621 EXPECT_EQ("int i =\n"
11622 " longFunction(\n"
11623 " arg);",
11624 format("int i = longFunction(arg);", SixIndent));
11625}
11626
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011627TEST_F(FormatTest, SpacesInAngles) {
11628 FormatStyle Spaces = getLLVMStyle();
11629 Spaces.SpacesInAngles = true;
11630
11631 verifyFormat("static_cast< int >(arg);", Spaces);
11632 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11633 verifyFormat("f< int, float >();", Spaces);
11634 verifyFormat("template <> g() {}", Spaces);
11635 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011636 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11637 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11638 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011639
11640 Spaces.Standard = FormatStyle::LS_Cpp03;
11641 Spaces.SpacesInAngles = true;
11642 verifyFormat("A< A< int > >();", Spaces);
11643
11644 Spaces.SpacesInAngles = false;
11645 verifyFormat("A<A<int> >();", Spaces);
11646
11647 Spaces.Standard = FormatStyle::LS_Cpp11;
11648 Spaces.SpacesInAngles = true;
11649 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011650
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011651 Spaces.SpacesInAngles = false;
11652 verifyFormat("A<A<int>>();", Spaces);
11653}
11654
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011655TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11656 FormatStyle Style = getLLVMStyle();
11657 Style.SpaceAfterTemplateKeyword = false;
11658 verifyFormat("template<int> void foo();", Style);
11659}
11660
Jacques Pienaarfc275112015-02-18 23:48:37 +000011661TEST_F(FormatTest, TripleAngleBrackets) {
11662 verifyFormat("f<<<1, 1>>>();");
11663 verifyFormat("f<<<1, 1, 1, s>>>();");
11664 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011665 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011666 verifyFormat("f<param><<<1, 1>>>();");
11667 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011668 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011669 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11670 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011671 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11672 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011673}
11674
11675TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011676 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011677 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011678 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11679 "aaallvm::outs() <<");
11680 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11681 "aaaallvm::outs()\n <<");
11682}
11683
Manuel Klimek819788d2014-03-18 11:22:45 +000011684TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11685 std::string code = "#if A\n"
11686 "#if B\n"
11687 "a.\n"
11688 "#endif\n"
11689 " a = 1;\n"
11690 "#else\n"
11691 "#endif\n"
11692 "#if C\n"
11693 "#else\n"
11694 "#endif\n";
11695 EXPECT_EQ(code, format(code));
11696}
11697
Manuel Klimek68b03042014-04-14 09:14:11 +000011698TEST_F(FormatTest, HandleConflictMarkers) {
11699 // Git/SVN conflict markers.
11700 EXPECT_EQ("int a;\n"
11701 "void f() {\n"
11702 " callme(some(parameter1,\n"
11703 "<<<<<<< text by the vcs\n"
11704 " parameter2),\n"
11705 "||||||| text by the vcs\n"
11706 " parameter2),\n"
11707 " parameter3,\n"
11708 "======= text by the vcs\n"
11709 " parameter2, parameter3),\n"
11710 ">>>>>>> text by the vcs\n"
11711 " otherparameter);\n",
11712 format("int a;\n"
11713 "void f() {\n"
11714 " callme(some(parameter1,\n"
11715 "<<<<<<< text by the vcs\n"
11716 " parameter2),\n"
11717 "||||||| text by the vcs\n"
11718 " parameter2),\n"
11719 " parameter3,\n"
11720 "======= text by the vcs\n"
11721 " parameter2,\n"
11722 " parameter3),\n"
11723 ">>>>>>> text by the vcs\n"
11724 " otherparameter);\n"));
11725
11726 // Perforce markers.
11727 EXPECT_EQ("void f() {\n"
11728 " function(\n"
11729 ">>>> text by the vcs\n"
11730 " parameter,\n"
11731 "==== text by the vcs\n"
11732 " parameter,\n"
11733 "==== text by the vcs\n"
11734 " parameter,\n"
11735 "<<<< text by the vcs\n"
11736 " parameter);\n",
11737 format("void f() {\n"
11738 " function(\n"
11739 ">>>> text by the vcs\n"
11740 " parameter,\n"
11741 "==== text by the vcs\n"
11742 " parameter,\n"
11743 "==== text by the vcs\n"
11744 " parameter,\n"
11745 "<<<< text by the vcs\n"
11746 " parameter);\n"));
11747
11748 EXPECT_EQ("<<<<<<<\n"
11749 "|||||||\n"
11750 "=======\n"
11751 ">>>>>>>",
11752 format("<<<<<<<\n"
11753 "|||||||\n"
11754 "=======\n"
11755 ">>>>>>>"));
11756
11757 EXPECT_EQ("<<<<<<<\n"
11758 "|||||||\n"
11759 "int i;\n"
11760 "=======\n"
11761 ">>>>>>>",
11762 format("<<<<<<<\n"
11763 "|||||||\n"
11764 "int i;\n"
11765 "=======\n"
11766 ">>>>>>>"));
11767
11768 // FIXME: Handle parsing of macros around conflict markers correctly:
11769 EXPECT_EQ("#define Macro \\\n"
11770 "<<<<<<<\n"
11771 "Something \\\n"
11772 "|||||||\n"
11773 "Else \\\n"
11774 "=======\n"
11775 "Other \\\n"
11776 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011777 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011778 format("#define Macro \\\n"
11779 "<<<<<<<\n"
11780 " Something \\\n"
11781 "|||||||\n"
11782 " Else \\\n"
11783 "=======\n"
11784 " Other \\\n"
11785 ">>>>>>>\n"
11786 " End\n"
11787 "int i;\n"));
11788}
11789
Daniel Jasper471894432014-08-06 13:40:26 +000011790TEST_F(FormatTest, DisableRegions) {
11791 EXPECT_EQ("int i;\n"
11792 "// clang-format off\n"
11793 " int j;\n"
11794 "// clang-format on\n"
11795 "int k;",
11796 format(" int i;\n"
11797 " // clang-format off\n"
11798 " int j;\n"
11799 " // clang-format on\n"
11800 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011801 EXPECT_EQ("int i;\n"
11802 "/* clang-format off */\n"
11803 " int j;\n"
11804 "/* clang-format on */\n"
11805 "int k;",
11806 format(" int i;\n"
11807 " /* clang-format off */\n"
11808 " int j;\n"
11809 " /* clang-format on */\n"
11810 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011811
11812 // Don't reflow comments within disabled regions.
11813 EXPECT_EQ(
11814 "// clang-format off\n"
11815 "// long long long long long long line\n"
11816 "/* clang-format on */\n"
11817 "/* long long long\n"
11818 " * long long long\n"
11819 " * line */\n"
11820 "int i;\n"
11821 "/* clang-format off */\n"
11822 "/* long long long long long long line */\n",
11823 format("// clang-format off\n"
11824 "// long long long long long long line\n"
11825 "/* clang-format on */\n"
11826 "/* long long long long long long line */\n"
11827 "int i;\n"
11828 "/* clang-format off */\n"
11829 "/* long long long long long long line */\n",
11830 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011831}
11832
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011833TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11834 format("? ) =");
11835 verifyNoCrash("#define a\\\n /**/}");
11836}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011837
Daniel Jasper498f5582015-12-25 08:53:31 +000011838TEST_F(FormatTest, FormatsTableGenCode) {
11839 FormatStyle Style = getLLVMStyle();
11840 Style.Language = FormatStyle::LK_TableGen;
11841 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11842}
11843
Nico Weberb2673a12016-11-10 21:49:25 +000011844TEST_F(FormatTest, ArrayOfTemplates) {
11845 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11846 format("auto a = new unique_ptr<int > [ 10];"));
11847
11848 FormatStyle Spaces = getLLVMStyle();
11849 Spaces.SpacesInSquareBrackets = true;
11850 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11851 format("auto a = new unique_ptr<int > [10];", Spaces));
11852}
11853
11854TEST_F(FormatTest, ArrayAsTemplateType) {
11855 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11856 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11857
11858 FormatStyle Spaces = getLLVMStyle();
11859 Spaces.SpacesInSquareBrackets = true;
11860 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11861 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11862}
11863
Martin Probstc9c51c42017-03-16 10:21:35 +000011864TEST_F(FormatTest, NoSpaceAfterSuper) {
11865 verifyFormat("__super::FooBar();");
11866}
11867
Ben Hamilton07e58362018-02-21 21:27:27 +000011868TEST(FormatStyle, GetStyleWithEmptyFileName) {
Bjorn Pettersson0b2f7742018-02-26 14:14:11 +000011869 vfs::InMemoryFileSystem FS;
11870 auto Style1 = getStyle("file", "", "Google", "", &FS);
Ben Hamilton07e58362018-02-21 21:27:27 +000011871 ASSERT_TRUE((bool)Style1);
11872 ASSERT_EQ(*Style1, getGoogleStyle());
11873}
11874
Eric Liu547d8792016-03-24 13:22:42 +000011875TEST(FormatStyle, GetStyleOfFile) {
11876 vfs::InMemoryFileSystem FS;
11877 // Test 1: format file in the same directory.
11878 ASSERT_TRUE(
11879 FS.addFile("/a/.clang-format", 0,
11880 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11881 ASSERT_TRUE(
11882 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011883 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011884 ASSERT_TRUE((bool)Style1);
11885 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011886
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011887 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011888 ASSERT_TRUE(
11889 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011890 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011891 ASSERT_TRUE((bool)Style2);
11892 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011893
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011894 // Test 2.2: no format on 'none' fallback style.
11895 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11896 ASSERT_TRUE((bool)Style2);
11897 ASSERT_EQ(*Style2, getNoStyle());
11898
11899 // Test 2.3: format if config is found with no based style while fallback is
11900 // 'none'.
11901 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11902 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11903 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11904 ASSERT_TRUE((bool)Style2);
11905 ASSERT_EQ(*Style2, getLLVMStyle());
11906
11907 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11908 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11909 ASSERT_TRUE((bool)Style2);
11910 ASSERT_EQ(*Style2, getLLVMStyle());
11911
Eric Liu547d8792016-03-24 13:22:42 +000011912 // Test 3: format file in parent directory.
11913 ASSERT_TRUE(
11914 FS.addFile("/c/.clang-format", 0,
11915 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11916 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11917 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011918 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011919 ASSERT_TRUE((bool)Style3);
11920 ASSERT_EQ(*Style3, getGoogleStyle());
11921
11922 // Test 4: error on invalid fallback style
11923 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11924 ASSERT_FALSE((bool)Style4);
11925 llvm::consumeError(Style4.takeError());
11926
11927 // Test 5: error on invalid yaml on command line
11928 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11929 ASSERT_FALSE((bool)Style5);
11930 llvm::consumeError(Style5.takeError());
11931
11932 // Test 6: error on invalid style
11933 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11934 ASSERT_FALSE((bool)Style6);
11935 llvm::consumeError(Style6.takeError());
11936
11937 // Test 7: found config file, error on parsing it
11938 ASSERT_TRUE(
11939 FS.addFile("/d/.clang-format", 0,
11940 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11941 "InvalidKey: InvalidValue")));
11942 ASSERT_TRUE(
11943 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11944 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11945 ASSERT_FALSE((bool)Style7);
11946 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011947}
11948
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011949TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11950 // Column limit is 20.
11951 std::string Code = "Type *a =\n"
11952 " new Type();\n"
11953 "g(iiiii, 0, jjjjj,\n"
11954 " 0, kkkkk, 0, mm);\n"
11955 "int bad = format ;";
11956 std::string Expected = "auto a = new Type();\n"
11957 "g(iiiii, nullptr,\n"
11958 " jjjjj, nullptr,\n"
11959 " kkkkk, nullptr,\n"
11960 " mm);\n"
11961 "int bad = format ;";
11962 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011963 tooling::Replacements Replaces = toReplacements(
11964 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11965 "auto "),
11966 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11967 "nullptr"),
11968 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11969 "nullptr"),
11970 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11971 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011972
11973 format::FormatStyle Style = format::getLLVMStyle();
11974 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
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);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011981}
11982
Eric Liubaf58c22016-05-18 13:43:48 +000011983TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11984 std::string Code = "#include \"a.h\"\n"
11985 "#include \"c.h\"\n"
11986 "\n"
11987 "int main() {\n"
11988 " return 0;\n"
11989 "}";
11990 std::string Expected = "#include \"a.h\"\n"
11991 "#include \"b.h\"\n"
11992 "#include \"c.h\"\n"
11993 "\n"
11994 "int main() {\n"
11995 " return 0;\n"
11996 "}";
11997 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011998 tooling::Replacements Replaces = toReplacements(
11999 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
12000 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000012001
12002 format::FormatStyle Style = format::getLLVMStyle();
12003 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000012004 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
12005 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
12006 << llvm::toString(FormattedReplaces.takeError()) << "\n";
12007 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12008 EXPECT_TRUE(static_cast<bool>(Result));
12009 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000012010}
12011
Krasimir Georgievac16a202017-06-23 11:46:03 +000012012TEST_F(FormatTest, FormatSortsUsingDeclarations) {
12013 EXPECT_EQ("using std::cin;\n"
12014 "using std::cout;",
12015 format("using std::cout;\n"
12016 "using std::cin;", getGoogleStyle()));
12017}
12018
Nico Weberdc065182017-04-05 18:10:42 +000012019TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
12020 format::FormatStyle Style = format::getLLVMStyle();
12021 Style.Standard = FormatStyle::LS_Cpp03;
12022 // cpp03 recognize this string as identifier u8 and literal character 'a'
12023 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
12024}
12025
12026TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
12027 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
12028 // all modes, including C++11, C++14 and C++17
12029 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
12030}
12031
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000012032TEST_F(FormatTest, DoNotFormatLikelyXml) {
12033 EXPECT_EQ("<!-- ;> -->",
12034 format("<!-- ;> -->", getGoogleStyle()));
12035 EXPECT_EQ(" <!-- >; -->",
12036 format(" <!-- >; -->", getGoogleStyle()));
12037}
12038
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012039TEST_F(FormatTest, StructuredBindings) {
12040 // Structured bindings is a C++17 feature.
12041 // all modes, including C++11, C++14 and C++17
12042 verifyFormat("auto [a, b] = f();");
12043 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
12044 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();"));
12045 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();"));
12046 EXPECT_EQ("auto const volatile [a, b] = f();",
12047 format("auto const volatile[a, b] = f();"));
12048 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012049 EXPECT_EQ("auto &[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012050 format("auto &[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012051 EXPECT_EQ("auto &&[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012052 format("auto &&[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012053 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();"));
12054 EXPECT_EQ("auto const volatile &&[a, b] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012055 format("auto const volatile &&[a, b] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012056 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();"));
12057 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();"));
12058 EXPECT_EQ("const auto volatile &&[a, b] = f();",
12059 format("const auto volatile &&[a, b] = f();"));
12060 EXPECT_EQ("volatile const auto &&[a, b] = f();",
12061 format("volatile const auto &&[a, b] = f();"));
12062 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();"));
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012063
Manuel Klimeke411aa82017-09-20 09:29:37 +000012064 // Make sure we don't mistake structured bindings for lambdas.
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012065 FormatStyle PointerMiddle = getLLVMStyle();
12066 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
12067 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
12068 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
12069 verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
12070 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
12071 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
12072 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
12073 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
12074 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
12075 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
12076 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
12077 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
12078 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
12079
12080 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
12081 format("for (const auto && [a, b] : some_range) {\n}"));
12082 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
12083 format("for (const auto & [a, b] : some_range) {\n}"));
12084 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
12085 format("for (const auto[a, b] : some_range) {\n}"));
12086 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);"));
12087 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);"));
12088 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);"));
12089 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);"));
12090 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);"));
12091 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};"));
12092 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};"));
12093 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};"));
Manuel Klimeke411aa82017-09-20 09:29:37 +000012094
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012095 format::FormatStyle Spaces = format::getLLVMStyle();
12096 Spaces.SpacesInSquareBrackets = true;
12097 verifyFormat("auto [ a, b ] = f();", Spaces);
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012098 verifyFormat("auto &&[ a, b ] = f();", Spaces);
12099 verifyFormat("auto &[ a, b ] = f();", Spaces);
12100 verifyFormat("auto const &&[ a, b ] = f();", Spaces);
12101 verifyFormat("auto const &[ a, b ] = f();", Spaces);
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012102}
12103
Ben Hamilton6e066352018-02-27 15:56:40 +000012104TEST_F(FormatTest, FileAndCode) {
12105 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
12106 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
12107 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
12108 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
12109 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
12110 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
12111 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
Ben Hamilton19c782d2018-03-22 03:25:22 +000012112 EXPECT_EQ(FormatStyle::LK_ObjC,
12113 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
12114 EXPECT_EQ(
12115 FormatStyle::LK_ObjC,
12116 guessLanguage("foo.h",
12117 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
Ben Hamilton3b345c32018-02-21 15:54:31 +000012118}
12119
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012120TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
12121 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
12122 EXPECT_EQ(FormatStyle::LK_ObjC,
12123 guessLanguage("foo.h", "array[[calculator getIndex]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012124 EXPECT_EQ(FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012125 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012126 EXPECT_EQ(
12127 FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012128 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
12129 EXPECT_EQ(FormatStyle::LK_ObjC,
12130 guessLanguage("foo.h", "[[noreturn foo] bar];"));
12131 EXPECT_EQ(FormatStyle::LK_Cpp,
12132 guessLanguage("foo.h", "[[clang::fallthrough]];"));
12133 EXPECT_EQ(FormatStyle::LK_ObjC,
12134 guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
12135 EXPECT_EQ(FormatStyle::LK_Cpp,
12136 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
12137 EXPECT_EQ(FormatStyle::LK_Cpp,
12138 guessLanguage("foo.h", "[[using clang: fallthrough]];"));
12139 EXPECT_EQ(FormatStyle::LK_ObjC,
12140 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
12141 EXPECT_EQ(FormatStyle::LK_Cpp,
12142 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
12143 EXPECT_EQ(
12144 FormatStyle::LK_Cpp,
12145 guessLanguage("foo.h",
12146 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
12147 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012148}
12149
Ben Hamilton788a2222018-03-12 15:42:40 +000012150TEST_F(FormatTest, GuessLanguageWithCaret) {
12151 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
12152 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
12153 EXPECT_EQ(FormatStyle::LK_ObjC,
12154 guessLanguage("foo.h", "int(^)(char, float);"));
12155 EXPECT_EQ(FormatStyle::LK_ObjC,
12156 guessLanguage("foo.h", "int(^foo)(char, float);"));
12157 EXPECT_EQ(FormatStyle::LK_ObjC,
12158 guessLanguage("foo.h", "int(^foo[10])(char, float);"));
12159 EXPECT_EQ(FormatStyle::LK_ObjC,
12160 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
12161 EXPECT_EQ(
12162 FormatStyle::LK_ObjC,
12163 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
12164}
12165
Daniel Jasperd246a5a2015-06-15 15:25:11 +000012166} // end namespace
12167} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000012168} // end namespace clang