blob: 4397cdfe69275227f7627eb039d9578c849d2368 [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()) {
Mark Zerenc9a918c2018-04-04 21:09:00 +000075 EXPECT_EQ(Expected.str(), format(Expected, Style))
76 << "Expected code is not stable";
Martin Probsta004b3f2017-11-17 18:06:33 +000077 EXPECT_EQ(Expected.str(), format(Code, Style));
Nico Weberd96ae862017-02-24 19:10:12 +000078 if (Style.Language == FormatStyle::LK_Cpp) {
79 // Objective-C++ is a superset of C++, so everything checked for C++
80 // needs to be checked for Objective-C++ as well.
81 FormatStyle ObjCStyle = Style;
82 ObjCStyle.Language = FormatStyle::LK_ObjC;
Martin Probsta004b3f2017-11-17 18:06:33 +000083 EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle));
Nico Weberd96ae862017-02-24 19:10:12 +000084 }
Daniel Jasperf7935112012-12-03 18:12:45 +000085 }
86
Martin Probsta004b3f2017-11-17 18:06:33 +000087 void verifyFormat(llvm::StringRef Code,
88 const FormatStyle &Style = getLLVMStyle()) {
89 verifyFormat(Code, test::messUp(Code), Style);
90 }
91
Manuel Klimekec5c3db2015-05-07 12:26:30 +000092 void verifyIncompleteFormat(llvm::StringRef Code,
93 const FormatStyle &Style = getLLVMStyle()) {
94 EXPECT_EQ(Code.str(),
Krasimir Georgievbcda54b2017-04-21 14:35:20 +000095 format(test::messUp(Code), Style, SC_ExpectIncomplete));
Manuel Klimekec5c3db2015-05-07 12:26:30 +000096 }
97
Daniel Jasperf7935112012-12-03 18:12:45 +000098 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000099 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +0000100 }
Daniel Jasper5b49f472013-01-23 12:10:53 +0000101
102 void verifyIndependentOfContext(llvm::StringRef text) {
103 verifyFormat(text);
104 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
105 }
Daniel Jasper7b038a22013-01-30 09:46:12 +0000106
Daniel Jasper675b4f82015-01-19 10:51:23 +0000107 /// \brief Verify that clang-format does not crash on the given input.
108 void verifyNoCrash(llvm::StringRef Code,
109 const FormatStyle &Style = getLLVMStyle()) {
Krasimir Georgievbcda54b2017-04-21 14:35:20 +0000110 format(Code, Style, SC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +0000111 }
112
Daniel Jasper7b038a22013-01-30 09:46:12 +0000113 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +0000114};
115
Manuel Klimek52b15152013-01-09 15:25:02 +0000116TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000117 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
118 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
119 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
120 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
121 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000122}
123
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000124//===----------------------------------------------------------------------===//
125// Basic function tests.
126//===----------------------------------------------------------------------===//
127
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000128TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000129 EXPECT_EQ(";", format(";"));
130}
131
132TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
133 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000134 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000135 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
136 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
137}
138
139TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
140 EXPECT_EQ("int i;", format("int\ni;"));
141}
142
143TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000144 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000145}
146
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000147TEST_F(FormatTest, FormatsNestedCall) {
148 verifyFormat("Method(f1, f2(f3));");
149 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000150 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000151}
152
Daniel Jasper14556742013-02-07 21:08:36 +0000153TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000154 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000155 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000156 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000157 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper23c2b5a2017-02-17 10:44:07 +0000158 verifyFormat("ALWAYS_INLINE ::std::string getName();");
159 verifyFormat("some::string getName();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000160}
161
Daniel Jasper7b038a22013-01-30 09:46:12 +0000162TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
163 EXPECT_EQ("if (a) {\n"
164 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000165 "}",
166 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000167 EXPECT_EQ(4, ReplacementCount);
168 EXPECT_EQ("if (a) {\n"
169 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000170 "}",
171 format("if (a) {\n"
172 " f();\n"
173 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000174 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000175 EXPECT_EQ("/*\r\n"
176 "\r\n"
177 "*/\r\n",
178 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000179 "\r\n"
180 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000181 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000182}
183
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000184TEST_F(FormatTest, RemovesEmptyLines) {
185 EXPECT_EQ("class C {\n"
186 " int i;\n"
187 "};",
188 format("class C {\n"
189 " int i;\n"
190 "\n"
191 "};"));
192
Nico Weber34272652014-11-13 16:25:37 +0000193 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000194 EXPECT_EQ("namespace N {\n"
195 "\n"
196 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000197 "}",
Daniel Jasper01b35482014-03-21 13:03:33 +0000198 format("namespace N {\n"
199 "\n"
200 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000201 "}",
202 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000203 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
204 "\n"
205 "int i;\n"
206 "}",
207 format("extern /**/ \"C\" /**/ {\n"
208 "\n"
209 "int i;\n"
210 "}",
211 getGoogleStyle()));
212
213 // ...but do keep inlining and removing empty lines for non-block extern "C"
214 // functions.
215 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
216 EXPECT_EQ("extern \"C\" int f() {\n"
217 " int i = 42;\n"
218 " return i;\n"
219 "}",
220 format("extern \"C\" int f() {\n"
221 "\n"
222 " int i = 42;\n"
223 " return i;\n"
224 "}",
225 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000226
Daniel Jasper11164bd2014-03-21 12:58:53 +0000227 // Remove empty lines at the beginning and end of blocks.
228 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000229 "\n"
230 " if (a) {\n"
231 "\n"
232 " f();\n"
233 " }\n"
234 "}",
235 format("void f() {\n"
236 "\n"
237 " if (a) {\n"
238 "\n"
239 " f();\n"
240 "\n"
241 " }\n"
242 "\n"
243 "}",
244 getLLVMStyle()));
245 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000246 " if (a) {\n"
247 " f();\n"
248 " }\n"
249 "}",
250 format("void f() {\n"
251 "\n"
252 " if (a) {\n"
253 "\n"
254 " f();\n"
255 "\n"
256 " }\n"
257 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000258 "}",
259 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000260
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000261 // Don't remove empty lines in more complex control statements.
262 EXPECT_EQ("void f() {\n"
263 " if (a) {\n"
264 " f();\n"
265 "\n"
266 " } else if (b) {\n"
267 " f();\n"
268 " }\n"
269 "}",
270 format("void f() {\n"
271 " if (a) {\n"
272 " f();\n"
273 "\n"
274 " } else if (b) {\n"
275 " f();\n"
276 "\n"
277 " }\n"
278 "\n"
279 "}"));
280
Krasimir Georgiev03e69f52018-03-27 13:14:29 +0000281 // FIXME: This is slightly inconsistent.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000282 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
283 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000284 EXPECT_EQ("namespace {\n"
285 "int i;\n"
286 "}",
287 format("namespace {\n"
288 "int i;\n"
289 "\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000290 "}", LLVMWithNoNamespaceFix));
291 EXPECT_EQ("namespace {\n"
292 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000293 "}",
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000294 format("namespace {\n"
295 "int i;\n"
296 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000297 "}"));
298 EXPECT_EQ("namespace {\n"
299 "int i;\n"
Krasimir Georgiev03e69f52018-03-27 13:14:29 +0000300 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000301 "} // namespace",
302 format("namespace {\n"
303 "int i;\n"
304 "\n"
305 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000306
307 FormatStyle Style = getLLVMStyle();
308 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
309 Style.MaxEmptyLinesToKeep = 2;
310 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
311 Style.BraceWrapping.AfterClass = true;
312 Style.BraceWrapping.AfterFunction = true;
313 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
314
315 EXPECT_EQ("class Foo\n"
316 "{\n"
317 " Foo() {}\n"
318 "\n"
319 " void funk() {}\n"
320 "};",
321 format("class Foo\n"
322 "{\n"
323 " Foo()\n"
324 " {\n"
325 " }\n"
326 "\n"
327 " void funk() {}\n"
328 "};",
329 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000330}
331
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000332TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000333 verifyFormat("x = (a) and (b);");
334 verifyFormat("x = (a) or (b);");
335 verifyFormat("x = (a) bitand (b);");
336 verifyFormat("x = (a) bitor (b);");
337 verifyFormat("x = (a) not_eq (b);");
338 verifyFormat("x = (a) and_eq (b);");
339 verifyFormat("x = (a) or_eq (b);");
340 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000341}
342
Olivier Goffart90f981b2017-07-14 09:23:40 +0000343TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) {
344 verifyFormat("x = compl(a);");
345 verifyFormat("x = not(a);");
346 verifyFormat("x = bitand(a);");
347 // Unary operator must not be merged with the next identifier
348 verifyFormat("x = compl a;");
349 verifyFormat("x = not a;");
350 verifyFormat("x = bitand a;");
351}
352
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000353//===----------------------------------------------------------------------===//
354// Tests for control statements.
355//===----------------------------------------------------------------------===//
356
Daniel Jaspercdd06622013-05-14 10:31:09 +0000357TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000358 verifyFormat("if (true)\n f();\ng();");
359 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000360 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000361 verifyFormat("if constexpr (true)\n"
362 " f();\ng();");
363 verifyFormat("if constexpr (a)\n"
364 " if constexpr (b)\n"
365 " if constexpr (c)\n"
366 " g();\n"
367 "h();");
368 verifyFormat("if constexpr (a)\n"
369 " if constexpr (b) {\n"
370 " f();\n"
371 " }\n"
372 "g();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000373
Daniel Jasper3a685df2013-05-16 12:12:21 +0000374 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +0000375 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jasperced17f82013-01-16 15:44:34 +0000376 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
377 verifyFormat("if (a)\n"
378 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000379 " f();",
380 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000381 verifyFormat("{\n"
382 " if (a)\n"
383 " label:\n"
384 " f();\n"
385 "}",
386 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000387 verifyFormat("#define A \\\n"
388 " if (a) \\\n"
389 " label: \\\n"
390 " f()",
391 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000392 verifyFormat("if (a)\n"
393 " ;",
394 AllowsMergedIf);
395 verifyFormat("if (a)\n"
396 " if (b) return;",
397 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000398
Daniel Jasper3a685df2013-05-16 12:12:21 +0000399 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000400 " f();\n",
401 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000402 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000403 " f();",
404 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000405 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000406 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000407 "}",
408 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000409 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000410 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000411 "}",
412 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000413
414 AllowsMergedIf.ColumnLimit = 14;
415 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000416 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000417 " return;",
418 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000419
420 AllowsMergedIf.ColumnLimit = 13;
421 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000422}
423
Daniel Jasper3a685df2013-05-16 12:12:21 +0000424TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
425 FormatStyle AllowsMergedLoops = getLLVMStyle();
426 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
427 verifyFormat("while (true) continue;", AllowsMergedLoops);
428 verifyFormat("for (;;) continue;", AllowsMergedLoops);
429 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
430 verifyFormat("while (true)\n"
431 " ;",
432 AllowsMergedLoops);
433 verifyFormat("for (;;)\n"
434 " ;",
435 AllowsMergedLoops);
436 verifyFormat("for (;;)\n"
437 " for (;;) continue;",
438 AllowsMergedLoops);
439 verifyFormat("for (;;) // Can't merge this\n"
440 " continue;",
441 AllowsMergedLoops);
442 verifyFormat("for (;;) /* still don't merge */\n"
443 " continue;",
444 AllowsMergedLoops);
445}
446
Daniel Jasper17605d32014-05-14 09:33:35 +0000447TEST_F(FormatTest, FormatShortBracedStatements) {
448 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000449 AllowSimpleBracedStatements.ColumnLimit = 40;
Daniel Jasper17605d32014-05-14 09:33:35 +0000450 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
451
452 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
453 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
454
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000455 AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom;
456 AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true;
457 AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false;
458
Daniel Jasper17605d32014-05-14 09:33:35 +0000459 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000460 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000461 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
462 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
463 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000464 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000465 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
466 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000467 verifyFormat("if (true) {\n"
468 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
469 "}",
470 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000471 verifyFormat("if (true) { //\n"
472 " f();\n"
473 "}",
474 AllowSimpleBracedStatements);
475 verifyFormat("if (true) {\n"
476 " f();\n"
477 " f();\n"
478 "}",
479 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000480 verifyFormat("if (true) {\n"
481 " f();\n"
482 "} else {\n"
483 " f();\n"
484 "}",
485 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000486
Daniel Jasperf92659e2017-06-19 07:45:41 +0000487 verifyFormat("struct A2 {\n"
488 " int X;\n"
489 "};",
490 AllowSimpleBracedStatements);
491 verifyFormat("typedef struct A2 {\n"
492 " int X;\n"
493 "} A2_t;",
494 AllowSimpleBracedStatements);
Daniel Jasperbd630732014-05-22 13:25:26 +0000495 verifyFormat("template <int> struct A2 {\n"
496 " struct B {};\n"
497 "};",
498 AllowSimpleBracedStatements);
499
Daniel Jasper17605d32014-05-14 09:33:35 +0000500 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000501 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000502 verifyFormat("if (true) {\n"
503 " f();\n"
504 "}",
505 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000506 verifyFormat("if (true) {\n"
507 " f();\n"
508 "} else {\n"
509 " f();\n"
510 "}",
511 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000512
513 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000514 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000515 verifyFormat("while (true) {\n"
516 " f();\n"
517 "}",
518 AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000519 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000520 verifyFormat("for (;;) {\n"
521 " f();\n"
522 "}",
523 AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000524
525 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
526 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
527 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = true;
528
529 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
530 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
531 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
532 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
533 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
534 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
535 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
536 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
537 verifyFormat("if (true)\n"
538 "{\n"
539 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
540 "}",
541 AllowSimpleBracedStatements);
542 verifyFormat("if (true)\n"
543 "{ //\n"
544 " f();\n"
545 "}",
546 AllowSimpleBracedStatements);
547 verifyFormat("if (true)\n"
548 "{\n"
549 " f();\n"
550 " f();\n"
551 "}",
552 AllowSimpleBracedStatements);
553 verifyFormat("if (true)\n"
554 "{\n"
555 " f();\n"
556 "} else\n"
557 "{\n"
558 " f();\n"
559 "}",
560 AllowSimpleBracedStatements);
561
562 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
563 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
564 verifyFormat("if (true)\n"
565 "{\n"
566 " f();\n"
567 "}",
568 AllowSimpleBracedStatements);
569 verifyFormat("if (true)\n"
570 "{\n"
571 " f();\n"
572 "} else\n"
573 "{\n"
574 " f();\n"
575 "}",
576 AllowSimpleBracedStatements);
577
578 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
579 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
580 verifyFormat("while (true)\n"
581 "{\n"
582 " f();\n"
583 "}",
584 AllowSimpleBracedStatements);
585 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
586 verifyFormat("for (;;)\n"
587 "{\n"
588 " f();\n"
589 "}",
590 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000591}
592
Krasimir Georgievbf4cdda2018-01-19 16:12:37 +0000593TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) {
594 FormatStyle Style = getLLVMStyleWithColumns(60);
595 Style.AllowShortBlocksOnASingleLine = true;
596 Style.AllowShortIfStatementsOnASingleLine = true;
597 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
598 EXPECT_EQ("#define A \\\n"
599 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n"
600 " { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n"
601 "X;",
602 format("#define A \\\n"
603 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n"
604 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n"
605 " }\n"
606 "X;",
607 Style));
608}
609
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000610TEST_F(FormatTest, ParseIfElse) {
611 verifyFormat("if (true)\n"
612 " if (true)\n"
613 " if (true)\n"
614 " f();\n"
615 " else\n"
616 " g();\n"
617 " else\n"
618 " h();\n"
619 "else\n"
620 " i();");
621 verifyFormat("if (true)\n"
622 " if (true)\n"
623 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000624 " if (true)\n"
625 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000626 " } else {\n"
627 " g();\n"
628 " }\n"
629 " else\n"
630 " h();\n"
631 "else {\n"
632 " i();\n"
633 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000634 verifyFormat("if (true)\n"
635 " if constexpr (true)\n"
636 " if (true) {\n"
637 " if constexpr (true)\n"
638 " f();\n"
639 " } else {\n"
640 " g();\n"
641 " }\n"
642 " else\n"
643 " h();\n"
644 "else {\n"
645 " i();\n"
646 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000647 verifyFormat("void f() {\n"
648 " if (a) {\n"
649 " } else {\n"
650 " }\n"
651 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000652}
653
654TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000655 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000656 verifyFormat("if (a)\n"
657 " f();\n"
658 "else if (b)\n"
659 " g();\n"
660 "else\n"
661 " h();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000662 verifyFormat("if constexpr (a)\n"
663 " f();\n"
664 "else if constexpr (b)\n"
665 " g();\n"
666 "else\n"
667 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000668 verifyFormat("if (a) {\n"
669 " f();\n"
670 "}\n"
671 "// or else ..\n"
672 "else {\n"
673 " g()\n"
674 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000675
676 verifyFormat("if (a) {\n"
677 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
678 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
679 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000680 verifyFormat("if (a) {\n"
681 "} else if (\n"
682 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
683 "}",
684 getLLVMStyleWithColumns(62));
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000685 verifyFormat("if (a) {\n"
686 "} else if constexpr (\n"
687 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
688 "}",
689 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000690}
691
Daniel Jasperf7935112012-12-03 18:12:45 +0000692TEST_F(FormatTest, FormatsForLoop) {
693 verifyFormat(
694 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000695 " ++VeryVeryLongLoopVariable)\n"
696 " ;");
697 verifyFormat("for (;;)\n"
698 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000699 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000700 verifyFormat("for (;;) {\n"
701 " f();\n"
702 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000703 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000704
705 verifyFormat(
706 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
707 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000708 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000709
710 verifyFormat(
711 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000712 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000713 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
714 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000715 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000716 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
717 " I = FD->getDeclsInPrototypeScope().begin(),\n"
718 " E = FD->getDeclsInPrototypeScope().end();\n"
719 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000720 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
721 " I = Container.begin(),\n"
722 " E = Container.end();\n"
723 " I != E; ++I) {\n}",
724 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000725
Daniel Jasper48c62f92013-01-28 17:30:17 +0000726 verifyFormat(
727 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
728 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000729 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
730 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000731 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000732 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
733 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
734 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000735 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
736 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
737 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000738 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
739 " aaaaaaaaaa);\n"
740 " iter; ++iter) {\n"
741 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000742 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
743 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
744 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
745 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000746
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +0000747 // These should not be formatted as Objective-C for-in loops.
748 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}");
749 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}");
750 verifyFormat("Foo *x;\nfor (x in y) {\n}");
751 verifyFormat("for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}");
752
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000753 FormatStyle NoBinPacking = getLLVMStyle();
754 NoBinPacking.BinPackParameters = false;
755 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
756 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
757 " aaaaaaaaaaaaaaaa,\n"
758 " aaaaaaaaaaaaaaaa,\n"
759 " aaaaaaaaaaaaaaaa);\n"
760 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
761 "}",
762 NoBinPacking);
763 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000764 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
765 " E = UnwrappedLines.end();\n"
766 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000767 " ++I) {\n}",
768 NoBinPacking);
Daniel Jasper7b85a192017-09-03 08:56:24 +0000769
770 FormatStyle AlignLeft = getLLVMStyle();
771 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
772 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
Daniel Jasperf7935112012-12-03 18:12:45 +0000773}
774
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000775TEST_F(FormatTest, RangeBasedForLoops) {
776 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
777 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
778 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
779 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000780 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
781 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000782 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
783 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000784}
785
Daniel Jaspere1e43192014-04-01 12:55:11 +0000786TEST_F(FormatTest, ForEachLoops) {
787 verifyFormat("void f() {\n"
788 " foreach (Item *item, itemlist) {}\n"
789 " Q_FOREACH (Item *item, itemlist) {}\n"
790 " BOOST_FOREACH (Item *item, itemlist) {}\n"
791 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
792 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000793
794 // As function-like macros.
795 verifyFormat("#define foreach(x, y)\n"
796 "#define Q_FOREACH(x, y)\n"
797 "#define BOOST_FOREACH(x, y)\n"
798 "#define UNKNOWN_FOREACH(x, y)\n");
799
800 // Not as function-like macros.
801 verifyFormat("#define foreach (x, y)\n"
802 "#define Q_FOREACH (x, y)\n"
803 "#define BOOST_FOREACH (x, y)\n"
804 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000805}
806
Daniel Jasperf7935112012-12-03 18:12:45 +0000807TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000808 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000809 verifyFormat("while (true)\n"
810 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000811 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000812 verifyFormat("while () {\n"
813 " f();\n"
814 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000815}
816
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000817TEST_F(FormatTest, FormatsDoWhile) {
818 verifyFormat("do {\n"
819 " do_something();\n"
820 "} while (something());");
821 verifyFormat("do\n"
822 " do_something();\n"
823 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000824}
825
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000826TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000827 verifyFormat("switch (x) {\n"
828 "case 1:\n"
829 " f();\n"
830 " break;\n"
831 "case kFoo:\n"
832 "case ns::kBar:\n"
833 "case kBaz:\n"
834 " break;\n"
835 "default:\n"
836 " g();\n"
837 " break;\n"
838 "}");
839 verifyFormat("switch (x) {\n"
840 "case 1: {\n"
841 " f();\n"
842 " break;\n"
843 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000844 "case 2: {\n"
845 " break;\n"
846 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000847 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000848 verifyFormat("switch (x) {\n"
849 "case 1: {\n"
850 " f();\n"
851 " {\n"
852 " g();\n"
853 " h();\n"
854 " }\n"
855 " break;\n"
856 "}\n"
857 "}");
858 verifyFormat("switch (x) {\n"
859 "case 1: {\n"
860 " f();\n"
861 " if (foo) {\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 " g();\n"
872 "} break;\n"
873 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000874 verifyFormat("switch (test)\n"
875 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000876 verifyFormat("switch (x) {\n"
877 "default: {\n"
878 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000879 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000880 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000881 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000882 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000883 "// if 1, do f()\n"
884 "case 1:\n"
885 " f();\n"
886 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000887 verifyFormat("switch (x) {\n"
888 "case 1:\n"
889 " // Do amazing stuff\n"
890 " {\n"
891 " f();\n"
892 " g();\n"
893 " }\n"
894 " break;\n"
895 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000896 verifyFormat("#define A \\\n"
897 " switch (x) { \\\n"
898 " case a: \\\n"
899 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000900 " }",
901 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000902 verifyFormat("#define OPERATION_CASE(name) \\\n"
903 " case OP_name: \\\n"
904 " return operations::Operation##name\n",
905 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000906 verifyFormat("switch (x) {\n"
907 "case 1:;\n"
908 "default:;\n"
909 " int i;\n"
910 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000911
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000912 verifyGoogleFormat("switch (x) {\n"
913 " case 1:\n"
914 " f();\n"
915 " break;\n"
916 " case kFoo:\n"
917 " case ns::kBar:\n"
918 " case kBaz:\n"
919 " break;\n"
920 " default:\n"
921 " g();\n"
922 " break;\n"
923 "}");
924 verifyGoogleFormat("switch (x) {\n"
925 " case 1: {\n"
926 " f();\n"
927 " break;\n"
928 " }\n"
929 "}");
930 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000931 " ;");
932
933 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
934 " case OP_name: \\\n"
935 " return operations::Operation##name\n");
936 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
937 " // Get the correction operation class.\n"
938 " switch (OpCode) {\n"
939 " CASE(Add);\n"
940 " CASE(Subtract);\n"
941 " default:\n"
942 " return operations::Unknown;\n"
943 " }\n"
944 "#undef OPERATION_CASE\n"
945 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000946 verifyFormat("DEBUG({\n"
947 " switch (x) {\n"
948 " case A:\n"
949 " f();\n"
950 " break;\n"
Krasimir Georgieve0926342017-07-12 15:21:43 +0000951 " // fallthrough\n"
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000952 " case B:\n"
953 " g();\n"
954 " break;\n"
955 " }\n"
956 "});");
Krasimir Georgieve0926342017-07-12 15:21:43 +0000957 EXPECT_EQ("DEBUG({\n"
958 " switch (x) {\n"
959 " case A:\n"
960 " f();\n"
961 " break;\n"
962 " // On B:\n"
963 " case B:\n"
964 " g();\n"
965 " break;\n"
966 " }\n"
967 "});",
968 format("DEBUG({\n"
969 " switch (x) {\n"
970 " case A:\n"
971 " f();\n"
972 " break;\n"
973 " // On B:\n"
974 " case B:\n"
975 " g();\n"
976 " break;\n"
977 " }\n"
978 "});",
979 getLLVMStyle()));
Daniel Jasper031e2402014-04-28 07:48:36 +0000980 verifyFormat("switch (a) {\n"
981 "case (b):\n"
982 " return;\n"
983 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000984
985 verifyFormat("switch (a) {\n"
986 "case some_namespace::\n"
987 " some_constant:\n"
988 " return;\n"
989 "}",
990 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000991}
992
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000993TEST_F(FormatTest, CaseRanges) {
994 verifyFormat("switch (x) {\n"
995 "case 'A' ... 'Z':\n"
996 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000997 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000998 " break;\n"
999 "}");
1000}
1001
Daniel Jasperb87899b2014-09-10 13:11:45 +00001002TEST_F(FormatTest, ShortCaseLabels) {
1003 FormatStyle Style = getLLVMStyle();
1004 Style.AllowShortCaseLabelsOnASingleLine = true;
1005 verifyFormat("switch (a) {\n"
1006 "case 1: x = 1; break;\n"
1007 "case 2: return;\n"
1008 "case 3:\n"
1009 "case 4:\n"
1010 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +00001011 "case 6: // comment\n"
1012 " return;\n"
1013 "case 7:\n"
1014 " // comment\n"
1015 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +00001016 "case 8:\n"
1017 " x = 8; // comment\n"
1018 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001019 "default: y = 1; break;\n"
1020 "}",
1021 Style);
1022 verifyFormat("switch (a) {\n"
Francois Ferranda64ba702017-07-28 07:56:18 +00001023 "case 0: return; // comment\n"
1024 "case 1: break; // comment\n"
1025 "case 2: return;\n"
1026 "// comment\n"
1027 "case 3: return;\n"
1028 "// comment 1\n"
1029 "// comment 2\n"
1030 "// comment 3\n"
1031 "case 4: break; /* comment */\n"
1032 "case 5:\n"
1033 " // comment\n"
1034 " break;\n"
1035 "case 6: /* comment */ x = 1; break;\n"
1036 "case 7: x = /* comment */ 1; break;\n"
1037 "case 8:\n"
1038 " x = 1; /* comment */\n"
1039 " break;\n"
1040 "case 9:\n"
1041 " break; // comment line 1\n"
1042 " // comment line 2\n"
1043 "}",
1044 Style);
1045 EXPECT_EQ("switch (a) {\n"
1046 "case 1:\n"
1047 " x = 8;\n"
1048 " // fall through\n"
1049 "case 2: x = 8;\n"
1050 "// comment\n"
1051 "case 3:\n"
1052 " return; /* comment line 1\n"
1053 " * comment line 2 */\n"
1054 "case 4: i = 8;\n"
1055 "// something else\n"
1056 "#if FOO\n"
1057 "case 5: break;\n"
1058 "#endif\n"
1059 "}",
1060 format("switch (a) {\n"
1061 "case 1: x = 8;\n"
1062 " // fall through\n"
1063 "case 2:\n"
1064 " x = 8;\n"
1065 "// comment\n"
1066 "case 3:\n"
1067 " return; /* comment line 1\n"
1068 " * comment line 2 */\n"
1069 "case 4:\n"
1070 " i = 8;\n"
1071 "// something else\n"
1072 "#if FOO\n"
1073 "case 5: break;\n"
1074 "#endif\n"
1075 "}",
1076 Style));
1077 EXPECT_EQ("switch (a) {\n" "case 0:\n"
1078 " return; // long long long long long long long long long long long long comment\n"
1079 " // line\n" "}",
1080 format("switch (a) {\n"
1081 "case 0: return; // long long long long long long long long long long long long comment line\n"
1082 "}",
1083 Style));
1084 EXPECT_EQ("switch (a) {\n"
1085 "case 0:\n"
1086 " return; /* long long long long long long long long long long long long comment\n"
1087 " line */\n"
1088 "}",
1089 format("switch (a) {\n"
1090 "case 0: return; /* long long long long long long long long long long long long comment line */\n"
1091 "}",
1092 Style));
1093 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +00001094 "#if FOO\n"
1095 "case 0: return 0;\n"
1096 "#endif\n"
1097 "}",
1098 Style);
1099 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001100 "case 1: {\n"
1101 "}\n"
1102 "case 2: {\n"
1103 " return;\n"
1104 "}\n"
1105 "case 3: {\n"
1106 " x = 1;\n"
1107 " return;\n"
1108 "}\n"
1109 "case 4:\n"
1110 " if (x)\n"
1111 " return;\n"
1112 "}",
1113 Style);
1114 Style.ColumnLimit = 21;
1115 verifyFormat("switch (a) {\n"
1116 "case 1: x = 1; break;\n"
1117 "case 2: return;\n"
1118 "case 3:\n"
1119 "case 4:\n"
1120 "case 5: return;\n"
1121 "default:\n"
1122 " y = 1;\n"
1123 " break;\n"
1124 "}",
1125 Style);
1126}
1127
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001128TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +00001129 verifyFormat("void f() {\n"
1130 " some_code();\n"
1131 "test_label:\n"
1132 " some_other_code();\n"
1133 " {\n"
1134 " some_more_code();\n"
1135 " another_label:\n"
1136 " some_more_code();\n"
1137 " }\n"
1138 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +00001139 verifyFormat("{\n"
1140 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00001141 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +00001142 " some_other_code();\n"
1143 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +00001144 verifyFormat("{\n"
1145 " some_code();\n"
1146 "test_label:;\n"
1147 " int i = 0;\n"
1148 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00001149}
1150
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001151//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001152// Tests for classes, namespaces, etc.
1153//===----------------------------------------------------------------------===//
1154
1155TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001156 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001157}
1158
1159TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1160 verifyFormat("class A {\n"
1161 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001162 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001163 "protected:\n"
1164 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001165 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001166 "};");
1167 verifyGoogleFormat("class A {\n"
1168 " public:\n"
1169 " protected:\n"
1170 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001171 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001172 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001173 verifyFormat("class A {\n"
1174 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001175 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001176 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001177 " void f2() {}\n"
1178 "protected slots:\n"
1179 " void f3() {}\n"
1180 "protected Q_SLOTS:\n"
1181 " void f4() {}\n"
1182 "private slots:\n"
1183 " void f5() {}\n"
1184 "private Q_SLOTS:\n"
1185 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001186 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001187 " void g1();\n"
1188 "Q_SIGNALS:\n"
1189 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001190 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001191
1192 // Don't interpret 'signals' the wrong way.
1193 verifyFormat("signals.set();");
1194 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001195 verifyFormat("{\n"
1196 " signals.set(); // This needs indentation.\n"
1197 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001198 verifyFormat("void f() {\n"
1199 "label:\n"
1200 " signals.baz();\n"
1201 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001202}
1203
Alexander Kornienkofd433362013-03-27 17:08:02 +00001204TEST_F(FormatTest, SeparatesLogicalBlocks) {
1205 EXPECT_EQ("class A {\n"
1206 "public:\n"
1207 " void f();\n"
1208 "\n"
1209 "private:\n"
1210 " void g() {}\n"
1211 " // test\n"
1212 "protected:\n"
1213 " int h;\n"
1214 "};",
1215 format("class A {\n"
1216 "public:\n"
1217 "void f();\n"
1218 "private:\n"
1219 "void g() {}\n"
1220 "// test\n"
1221 "protected:\n"
1222 "int h;\n"
1223 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001224 EXPECT_EQ("class A {\n"
1225 "protected:\n"
1226 "public:\n"
1227 " void f();\n"
1228 "};",
1229 format("class A {\n"
1230 "protected:\n"
1231 "\n"
1232 "public:\n"
1233 "\n"
1234 " void f();\n"
1235 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00001236
1237 // Even ensure proper spacing inside macros.
1238 EXPECT_EQ("#define B \\\n"
1239 " class A { \\\n"
1240 " protected: \\\n"
1241 " public: \\\n"
1242 " void f(); \\\n"
1243 " };",
1244 format("#define B \\\n"
1245 " class A { \\\n"
1246 " protected: \\\n"
1247 " \\\n"
1248 " public: \\\n"
1249 " \\\n"
1250 " void f(); \\\n"
1251 " };",
1252 getGoogleStyle()));
1253 // But don't remove empty lines after macros ending in access specifiers.
1254 EXPECT_EQ("#define A private:\n"
1255 "\n"
1256 "int i;",
1257 format("#define A private:\n"
1258 "\n"
1259 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00001260}
1261
Daniel Jasper83193602013-04-05 17:22:09 +00001262TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001263 verifyFormat("class A : public B {};");
1264 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001265
1266 verifyFormat(
1267 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001268 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001269 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1270 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001271 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001272 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001273 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001274 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1275 " public C,\n"
1276 " public D,\n"
1277 " public E,\n"
1278 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001279 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001280
1281 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001282 " ReallyReallyLongClassName {\n"
1283 " int i;\n"
1284 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001285 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001286 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1287 " aaaaaaaaaaaaaaaa> {};");
1288 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1289 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1290 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001291 verifyFormat("template <class R, class C>\n"
1292 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1293 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001294 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001295}
1296
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001297TEST_F(FormatTest, BreakBeforeInheritanceComma) {
1298 FormatStyle StyleWithInheritanceBreak = getLLVMStyle();
1299 StyleWithInheritanceBreak.BreakBeforeInheritanceComma = true;
1300
1301 verifyFormat("class MyClass : public X {};", StyleWithInheritanceBreak);
1302 verifyFormat("class MyClass\n"
1303 " : public X\n"
1304 " , public Y {};",
1305 StyleWithInheritanceBreak);
1306}
1307
Manuel Klimek28cacc72013-01-07 18:10:23 +00001308TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001309 verifyFormat("class A {\n} a, b;");
1310 verifyFormat("struct A {\n} a, b;");
1311 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001312}
1313
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001314TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001315 verifyFormat("enum {\n"
1316 " Zero,\n"
1317 " One = 1,\n"
1318 " Two = One + 1,\n"
1319 " Three = (One + Two),\n"
1320 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1321 " Five = (One, Two, Three, Four, 5)\n"
1322 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001323 verifyGoogleFormat("enum {\n"
1324 " Zero,\n"
1325 " One = 1,\n"
1326 " Two = One + 1,\n"
1327 " Three = (One + Two),\n"
1328 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1329 " Five = (One, Two, Three, Four, 5)\n"
1330 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001331 verifyFormat("enum Enum {};");
1332 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001333 verifyFormat("enum X E {} d;");
1334 verifyFormat("enum __attribute__((...)) E {} d;");
1335 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001336 verifyFormat("enum {\n"
1337 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001338 "};",
1339 getLLVMStyleWithColumns(30));
1340
1341 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001342 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001343
1344 EXPECT_EQ("enum KeepEmptyLines {\n"
1345 " ONE,\n"
1346 "\n"
1347 " TWO,\n"
1348 "\n"
1349 " THREE\n"
1350 "}",
1351 format("enum KeepEmptyLines {\n"
1352 " ONE,\n"
1353 "\n"
1354 " TWO,\n"
1355 "\n"
1356 "\n"
1357 " THREE\n"
1358 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001359 verifyFormat("enum E { // comment\n"
1360 " ONE,\n"
1361 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001362 "};\n"
1363 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001364 // Not enums.
1365 verifyFormat("enum X f() {\n"
1366 " a();\n"
1367 " return 42;\n"
1368 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001369 verifyFormat("enum X Type::f() {\n"
1370 " a();\n"
1371 " return 42;\n"
1372 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001373 verifyFormat("enum ::X f() {\n"
1374 " a();\n"
1375 " return 42;\n"
1376 "}");
1377 verifyFormat("enum ns::X f() {\n"
1378 " a();\n"
1379 " return 42;\n"
1380 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001381}
1382
Daniel Jasperb7150872013-08-30 10:10:19 +00001383TEST_F(FormatTest, FormatsEnumsWithErrors) {
1384 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001385 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001386 " Two = 1;\n"
1387 "};");
1388 verifyFormat("namespace n {\n"
1389 "enum Type {\n"
1390 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001391 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001392 " int i;\n"
1393 "}\n"
1394 "void g() {}");
1395}
1396
Daniel Jasper2b41a822013-08-20 12:42:50 +00001397TEST_F(FormatTest, FormatsEnumStruct) {
1398 verifyFormat("enum struct {\n"
1399 " Zero,\n"
1400 " One = 1,\n"
1401 " Two = One + 1,\n"
1402 " Three = (One + Two),\n"
1403 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1404 " Five = (One, Two, Three, Four, 5)\n"
1405 "};");
1406 verifyFormat("enum struct Enum {};");
1407 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001408 verifyFormat("enum struct X E {} d;");
1409 verifyFormat("enum struct __attribute__((...)) E {} d;");
1410 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001411 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1412}
1413
1414TEST_F(FormatTest, FormatsEnumClass) {
1415 verifyFormat("enum class {\n"
1416 " Zero,\n"
1417 " One = 1,\n"
1418 " Two = One + 1,\n"
1419 " Three = (One + Two),\n"
1420 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1421 " Five = (One, Two, Three, Four, 5)\n"
1422 "};");
1423 verifyFormat("enum class Enum {};");
1424 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001425 verifyFormat("enum class X E {} d;");
1426 verifyFormat("enum class __attribute__((...)) E {} d;");
1427 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001428 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1429}
1430
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001431TEST_F(FormatTest, FormatsEnumTypes) {
1432 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001433 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001434 " B\n"
1435 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001436 verifyFormat("enum X : int { A, B };");
1437 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001438}
1439
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001440TEST_F(FormatTest, FormatsTypedefEnum) {
1441 FormatStyle Style = getLLVMStyle();
1442 Style.ColumnLimit = 40;
1443 verifyFormat("typedef enum {} EmptyEnum;");
1444 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1445 verifyFormat("typedef enum {\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001446 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001447 " ONE = 1,\n"
1448 " TWO = 2,\n"
1449 " THREE = 3\n"
1450 "} LongEnum;",
1451 Style);
1452 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1453 Style.BraceWrapping.AfterEnum = true;
1454 verifyFormat("typedef enum {} EmptyEnum;");
1455 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1456 verifyFormat("typedef enum\n"
1457 "{\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001458 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001459 " ONE = 1,\n"
1460 " TWO = 2,\n"
1461 " THREE = 3\n"
1462 "} LongEnum;",
1463 Style);
1464}
1465
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001466TEST_F(FormatTest, FormatsNSEnums) {
1467 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1468 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1469 " // Information about someDecentlyLongValue.\n"
1470 " someDecentlyLongValue,\n"
1471 " // Information about anotherDecentlyLongValue.\n"
1472 " anotherDecentlyLongValue,\n"
1473 " // Information about aThirdDecentlyLongValue.\n"
1474 " aThirdDecentlyLongValue\n"
1475 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001476 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1477 " a = 1,\n"
1478 " b = 2,\n"
1479 " c = 3,\n"
1480 "};");
1481 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1482 " a = 1,\n"
1483 " b = 2,\n"
1484 " c = 3,\n"
1485 "};");
1486 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1487 " a = 1,\n"
1488 " b = 2,\n"
1489 " c = 3,\n"
1490 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001491}
1492
Nico Weber7769a902013-01-14 05:49:49 +00001493TEST_F(FormatTest, FormatsBitfields) {
1494 verifyFormat("struct Bitfields {\n"
1495 " unsigned sClass : 8;\n"
1496 " unsigned ValueKind : 2;\n"
1497 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001498 verifyFormat("struct A {\n"
1499 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1500 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1501 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001502 verifyFormat("struct MyStruct {\n"
1503 " uchar data;\n"
1504 " uchar : 8;\n"
1505 " uchar : 8;\n"
1506 " uchar other;\n"
1507 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001508}
1509
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001510TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001511 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1512 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1513
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001514 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001515 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001516 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001517 "}",
1518 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001519 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001520 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001521 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001522 "}",
1523 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001524 verifyFormat("inline namespace X {\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("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001530 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001531 "void f() { f(); }",
1532 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001533
1534 // This code is more common than we thought; if we
1535 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001536 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001537 verifyFormat("namespace {};",
1538 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001539 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001540 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001541 "};",
1542 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001543
1544 verifyFormat("namespace {\n"
1545 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001546 "} // namespace",
1547 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001548 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1549 "#define HEADER_GUARD\n"
1550 "namespace my_namespace {\n"
1551 "int i;\n"
1552 "} // my_namespace\n"
1553 "#endif // HEADER_GUARD",
1554 format("#ifndef HEADER_GUARD\n"
1555 " #define HEADER_GUARD\n"
1556 " namespace my_namespace {\n"
1557 "int i;\n"
1558 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001559 "#endif // HEADER_GUARD",
1560 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001561
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001562 EXPECT_EQ("namespace A::B {\n"
1563 "class C {};\n"
1564 "}",
1565 format("namespace A::B {\n"
1566 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001567 "}",
1568 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001569
Daniel Jasper65ee3472013-07-31 23:16:02 +00001570 FormatStyle Style = getLLVMStyle();
1571 Style.NamespaceIndentation = FormatStyle::NI_All;
1572 EXPECT_EQ("namespace out {\n"
1573 " int i;\n"
1574 " namespace in {\n"
1575 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001576 " } // namespace in\n"
1577 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001578 format("namespace out {\n"
1579 "int i;\n"
1580 "namespace in {\n"
1581 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001582 "} // namespace in\n"
1583 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001584 Style));
1585
1586 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1587 EXPECT_EQ("namespace out {\n"
1588 "int i;\n"
1589 "namespace in {\n"
1590 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001591 "} // namespace in\n"
1592 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001593 format("namespace out {\n"
1594 "int i;\n"
1595 "namespace in {\n"
1596 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001597 "} // namespace in\n"
1598 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001599 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001600}
1601
Francois Ferrande56a8292017-06-14 12:29:47 +00001602TEST_F(FormatTest, FormatsCompactNamespaces) {
1603 FormatStyle Style = getLLVMStyle();
1604 Style.CompactNamespaces = true;
1605
1606 verifyFormat("namespace A { namespace B {\n"
1607 "}} // namespace A::B",
1608 Style);
1609
1610 EXPECT_EQ("namespace out { namespace in {\n"
1611 "}} // namespace out::in",
1612 format("namespace out {\n"
1613 "namespace in {\n"
1614 "} // namespace in\n"
1615 "} // namespace out",
1616 Style));
1617
1618 // Only namespaces which have both consecutive opening and end get compacted
1619 EXPECT_EQ("namespace out {\n"
1620 "namespace in1 {\n"
1621 "} // namespace in1\n"
1622 "namespace in2 {\n"
1623 "} // namespace in2\n"
1624 "} // namespace out",
1625 format("namespace out {\n"
1626 "namespace in1 {\n"
1627 "} // namespace in1\n"
1628 "namespace in2 {\n"
1629 "} // namespace in2\n"
1630 "} // namespace out",
1631 Style));
1632
1633 EXPECT_EQ("namespace out {\n"
1634 "int i;\n"
1635 "namespace in {\n"
1636 "int j;\n"
1637 "} // namespace in\n"
1638 "int k;\n"
1639 "} // namespace out",
1640 format("namespace out { int i;\n"
1641 "namespace in { int j; } // namespace in\n"
1642 "int k; } // namespace out",
1643 Style));
1644
1645 EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1646 "}}} // namespace A::B::C\n",
1647 format("namespace A { namespace B {\n"
1648 "namespace C {\n"
1649 "}} // namespace B::C\n"
1650 "} // namespace A\n",
1651 Style));
1652
1653 Style.ColumnLimit = 40;
1654 EXPECT_EQ("namespace aaaaaaaaaa {\n"
1655 "namespace bbbbbbbbbb {\n"
1656 "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1657 format("namespace aaaaaaaaaa {\n"
1658 "namespace bbbbbbbbbb {\n"
1659 "} // namespace bbbbbbbbbb\n"
1660 "} // namespace aaaaaaaaaa",
1661 Style));
1662
1663 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1664 "namespace cccccc {\n"
1665 "}}} // namespace aaaaaa::bbbbbb::cccccc",
1666 format("namespace aaaaaa {\n"
1667 "namespace bbbbbb {\n"
1668 "namespace cccccc {\n"
1669 "} // namespace cccccc\n"
1670 "} // namespace bbbbbb\n"
1671 "} // namespace aaaaaa",
1672 Style));
1673 Style.ColumnLimit = 80;
1674
1675 // Extra semicolon after 'inner' closing brace prevents merging
1676 EXPECT_EQ("namespace out { namespace in {\n"
1677 "}; } // namespace out::in",
1678 format("namespace out {\n"
1679 "namespace in {\n"
1680 "}; // namespace in\n"
1681 "} // namespace out",
1682 Style));
1683
1684 // Extra semicolon after 'outer' closing brace is conserved
1685 EXPECT_EQ("namespace out { namespace in {\n"
1686 "}}; // namespace out::in",
1687 format("namespace out {\n"
1688 "namespace in {\n"
1689 "} // namespace in\n"
1690 "}; // namespace out",
1691 Style));
1692
1693 Style.NamespaceIndentation = FormatStyle::NI_All;
1694 EXPECT_EQ("namespace out { namespace in {\n"
1695 " int i;\n"
1696 "}} // namespace out::in",
1697 format("namespace out {\n"
1698 "namespace in {\n"
1699 "int i;\n"
1700 "} // namespace in\n"
1701 "} // namespace out",
1702 Style));
1703 EXPECT_EQ("namespace out { namespace mid {\n"
1704 " namespace in {\n"
1705 " int j;\n"
1706 " } // namespace in\n"
1707 " int k;\n"
1708 "}} // namespace out::mid",
1709 format("namespace out { namespace mid {\n"
1710 "namespace in { int j; } // namespace in\n"
1711 "int k; }} // namespace out::mid",
1712 Style));
1713
1714 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1715 EXPECT_EQ("namespace out { namespace in {\n"
1716 " int i;\n"
1717 "}} // namespace out::in",
1718 format("namespace out {\n"
1719 "namespace in {\n"
1720 "int i;\n"
1721 "} // namespace in\n"
1722 "} // namespace out",
1723 Style));
1724 EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1725 " int i;\n"
1726 "}}} // namespace out::mid::in",
1727 format("namespace out {\n"
1728 "namespace mid {\n"
1729 "namespace in {\n"
1730 "int i;\n"
1731 "} // namespace in\n"
1732 "} // namespace mid\n"
1733 "} // namespace out",
1734 Style));
1735}
1736
Krasimir Georgievd6ce9372017-09-15 11:23:50 +00001737TEST_F(FormatTest, FormatsExternC) {
1738 verifyFormat("extern \"C\" {\nint a;");
1739 verifyFormat("extern \"C\" {}");
1740 verifyFormat("extern \"C\" {\n"
1741 "int foo();\n"
1742 "}");
1743 verifyFormat("extern \"C\" int foo() {}");
1744 verifyFormat("extern \"C\" int foo();");
1745 verifyFormat("extern \"C\" int foo() {\n"
1746 " int i = 42;\n"
1747 " return i;\n"
1748 "}");
1749
1750 FormatStyle Style = getLLVMStyle();
1751 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1752 Style.BraceWrapping.AfterFunction = true;
1753 verifyFormat("extern \"C\" int foo() {}", Style);
1754 verifyFormat("extern \"C\" int foo();", Style);
1755 verifyFormat("extern \"C\" int foo()\n"
1756 "{\n"
1757 " int i = 42;\n"
1758 " return i;\n"
1759 "}",
1760 Style);
1761
1762 Style.BraceWrapping.AfterExternBlock = true;
1763 Style.BraceWrapping.SplitEmptyRecord = false;
1764 verifyFormat("extern \"C\"\n"
1765 "{}",
1766 Style);
1767 verifyFormat("extern \"C\"\n"
1768 "{\n"
1769 " int foo();\n"
1770 "}",
1771 Style);
1772}
Manuel Klimekae610d12013-01-21 14:32:05 +00001773
Daniel Jasper40aacf42013-03-14 13:45:21 +00001774TEST_F(FormatTest, FormatsInlineASM) {
1775 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001776 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001777 verifyFormat(
1778 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1779 " \"cpuid\\n\\t\"\n"
1780 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001781 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001782 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001783 EXPECT_EQ(
1784 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001785 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001786 " mov edx,[that] // vtable in edx\n"
1787 " mov eax,methodIndex\n"
1788 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001789 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001790 "}",
1791 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1792 " __asm {\n"
1793 " mov edx,[that] // vtable in edx\n"
1794 " mov eax,methodIndex\n"
1795 " call [edx][eax*4] // stdcall\n"
1796 " }\n"
1797 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001798 EXPECT_EQ("_asm {\n"
1799 " xor eax, eax;\n"
1800 " cpuid;\n"
1801 "}",
1802 format("_asm {\n"
1803 " xor eax, eax;\n"
1804 " cpuid;\n"
1805 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001806 verifyFormat("void function() {\n"
1807 " // comment\n"
1808 " asm(\"\");\n"
1809 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001810 EXPECT_EQ("__asm {\n"
1811 "}\n"
1812 "int i;",
1813 format("__asm {\n"
1814 "}\n"
1815 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001816}
1817
Nico Weberd5650bd2013-01-07 16:36:17 +00001818TEST_F(FormatTest, FormatTryCatch) {
1819 verifyFormat("try {\n"
1820 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001821 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001822 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001823 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001824 " exit(42);\n"
1825 "}");
1826
1827 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001828 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001829 " return 5;\n"
1830 "}");
1831 verifyFormat("class A {\n"
1832 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001833 " A() try : a(0) {\n"
1834 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001835 " throw;\n"
1836 " }\n"
1837 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001838
1839 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001840 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001841}
1842
Nico Weberfac23712015-02-04 15:26:27 +00001843TEST_F(FormatTest, FormatSEHTryCatch) {
1844 verifyFormat("__try {\n"
1845 " int a = b * c;\n"
1846 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1847 " // Do nothing.\n"
1848 "}");
1849
1850 verifyFormat("__try {\n"
1851 " int a = b * c;\n"
1852 "} __finally {\n"
1853 " // Do nothing.\n"
1854 "}");
1855
1856 verifyFormat("DEBUG({\n"
1857 " __try {\n"
1858 " } __finally {\n"
1859 " }\n"
1860 "});\n");
1861}
1862
Daniel Jasper04a71a42014-05-08 11:58:24 +00001863TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1864 verifyFormat("try {\n"
1865 " f();\n"
1866 "} catch {\n"
1867 " g();\n"
1868 "}");
1869 verifyFormat("try {\n"
1870 " f();\n"
1871 "} catch (A a) MACRO(x) {\n"
1872 " g();\n"
1873 "} catch (B b) MACRO(x) {\n"
1874 " g();\n"
1875 "}");
1876}
1877
1878TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1879 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001880 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1881 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001882 Style.BreakBeforeBraces = BraceStyle;
1883 verifyFormat("try {\n"
1884 " // something\n"
1885 "} catch (...) {\n"
1886 " // something\n"
1887 "}",
1888 Style);
1889 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001890 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1891 verifyFormat("try {\n"
1892 " // something\n"
1893 "}\n"
1894 "catch (...) {\n"
1895 " // something\n"
1896 "}",
1897 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001898 verifyFormat("__try {\n"
1899 " // something\n"
1900 "}\n"
1901 "__finally {\n"
1902 " // something\n"
1903 "}",
1904 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001905 verifyFormat("@try {\n"
1906 " // something\n"
1907 "}\n"
1908 "@finally {\n"
1909 " // something\n"
1910 "}",
1911 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001912 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1913 verifyFormat("try\n"
1914 "{\n"
1915 " // something\n"
1916 "}\n"
1917 "catch (...)\n"
1918 "{\n"
1919 " // something\n"
1920 "}",
1921 Style);
1922 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1923 verifyFormat("try\n"
1924 " {\n"
1925 " // something\n"
1926 " }\n"
1927 "catch (...)\n"
1928 " {\n"
1929 " // something\n"
1930 " }",
1931 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001932 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1933 Style.BraceWrapping.BeforeCatch = true;
1934 verifyFormat("try {\n"
1935 " // something\n"
1936 "}\n"
1937 "catch (...) {\n"
1938 " // something\n"
1939 "}",
1940 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001941}
1942
Daniel Jaspere25509f2012-12-17 11:29:41 +00001943TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001944 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001945
Daniel Jaspera44991332015-04-29 13:06:49 +00001946 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1947 " 100000000, "
1948 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001949
Daniel Jasper473c62c2013-05-17 09:35:01 +00001950 // Here, everything other than the "}" would fit on a line.
1951 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001952 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001953 EXPECT_EQ("S s = {a,\n"
1954 "\n"
1955 " b};",
1956 format("S s = {\n"
1957 " a,\n"
1958 "\n"
1959 " b\n"
1960 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001961
1962 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1963 // line. However, the formatting looks a bit off and this probably doesn't
1964 // happen often in practice.
1965 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001966 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001967 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001968}
1969
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001970TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001971 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1972 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1973 " .bbbbbbbbbb = 2,\n"
1974 " .cccccccccc = 3,\n"
1975 " .dddddddddd = 4,\n"
1976 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001977 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001978 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1979 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1980 " .ccccccccccccccccccccccccccc = 3,\n"
1981 " .ddddddddddddddddddddddddddd = 4,\n"
1982 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001983
1984 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00001985
1986 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
1987 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
1988 " [2] = bbbbbbbbbb,\n"
1989 " [3] = cccccccccc,\n"
1990 " [4] = dddddddddd,\n"
1991 " [5] = eeeeeeeeee};");
1992 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
1993 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1994 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
1995 " [3] = cccccccccccccccccccccccccccccccccccccc,\n"
1996 " [4] = dddddddddddddddddddddddddddddddddddddd,\n"
1997 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001998}
1999
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002000TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002001 verifyFormat("static A x = {{{}}};\n");
2002 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2003 " {init1, init2, init3, init4}}};",
2004 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00002005
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002006 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002007 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2008 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2009 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2010 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00002011 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002012 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2013 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2014 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00002015 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2016 " {rect.fRight - rect.fLeft, rect.fBottom - "
2017 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002018
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002019 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00002020 "SomeArrayOfSomeType a = {\n"
2021 " {{1, 2, 3},\n"
2022 " {1, 2, 3},\n"
2023 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
2024 " 333333333333333333333333333333},\n"
2025 " {1, 2, 3},\n"
2026 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00002027 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00002028 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002029 " {{1, 2, 3}},\n"
2030 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002031 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2032 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002033 " {{1, 2, 3}},\n"
2034 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002035
Daniel Jaspera44991332015-04-29 13:06:49 +00002036 verifyFormat("struct {\n"
2037 " unsigned bit;\n"
2038 " const char *const name;\n"
2039 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2040 " {kOsWin, \"Windows\"},\n"
2041 " {kOsLinux, \"Linux\"},\n"
2042 " {kOsCrOS, \"Chrome OS\"}};");
2043 verifyFormat("struct {\n"
2044 " unsigned bit;\n"
2045 " const char *const name;\n"
2046 "} kBitsToOs[] = {\n"
2047 " {kOsMac, \"Mac\"},\n"
2048 " {kOsWin, \"Windows\"},\n"
2049 " {kOsLinux, \"Linux\"},\n"
2050 " {kOsCrOS, \"Chrome OS\"},\n"
2051 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002052}
2053
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002054TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2055 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2056 " \\\n"
2057 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2058}
2059
Daniel Jasperda16db32013-01-07 10:48:50 +00002060TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002061 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2062 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00002063
2064 // Do break defaulted and deleted functions.
2065 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2066 " default;",
2067 getLLVMStyleWithColumns(40));
2068 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2069 " delete;",
2070 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002071}
2072
2073TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2074 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2075 getLLVMStyleWithColumns(40));
2076 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2077 getLLVMStyleWithColumns(40));
2078 EXPECT_EQ("#define Q \\\n"
2079 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
2080 " \"aaaaaaaa.cpp\"",
2081 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2082 getLLVMStyleWithColumns(40)));
2083}
2084
2085TEST_F(FormatTest, UnderstandsLinePPDirective) {
2086 EXPECT_EQ("# 123 \"A string literal\"",
2087 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00002088}
2089
Manuel Klimek591b5802013-01-31 15:58:48 +00002090TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00002091 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00002092 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002093}
2094
2095TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2096 EXPECT_EQ("#line 42 \"test\"\n",
2097 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002098 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
2099 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002100}
2101
2102TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2103 EXPECT_EQ("#line 42 \"test\"",
2104 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002105 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002106}
2107
Daniel Jasper877615c2013-10-11 19:45:02 +00002108TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2109 verifyFormat("#define A \\x20");
2110 verifyFormat("#define A \\ x20");
2111 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
2112 verifyFormat("#define A ''");
2113 verifyFormat("#define A ''qqq");
2114 verifyFormat("#define A `qqq");
2115 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00002116 EXPECT_EQ("const char *c = STRINGIFY(\n"
2117 "\\na : b);",
2118 format("const char * c = STRINGIFY(\n"
2119 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00002120
2121 verifyFormat("a\r\\");
2122 verifyFormat("a\v\\");
2123 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00002124}
2125
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002126TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002127 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2128 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002129 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002130 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00002131 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00002132
2133 verifyFormat("#define A A\n#define A A");
2134 verifyFormat("#define A(X) A\n#define A A");
2135
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002136 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2137 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002138}
2139
2140TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002141 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002142 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002143 "#define A( \\\n"
2144 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002145 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002146 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002147 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002148 " #include \"a.h\"\n"
2149 "#define A(A,\\\n"
2150 " B)\n"
2151 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002152 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002153 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002154}
2155
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002156TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002157
2158TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2159 EXPECT_EQ("#define A \\\n"
2160 " c; \\\n"
2161 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002162 "f;",
2163 format("#define A c; e;\n"
2164 "f;",
2165 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002166}
2167
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002168TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002169
Manuel Klimek1abf7892013-01-04 23:34:14 +00002170TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002171 EXPECT_EQ("int x,\n"
2172 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002173 " y;",
2174 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002175}
2176
Manuel Klimek09e07972013-01-05 21:34:55 +00002177TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002178 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002179 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002180 verifyFormat("#define A \\\n"
2181 " { \\\n"
2182 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002183 " }",
2184 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002185
2186 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002187 " void function##X()",
2188 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002189
2190 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002191 " void a##b##c()",
2192 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002193
Daniel Jasper39825ea2013-01-14 15:40:57 +00002194 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002195}
2196
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002197TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002198 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2199 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002200}
2201
Manuel Klimek0c137952013-02-11 12:33:24 +00002202TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2203 EXPECT_EQ("#define A b;", format("#define A \\\n"
2204 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002205 " b;",
2206 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002207 EXPECT_EQ("#define A \\\n"
2208 " \\\n"
2209 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002210 " b;",
2211 format("#define A \\\n"
2212 " \\\n"
2213 " a; \\\n"
2214 " b;",
2215 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002216 EXPECT_EQ("#define A \\\n"
2217 " a; \\\n"
2218 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002219 " b;",
2220 format("#define A \\\n"
2221 " a; \\\n"
2222 " \\\n"
2223 " b;",
2224 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002225}
2226
Daniel Jasper00475962013-02-19 17:14:38 +00002227TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002228 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002229 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002230 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002231 " case 2\n",
2232 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002233 verifyFormat("#define MACRO(a) \\\n"
2234 " if (a) \\\n"
2235 " f(); \\\n"
2236 " else \\\n"
2237 " g()",
2238 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002239 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002240 verifyIncompleteFormat("#define STR(x) #x\n"
2241 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002242 verifyFormat("#pragma omp threadprivate( \\\n"
2243 " y)), // expected-warning",
2244 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002245 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002246 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002247 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002248 "#define b \\\n"
2249 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002250 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002251 "a",
2252 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002253 verifyFormat("#define A \\\n"
2254 " { \\\n"
2255 " {\n"
2256 "#define B \\\n"
2257 " } \\\n"
2258 " }",
2259 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002260 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002261 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002262 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002263 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002264}
2265
Daniel Jasper40e19212013-05-29 13:16:10 +00002266TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2267 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2268 EXPECT_EQ("class A : public QObject {\n"
2269 " Q_OBJECT\n"
2270 "\n"
2271 " A() {}\n"
2272 "};",
2273 format("class A : public QObject {\n"
2274 " Q_OBJECT\n"
2275 "\n"
2276 " A() {\n}\n"
2277 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002278 EXPECT_EQ("MACRO\n"
2279 "/*static*/ int i;",
2280 format("MACRO\n"
2281 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002282 EXPECT_EQ("SOME_MACRO\n"
2283 "namespace {\n"
2284 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002285 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00002286 format("SOME_MACRO\n"
2287 " namespace {\n"
2288 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002289 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002290 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002291 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2292 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002293 // Only if everything is upper case.
2294 EXPECT_EQ("class A : public QObject {\n"
2295 " Q_Object A() {}\n"
2296 "};",
2297 format("class A : public QObject {\n"
2298 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002299 " A() {\n}\n"
2300 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002301
2302 // Only if the next line can actually start an unwrapped line.
2303 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2304 format("SOME_WEIRD_LOG_MACRO\n"
2305 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002306
2307 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002308 "(n, buffers))\n",
2309 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002310}
2311
Alexander Kornienkode644272013-04-08 22:16:06 +00002312TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2313 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2314 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2315 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002316 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002317 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2318 "int *createScopDetectionPass() { return 0; }",
2319 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2320 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2321 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2322 " class X {};\n"
2323 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2324 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002325 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2326 // braces, so that inner block is indented one level more.
2327 EXPECT_EQ("int q() {\n"
2328 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2329 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2330 " IPC_END_MESSAGE_MAP()\n"
2331 "}",
2332 format("int q() {\n"
2333 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2334 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2335 " IPC_END_MESSAGE_MAP()\n"
2336 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002337
Daniel Jasper352dae12014-01-03 11:50:46 +00002338 // Same inside macros.
2339 EXPECT_EQ("#define LIST(L) \\\n"
2340 " L(A) \\\n"
2341 " L(B) \\\n"
2342 " L(C)",
2343 format("#define LIST(L) \\\n"
2344 " L(A) \\\n"
2345 " L(B) \\\n"
2346 " L(C)",
2347 getGoogleStyle()));
2348
Daniel Jasper545c6522013-09-17 09:26:07 +00002349 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002350 EXPECT_EQ("int q() {\n"
2351 " f(x);\n"
2352 " f(x) {}\n"
2353 " f(x)->g();\n"
2354 " f(x)->*g();\n"
2355 " f(x).g();\n"
2356 " f(x) = x;\n"
2357 " f(x) += x;\n"
2358 " f(x) -= x;\n"
2359 " f(x) *= x;\n"
2360 " f(x) /= x;\n"
2361 " f(x) %= x;\n"
2362 " f(x) &= x;\n"
2363 " f(x) |= x;\n"
2364 " f(x) ^= x;\n"
2365 " f(x) >>= x;\n"
2366 " f(x) <<= x;\n"
2367 " f(x)[y].z();\n"
2368 " LOG(INFO) << x;\n"
2369 " ifstream(x) >> x;\n"
2370 "}\n",
2371 format("int q() {\n"
2372 " f(x)\n;\n"
2373 " f(x)\n {}\n"
2374 " f(x)\n->g();\n"
2375 " f(x)\n->*g();\n"
2376 " f(x)\n.g();\n"
2377 " f(x)\n = x;\n"
2378 " f(x)\n += x;\n"
2379 " f(x)\n -= x;\n"
2380 " f(x)\n *= x;\n"
2381 " f(x)\n /= x;\n"
2382 " f(x)\n %= x;\n"
2383 " f(x)\n &= x;\n"
2384 " f(x)\n |= x;\n"
2385 " f(x)\n ^= x;\n"
2386 " f(x)\n >>= x;\n"
2387 " f(x)\n <<= x;\n"
2388 " f(x)\n[y].z();\n"
2389 " LOG(INFO)\n << x;\n"
2390 " ifstream(x)\n >> x;\n"
2391 "}\n"));
2392 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002393 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002394 " if (1) {\n"
2395 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002396 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002397 " while (1) {\n"
2398 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002399 " F(x)\n"
2400 " G(x);\n"
2401 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002402 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002403 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002404 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002405 " }\n"
2406 "}\n",
2407 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002408 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002409 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002410 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002411 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002412 "F(x)\n"
2413 "G(x);\n"
2414 "F(x)\n"
2415 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002416 "}\n"));
2417 EXPECT_EQ("class A {\n"
2418 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002419 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002420 " A(X x)\n" // FIXME: function-level try blocks are broken.
2421 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002422 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002423 " }\n"
2424 "};",
2425 format("class A {\n"
2426 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002427 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002428 " A(X x)\n"
2429 " try : t(0) {} catch (...) {}\n"
2430 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002431 EXPECT_EQ("class SomeClass {\n"
2432 "public:\n"
2433 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2434 "};",
2435 format("class SomeClass {\n"
2436 "public:\n"
2437 " SomeClass()\n"
2438 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2439 "};"));
2440 EXPECT_EQ("class SomeClass {\n"
2441 "public:\n"
2442 " SomeClass()\n"
2443 " 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 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002451
2452 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002453}
2454
Manuel Klimek4fe43002013-05-22 12:51:29 +00002455TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2456 verifyFormat("#define A \\\n"
2457 " f({ \\\n"
2458 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002459 " });",
2460 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002461}
2462
Krasimir Georgievad47c902017-08-30 14:34:57 +00002463TEST_F(FormatTest, IndentPreprocessorDirectives) {
2464 FormatStyle Style = getLLVMStyle();
2465 Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2466 Style.ColumnLimit = 40;
2467 verifyFormat("#ifdef _WIN32\n"
2468 "#define A 0\n"
2469 "#ifdef VAR2\n"
2470 "#define B 1\n"
2471 "#include <someheader.h>\n"
2472 "#define MACRO \\\n"
2473 " some_very_long_func_aaaaaaaaaa();\n"
2474 "#endif\n"
2475 "#else\n"
2476 "#define A 1\n"
2477 "#endif",
2478 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002479 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2480 verifyFormat("#ifdef _WIN32\n"
2481 "# define A 0\n"
2482 "# ifdef VAR2\n"
2483 "# define B 1\n"
2484 "# include <someheader.h>\n"
2485 "# define MACRO \\\n"
2486 " some_very_long_func_aaaaaaaaaa();\n"
2487 "# endif\n"
2488 "#else\n"
2489 "# define A 1\n"
2490 "#endif",
2491 Style);
2492 verifyFormat("#if A\n"
2493 "# define MACRO \\\n"
2494 " void a(int x) { \\\n"
2495 " b(); \\\n"
2496 " c(); \\\n"
2497 " d(); \\\n"
2498 " e(); \\\n"
2499 " f(); \\\n"
2500 " }\n"
2501 "#endif",
2502 Style);
2503 // Comments before include guard.
2504 verifyFormat("// file comment\n"
2505 "// file comment\n"
2506 "#ifndef HEADER_H\n"
2507 "#define HEADER_H\n"
2508 "code();\n"
2509 "#endif",
2510 Style);
2511 // Test with include guards.
Krasimir Georgievad47c902017-08-30 14:34:57 +00002512 verifyFormat("#ifndef HEADER_H\n"
2513 "#define HEADER_H\n"
2514 "code();\n"
2515 "#endif",
2516 Style);
2517 // Include guards must have a #define with the same variable immediately
2518 // after #ifndef.
2519 verifyFormat("#ifndef NOT_GUARD\n"
2520 "# define FOO\n"
2521 "code();\n"
2522 "#endif",
2523 Style);
2524
2525 // Include guards must cover the entire file.
2526 verifyFormat("code();\n"
2527 "code();\n"
2528 "#ifndef NOT_GUARD\n"
2529 "# define NOT_GUARD\n"
2530 "code();\n"
2531 "#endif",
2532 Style);
2533 verifyFormat("#ifndef NOT_GUARD\n"
2534 "# define NOT_GUARD\n"
2535 "code();\n"
2536 "#endif\n"
2537 "code();",
2538 Style);
2539 // Test with trailing blank lines.
2540 verifyFormat("#ifndef HEADER_H\n"
2541 "#define HEADER_H\n"
2542 "code();\n"
2543 "#endif\n",
2544 Style);
2545 // Include guards don't have #else.
2546 verifyFormat("#ifndef NOT_GUARD\n"
2547 "# define NOT_GUARD\n"
2548 "code();\n"
2549 "#else\n"
2550 "#endif",
2551 Style);
2552 verifyFormat("#ifndef NOT_GUARD\n"
2553 "# define NOT_GUARD\n"
2554 "code();\n"
2555 "#elif FOO\n"
2556 "#endif",
2557 Style);
Mark Zeren1c3afaf2018-02-05 15:59:00 +00002558 // Non-identifier #define after potential include guard.
2559 verifyFormat("#ifndef FOO\n"
2560 "# define 1\n"
2561 "#endif\n",
2562 Style);
2563 // #if closes past last non-preprocessor line.
2564 verifyFormat("#ifndef FOO\n"
2565 "#define FOO\n"
2566 "#if 1\n"
2567 "int i;\n"
2568 "# define A 0\n"
2569 "#endif\n"
2570 "#endif\n",
2571 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002572 // FIXME: This doesn't handle the case where there's code between the
2573 // #ifndef and #define but all other conditions hold. This is because when
2574 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2575 // previous code line yet, so we can't detect it.
2576 EXPECT_EQ("#ifndef NOT_GUARD\n"
2577 "code();\n"
2578 "#define NOT_GUARD\n"
2579 "code();\n"
2580 "#endif",
2581 format("#ifndef NOT_GUARD\n"
2582 "code();\n"
2583 "# define NOT_GUARD\n"
2584 "code();\n"
2585 "#endif",
2586 Style));
2587 // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2588 // be outside an include guard. Examples are #pragma once and
2589 // #pragma GCC diagnostic, or anything else that does not change the meaning
2590 // of the file if it's included multiple times.
2591 EXPECT_EQ("#ifdef WIN32\n"
2592 "# pragma once\n"
2593 "#endif\n"
2594 "#ifndef HEADER_H\n"
2595 "# define HEADER_H\n"
2596 "code();\n"
2597 "#endif",
2598 format("#ifdef WIN32\n"
2599 "# pragma once\n"
2600 "#endif\n"
2601 "#ifndef HEADER_H\n"
2602 "#define HEADER_H\n"
2603 "code();\n"
2604 "#endif",
2605 Style));
2606 // FIXME: This does not detect when there is a single non-preprocessor line
2607 // in front of an include-guard-like structure where other conditions hold
2608 // because ScopedLineState hides the line.
2609 EXPECT_EQ("code();\n"
2610 "#ifndef HEADER_H\n"
2611 "#define HEADER_H\n"
2612 "code();\n"
2613 "#endif",
2614 format("code();\n"
2615 "#ifndef HEADER_H\n"
2616 "# define HEADER_H\n"
2617 "code();\n"
2618 "#endif",
2619 Style));
Mark Zerend2b2ac62018-01-31 20:05:50 +00002620 // Keep comments aligned with #, otherwise indent comments normally. These
2621 // tests cannot use verifyFormat because messUp manipulates leading
2622 // whitespace.
2623 {
2624 const char *Expected = ""
2625 "void f() {\n"
2626 "#if 1\n"
2627 "// Preprocessor aligned.\n"
2628 "# define A 0\n"
2629 " // Code. Separated by blank line.\n"
2630 "\n"
2631 "# define B 0\n"
2632 " // Code. Not aligned with #\n"
2633 "# define C 0\n"
2634 "#endif";
2635 const char *ToFormat = ""
2636 "void f() {\n"
2637 "#if 1\n"
2638 "// Preprocessor aligned.\n"
2639 "# define A 0\n"
2640 "// Code. Separated by blank line.\n"
2641 "\n"
2642 "# define B 0\n"
2643 " // Code. Not aligned with #\n"
2644 "# define C 0\n"
2645 "#endif";
2646 EXPECT_EQ(Expected, format(ToFormat, Style));
2647 EXPECT_EQ(Expected, format(Expected, Style));
2648 }
2649 // Keep block quotes aligned.
2650 {
2651 const char *Expected = ""
2652 "void f() {\n"
2653 "#if 1\n"
2654 "/* Preprocessor aligned. */\n"
2655 "# define A 0\n"
2656 " /* Code. Separated by blank line. */\n"
2657 "\n"
2658 "# define B 0\n"
2659 " /* Code. Not aligned with # */\n"
2660 "# define C 0\n"
2661 "#endif";
2662 const char *ToFormat = ""
2663 "void f() {\n"
2664 "#if 1\n"
2665 "/* Preprocessor aligned. */\n"
2666 "# define A 0\n"
2667 "/* Code. Separated by blank line. */\n"
2668 "\n"
2669 "# define B 0\n"
2670 " /* Code. Not aligned with # */\n"
2671 "# define C 0\n"
2672 "#endif";
2673 EXPECT_EQ(Expected, format(ToFormat, Style));
2674 EXPECT_EQ(Expected, format(Expected, Style));
2675 }
2676 // Keep comments aligned with un-indented directives.
2677 {
2678 const char *Expected = ""
2679 "void f() {\n"
2680 "// Preprocessor aligned.\n"
2681 "#define A 0\n"
2682 " // Code. Separated by blank line.\n"
2683 "\n"
2684 "#define B 0\n"
2685 " // Code. Not aligned with #\n"
2686 "#define C 0\n";
2687 const char *ToFormat = ""
2688 "void f() {\n"
2689 "// Preprocessor aligned.\n"
2690 "#define A 0\n"
2691 "// Code. Separated by blank line.\n"
2692 "\n"
2693 "#define B 0\n"
2694 " // Code. Not aligned with #\n"
2695 "#define C 0\n";
2696 EXPECT_EQ(Expected, format(ToFormat, Style));
2697 EXPECT_EQ(Expected, format(Expected, Style));
2698 }
Krasimir Georgievad47c902017-08-30 14:34:57 +00002699 // Test with tabs.
2700 Style.UseTab = FormatStyle::UT_Always;
2701 Style.IndentWidth = 8;
2702 Style.TabWidth = 8;
2703 verifyFormat("#ifdef _WIN32\n"
2704 "#\tdefine A 0\n"
2705 "#\tifdef VAR2\n"
2706 "#\t\tdefine B 1\n"
2707 "#\t\tinclude <someheader.h>\n"
2708 "#\t\tdefine MACRO \\\n"
2709 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
2710 "#\tendif\n"
2711 "#else\n"
2712 "#\tdefine A 1\n"
2713 "#endif",
2714 Style);
Daniel Jasper4df130f2017-09-04 13:33:52 +00002715
2716 // Regression test: Multiline-macro inside include guards.
2717 verifyFormat("#ifndef HEADER_H\n"
2718 "#define HEADER_H\n"
2719 "#define A() \\\n"
2720 " int i; \\\n"
2721 " int j;\n"
2722 "#endif // HEADER_H",
2723 getLLVMStyleWithColumns(20));
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002724}
2725
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002726TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002727 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002728}
2729
Manuel Klimek1058d982013-01-06 20:07:31 +00002730TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2731 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2732 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2733 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2734 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2735}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002736
Daniel Jaspere2408e32015-05-06 11:16:43 +00002737TEST_F(FormatTest, EscapedNewlines) {
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002738 FormatStyle Narrow = getLLVMStyleWithColumns(11);
2739 EXPECT_EQ("#define A \\\n int i; \\\n int j;",
2740 format("#define A \\\nint i;\\\n int j;", Narrow));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002741 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002742 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002743 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002744 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002745
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002746 FormatStyle AlignLeft = getLLVMStyle();
2747 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
2748 EXPECT_EQ("#define MACRO(x) \\\n"
2749 "private: \\\n"
2750 " int x(int a);\n",
2751 format("#define MACRO(x) \\\n"
2752 "private: \\\n"
2753 " int x(int a);\n",
2754 AlignLeft));
2755
2756 // CRLF line endings
2757 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;",
2758 format("#define A \\\r\nint i;\\\r\n int j;", Narrow));
2759 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
2760 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
2761 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */"));
2762 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
2763 EXPECT_EQ("#define MACRO(x) \\\r\n"
2764 "private: \\\r\n"
2765 " int x(int a);\r\n",
2766 format("#define MACRO(x) \\\r\n"
2767 "private: \\\r\n"
2768 " int x(int a);\r\n",
2769 AlignLeft));
2770
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002771 FormatStyle DontAlign = getLLVMStyle();
2772 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
2773 DontAlign.MaxEmptyLinesToKeep = 3;
2774 // FIXME: can't use verifyFormat here because the newline before
2775 // "public:" is not inserted the first time it's reformatted
2776 EXPECT_EQ("#define A \\\n"
2777 " class Foo { \\\n"
2778 " void bar(); \\\n"
2779 "\\\n"
2780 "\\\n"
2781 "\\\n"
2782 " public: \\\n"
2783 " void baz(); \\\n"
2784 " };",
2785 format("#define A \\\n"
2786 " class Foo { \\\n"
2787 " void bar(); \\\n"
2788 "\\\n"
2789 "\\\n"
2790 "\\\n"
2791 " public: \\\n"
2792 " void baz(); \\\n"
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002793 " };",
2794 DontAlign));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002795}
2796
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002797TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2798 verifyFormat("#define A \\\n"
2799 " int v( \\\n"
2800 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002801 " int i;",
2802 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002803}
2804
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002805TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002806 EXPECT_EQ(
2807 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2808 " \\\n"
2809 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2810 "\n"
2811 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2812 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2813 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2814 "\\\n"
2815 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2816 " \n"
2817 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2818 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002819}
2820
Manuel Klimek52b15152013-01-09 15:25:02 +00002821TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2822 EXPECT_EQ("int\n"
2823 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002824 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002825 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002826 verifyFormat("functionCallTo(\n"
2827 " someOtherFunction(\n"
2828 " withSomeParameters, whichInSequence,\n"
2829 " areLongerThanALine(andAnotherCall,\n"
2830 "#define A B\n"
2831 " withMoreParamters,\n"
2832 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002833 " andMoreParameters),\n"
2834 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002835 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002836 verifyFormat("Foo::Foo()\n"
2837 "#ifdef BAR\n"
2838 " : baz(0)\n"
2839 "#endif\n"
2840 "{\n"
2841 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002842 verifyFormat("void f() {\n"
2843 " if (true)\n"
2844 "#ifdef A\n"
2845 " f(42);\n"
2846 " x();\n"
2847 "#else\n"
2848 " g();\n"
2849 " x();\n"
2850 "#endif\n"
2851 "}");
2852 verifyFormat("void f(param1, param2,\n"
2853 " param3,\n"
2854 "#ifdef A\n"
2855 " param4(param5,\n"
2856 "#ifdef A1\n"
2857 " param6,\n"
2858 "#ifdef A2\n"
2859 " param7),\n"
2860 "#else\n"
2861 " param8),\n"
2862 " param9,\n"
2863 "#endif\n"
2864 " param10,\n"
2865 "#endif\n"
2866 " param11)\n"
2867 "#else\n"
2868 " param12)\n"
2869 "#endif\n"
2870 "{\n"
2871 " x();\n"
2872 "}",
2873 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002874 verifyFormat("#if 1\n"
2875 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002876 verifyFormat("#if 1\n"
2877 "#endif\n"
2878 "#if 1\n"
2879 "#else\n"
2880 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002881 verifyFormat("DEBUG({\n"
2882 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2883 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2884 "});\n"
2885 "#if a\n"
2886 "#else\n"
2887 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002888
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002889 verifyIncompleteFormat("void f(\n"
2890 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00002891 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002892 "#else\n"
2893 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002894}
2895
Manuel Klimek14bd9172014-01-29 08:49:02 +00002896TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2897 verifyFormat("#endif\n"
2898 "#if B");
2899}
2900
Manuel Klimek88033d72013-10-21 08:11:15 +00002901TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2902 FormatStyle SingleLine = getLLVMStyle();
2903 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002904 verifyFormat("#if 0\n"
2905 "#elif 1\n"
2906 "#endif\n"
2907 "void foo() {\n"
2908 " if (test) foo2();\n"
2909 "}",
2910 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002911}
2912
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002913TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002914 verifyFormat("functionCall({ int i; });");
2915 verifyFormat("functionCall({\n"
2916 " int i;\n"
2917 " int j;\n"
2918 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002919 verifyFormat("functionCall(\n"
2920 " {\n"
2921 " int i;\n"
2922 " int j;\n"
2923 " },\n"
2924 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002925 verifyFormat("functionA(functionB({\n"
2926 " int i;\n"
2927 " int j;\n"
2928 " }),\n"
2929 " aaaa, bbbb, cccc);");
2930 verifyFormat("functionCall(\n"
2931 " {\n"
2932 " int i;\n"
2933 " int j;\n"
2934 " },\n"
2935 " aaaa, bbbb, // comment\n"
2936 " cccc);");
2937 verifyFormat("functionA(functionB({\n"
2938 " int i;\n"
2939 " int j;\n"
2940 " }),\n"
2941 " aaaa, bbbb, // comment\n"
2942 " cccc);");
2943 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2944 verifyFormat("functionCall(aaaa, bbbb, {\n"
2945 " int i;\n"
2946 " int j;\n"
2947 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002948 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002949 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002950 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002951 " int i; // break\n"
2952 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002953 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2954 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002955 verifyFormat("DEBUG({\n"
2956 " if (a)\n"
2957 " f();\n"
2958 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002959}
2960
2961TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002962 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002963 "int i;",
2964 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002965}
2966
2967TEST_F(FormatTest, LayoutNestedBlocks) {
2968 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2969 " struct s {\n"
2970 " int i;\n"
2971 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002972 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002973 " for (int i = 0; i < 10; ++i)\n"
2974 " return;\n"
2975 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002976 verifyFormat("call(parameter, {\n"
2977 " something();\n"
2978 " // Comment using all columns.\n"
2979 " somethingelse();\n"
2980 "});",
2981 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002982 verifyFormat("DEBUG( //\n"
2983 " { f(); }, a);");
2984 verifyFormat("DEBUG( //\n"
2985 " {\n"
2986 " f(); //\n"
2987 " },\n"
2988 " a);");
2989
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002990 EXPECT_EQ("call(parameter, {\n"
2991 " something();\n"
2992 " // Comment too\n"
2993 " // looooooooooong.\n"
2994 " somethingElse();\n"
2995 "});",
2996 format("call(parameter, {\n"
2997 " something();\n"
2998 " // Comment too looooooooooong.\n"
2999 " somethingElse();\n"
3000 "});",
3001 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003002 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003003 EXPECT_EQ("DEBUG({ // comment\n"
3004 " int i;\n"
3005 "});",
3006 format("DEBUG({ // comment\n"
3007 "int i;\n"
3008 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003009 EXPECT_EQ("DEBUG({\n"
3010 " int i;\n"
3011 "\n"
3012 " // comment\n"
3013 " int j;\n"
3014 "});",
3015 format("DEBUG({\n"
3016 " int i;\n"
3017 "\n"
3018 " // comment\n"
3019 " int j;\n"
3020 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003021
3022 verifyFormat("DEBUG({\n"
3023 " if (a)\n"
3024 " return;\n"
3025 "});");
3026 verifyGoogleFormat("DEBUG({\n"
3027 " if (a) return;\n"
3028 "});");
3029 FormatStyle Style = getGoogleStyle();
3030 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003031 verifyFormat("Debug(aaaaa,\n"
3032 " {\n"
3033 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3034 " },\n"
3035 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003036 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003037
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003038 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3039
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003040 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003041}
3042
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003043TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3044 EXPECT_EQ("#define MACRO() \\\n"
3045 " Debug(aaa, /* force line break */ \\\n"
3046 " { \\\n"
3047 " int i; \\\n"
3048 " int j; \\\n"
3049 " })",
3050 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3051 " { int i; int j; })",
3052 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003053
3054 EXPECT_EQ("#define A \\\n"
3055 " [] { \\\n"
3056 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3057 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3058 " }",
3059 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3060 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3061 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003062}
3063
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003064TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3065 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003066 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003067 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003068}
3069
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003070TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3071 FormatStyle Style = getLLVMStyle();
3072 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3073 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3074 verifyFormat("FOO_BEGIN\n"
3075 " FOO_ENTRY\n"
3076 "FOO_END", Style);
3077 verifyFormat("FOO_BEGIN\n"
3078 " NESTED_FOO_BEGIN\n"
3079 " NESTED_FOO_ENTRY\n"
3080 " NESTED_FOO_END\n"
3081 "FOO_END", Style);
3082 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3083 " int x;\n"
3084 " x = 1;\n"
3085 "FOO_END(Baz)", Style);
3086}
3087
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003088//===----------------------------------------------------------------------===//
3089// Line break tests.
3090//===----------------------------------------------------------------------===//
3091
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003092TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003093 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003094 "void f() {\n"
3095 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3096 " parameter, parameter, parameter)),\n"
3097 " SecondLongCall(parameter));\n"
3098 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003099 verifyFormat(
3100 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3101 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3102 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3103 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3104 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003105 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3106 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3107 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3108 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003109 verifyFormat(
3110 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3111 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3112 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3113 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003114 verifyFormat("int a = bbbb && ccc &&\n"
3115 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003116 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003117 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003118}
3119
Daniel Jasperd69fc772013-05-08 14:12:04 +00003120TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3121 verifyFormat(
3122 "bool aaaaaaa =\n"
3123 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3124 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003125 verifyFormat(
3126 "bool aaaaaaa =\n"
3127 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3128 " bbbbbbbb();");
3129
Daniel Jasperd69fc772013-05-08 14:12:04 +00003130 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3131 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3132 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003133 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3134 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3135 " ccccccccc == ddddddddddd;");
3136 verifyFormat(
3137 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3138 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3139 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003140
3141 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3142 " aaaaaa) &&\n"
3143 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003144 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3145 " aaaaaa) >>\n"
3146 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003147 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003148 " SourceMgr.getSpellingColumnNumber(\n"
3149 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3150 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003151
Daniel Jasper68d888c2013-06-03 08:42:05 +00003152 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3153 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3154 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00003155 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3156 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3157 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003158 verifyFormat("b = a &&\n"
3159 " // Comment\n"
3160 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003161
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003162 // If the LHS of a comparison is not a binary expression itself, the
3163 // additional linebreak confuses many people.
3164 verifyFormat(
3165 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3166 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3167 "}");
3168 verifyFormat(
3169 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3170 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3171 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003172 verifyFormat(
3173 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3175 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003176 verifyFormat(
3177 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3178 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3179 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003180 // Even explicit parentheses stress the precedence enough to make the
3181 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003182 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3183 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3184 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003185 // This cases is borderline, but with the indentation it is still readable.
3186 verifyFormat(
3187 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3188 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3189 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3190 "}",
3191 getLLVMStyleWithColumns(75));
3192
3193 // If the LHS is a binary expression, we should still use the additional break
3194 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003195 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3196 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3197 " 5) {\n"
3198 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003199 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3200 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3201 " 5) {\n"
3202 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003203
Daniel Jasper571f1af2013-05-14 20:39:56 +00003204 FormatStyle OnePerLine = getLLVMStyle();
3205 OnePerLine.BinPackParameters = false;
3206 verifyFormat(
3207 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3208 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3209 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3210 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003211
3212 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3213 " .aaa(aaaaaaaaaaaaa) *\n"
3214 " aaaaaaa +\n"
3215 " aaaaaaa;",
3216 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003217}
3218
Daniel Jasper6bee6822013-04-08 20:33:42 +00003219TEST_F(FormatTest, ExpressionIndentation) {
3220 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3221 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3222 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3223 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3224 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3225 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3226 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3227 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3228 " ccccccccccccccccccccccccccccccccccccccccc;");
3229 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3230 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3231 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3232 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3233 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3234 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3235 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3236 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3237 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3238 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3239 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3240 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003241 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003242 "} else if (aaaaa && bbbbb > // break\n"
3243 " ccccc) {\n"
3244 "}");
3245 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003246 "} else if (aaaaa &&\n"
3247 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003248 " ccccc &&\n"
3249 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003250 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003251
3252 // Presence of a trailing comment used to change indentation of b.
3253 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3254 " b;\n"
3255 "return aaaaaaaaaaaaaaaaaaa +\n"
3256 " b; //",
3257 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003258}
3259
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003260TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3261 // Not sure what the best system is here. Like this, the LHS can be found
3262 // immediately above an operator (everything with the same or a higher
3263 // indent). The RHS is aligned right of the operator and so compasses
3264 // everything until something with the same indent as the operator is found.
3265 // FIXME: Is this a good system?
3266 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003267 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003268 verifyFormat(
3269 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003270 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3271 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3272 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3273 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3274 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003275 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003276 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3277 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003278 Style);
3279 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003280 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3281 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003282 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3283 Style);
3284 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003285 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3286 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003287 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3288 Style);
3289 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3290 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003291 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3292 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003293 Style);
3294 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003295 "} else if (aaaaa\n"
3296 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003297 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003298 "}",
3299 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003300 verifyFormat("return (a)\n"
3301 " // comment\n"
3302 " + b;",
3303 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003304 verifyFormat(
3305 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3306 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3307 " + cc;",
3308 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003309
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003310 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3311 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3312 Style);
3313
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003314 // Forced by comments.
3315 verifyFormat(
3316 "unsigned ContentSize =\n"
3317 " sizeof(int16_t) // DWARF ARange version number\n"
3318 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3319 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3320 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003321
3322 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3323 " == boost::fusion::at_c<1>(iiii).second;",
3324 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003325
3326 Style.ColumnLimit = 60;
3327 verifyFormat("zzzzzzzzzz\n"
3328 " = bbbbbbbbbbbbbbbbb\n"
3329 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3330 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003331}
3332
Daniel Jasperb1270392017-02-01 23:27:37 +00003333TEST_F(FormatTest, EnforcedOperatorWraps) {
3334 // Here we'd like to wrap after the || operators, but a comment is forcing an
3335 // earlier wrap.
3336 verifyFormat("bool x = aaaaa //\n"
3337 " || bbbbb\n"
3338 " //\n"
3339 " || cccc;");
3340}
3341
Daniel Jasper3219e432014-12-02 13:24:51 +00003342TEST_F(FormatTest, NoOperandAlignment) {
3343 FormatStyle Style = getLLVMStyle();
3344 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00003345 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3346 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3347 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3348 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003349 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003350 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3351 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3352 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3353 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3354 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3355 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3356 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3357 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3358 " > ccccccccccccccccccccccccccccccccccccccccc;",
3359 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003360
3361 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3362 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3363 " + cc;",
3364 Style);
3365 verifyFormat("int a = aa\n"
3366 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003367 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00003368 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003369
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003370 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003371 verifyFormat("return (a > b\n"
3372 " // comment1\n"
3373 " // comment2\n"
3374 " || c);",
3375 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003376}
3377
Daniel Jasperac043c92014-09-15 11:11:00 +00003378TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3379 FormatStyle Style = getLLVMStyle();
3380 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3381 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3382 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003383 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3384 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003385}
3386
Daniel Jasper988e7e42017-05-08 15:07:52 +00003387TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3388 FormatStyle Style = getLLVMStyle();
3389 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3390 Style.BinPackArguments = false;
3391 Style.ColumnLimit = 40;
3392 verifyFormat("void test() {\n"
3393 " someFunction(\n"
3394 " this + argument + is + quite\n"
3395 " + long + so + it + gets + wrapped\n"
3396 " + but + remains + bin - packed);\n"
3397 "}",
3398 Style);
3399 verifyFormat("void test() {\n"
3400 " someFunction(arg1,\n"
3401 " this + argument + is\n"
3402 " + quite + long + so\n"
3403 " + it + gets + wrapped\n"
3404 " + but + remains + bin\n"
3405 " - packed,\n"
3406 " arg3);\n"
3407 "}",
3408 Style);
3409 verifyFormat("void test() {\n"
3410 " someFunction(\n"
3411 " arg1,\n"
3412 " this + argument + has\n"
3413 " + anotherFunc(nested,\n"
3414 " calls + whose\n"
3415 " + arguments\n"
3416 " + are + also\n"
3417 " + wrapped,\n"
3418 " in + addition)\n"
3419 " + to + being + bin - packed,\n"
3420 " arg3);\n"
3421 "}",
3422 Style);
3423
3424 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3425 verifyFormat("void test() {\n"
3426 " someFunction(\n"
3427 " arg1,\n"
3428 " this + argument + has +\n"
3429 " anotherFunc(nested,\n"
3430 " calls + whose +\n"
3431 " arguments +\n"
3432 " are + also +\n"
3433 " wrapped,\n"
3434 " in + addition) +\n"
3435 " to + being + bin - packed,\n"
3436 " arg3);\n"
3437 "}",
3438 Style);
3439}
3440
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003441TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003442 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003443 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3444 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003445 verifyFormat("Constructor()\n"
3446 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003447 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003448 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003449 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003450 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003451
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003452 verifyFormat("template <typename T>\n"
3453 "Constructor() : Initializer(FitsOnTheLine) {}",
3454 getLLVMStyleWithColumns(45));
3455
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003456 verifyFormat(
3457 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003458 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003459
3460 verifyFormat(
3461 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003462 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003463 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003464 verifyFormat(
3465 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003466 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003467 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003468 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3469 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3470 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003471
3472 verifyFormat("Constructor()\n"
3473 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3474 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3475 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003476 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003477
Daniel Jasper65585ed2013-01-28 13:31:35 +00003478 verifyFormat("Constructor()\n"
3479 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003480 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003481
Daniel Jasper62e68172013-02-25 15:59:54 +00003482 verifyFormat("Constructor(int Parameter = 0)\n"
3483 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3484 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003485 verifyFormat("Constructor()\n"
3486 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3487 "}",
3488 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003489 verifyFormat("Constructor()\n"
3490 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3491 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003492
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003493 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003494 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003495 verifyFormat("Constructor()\n"
3496 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3497 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3498 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003499
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003500 FormatStyle OnePerLine = getLLVMStyle();
3501 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003502 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003503 verifyFormat("SomeClass::Constructor()\n"
3504 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3505 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003506 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003507 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003508 verifyFormat("SomeClass::Constructor()\n"
3509 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3510 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003511 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003512 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003513 verifyFormat("MyClass::MyClass(int var)\n"
3514 " : some_var_(var), // 4 space indent\n"
3515 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003516 "}",
3517 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003518 verifyFormat("Constructor()\n"
3519 " : aaaaa(aaaaaa),\n"
3520 " aaaaa(aaaaaa),\n"
3521 " aaaaa(aaaaaa),\n"
3522 " aaaaa(aaaaaa),\n"
3523 " aaaaa(aaaaaa) {}",
3524 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003525 verifyFormat("Constructor()\n"
3526 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3527 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3528 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003529 OnePerLine.BinPackParameters = false;
3530 verifyFormat(
3531 "Constructor()\n"
3532 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3533 " aaaaaaaaaaa().aaa(),\n"
3534 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3535 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003536 OnePerLine.ColumnLimit = 60;
3537 verifyFormat("Constructor()\n"
3538 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3539 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3540 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003541
3542 EXPECT_EQ("Constructor()\n"
3543 " : // Comment forcing unwanted break.\n"
3544 " aaaa(aaaa) {}",
3545 format("Constructor() :\n"
3546 " // Comment forcing unwanted break.\n"
3547 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003548}
3549
Francois Ferranda6b6d512017-05-24 11:36:58 +00003550TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3551 FormatStyle Style = getLLVMStyle();
3552 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3553
3554 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3555 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3556 getStyleWithColumns(Style, 45));
3557 verifyFormat("Constructor() :\n"
3558 " Initializer(FitsOnTheLine) {}",
3559 getStyleWithColumns(Style, 44));
3560 verifyFormat("Constructor() :\n"
3561 " Initializer(FitsOnTheLine) {}",
3562 getStyleWithColumns(Style, 43));
3563
3564 verifyFormat("template <typename T>\n"
3565 "Constructor() : Initializer(FitsOnTheLine) {}",
3566 getStyleWithColumns(Style, 50));
3567
3568 verifyFormat(
3569 "SomeClass::Constructor() :\n"
3570 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3571 Style);
3572
3573 verifyFormat(
3574 "SomeClass::Constructor() :\n"
3575 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3576 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3577 Style);
3578 verifyFormat(
3579 "SomeClass::Constructor() :\n"
3580 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3581 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3582 Style);
3583 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3584 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3585 " aaaaaaaaaa(aaaaaa) {}",
3586 Style);
3587
3588 verifyFormat("Constructor() :\n"
3589 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3590 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3591 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3592 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3593 Style);
3594
3595 verifyFormat("Constructor() :\n"
3596 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3597 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3598 Style);
3599
3600 verifyFormat("Constructor(int Parameter = 0) :\n"
3601 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3602 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3603 Style);
3604 verifyFormat("Constructor() :\n"
3605 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3606 "}",
3607 getStyleWithColumns(Style, 60));
3608 verifyFormat("Constructor() :\n"
3609 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3610 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3611 Style);
3612
3613 // Here a line could be saved by splitting the second initializer onto two
3614 // lines, but that is not desirable.
3615 verifyFormat("Constructor() :\n"
3616 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3617 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3618 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3619 Style);
3620
3621 FormatStyle OnePerLine = Style;
3622 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3623 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3624 verifyFormat("SomeClass::Constructor() :\n"
3625 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3626 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3627 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3628 OnePerLine);
3629 verifyFormat("SomeClass::Constructor() :\n"
3630 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3631 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3632 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3633 OnePerLine);
3634 verifyFormat("MyClass::MyClass(int var) :\n"
3635 " some_var_(var), // 4 space indent\n"
3636 " some_other_var_(var + 1) { // lined up\n"
3637 "}",
3638 OnePerLine);
3639 verifyFormat("Constructor() :\n"
3640 " aaaaa(aaaaaa),\n"
3641 " aaaaa(aaaaaa),\n"
3642 " aaaaa(aaaaaa),\n"
3643 " aaaaa(aaaaaa),\n"
3644 " aaaaa(aaaaaa) {}",
3645 OnePerLine);
3646 verifyFormat("Constructor() :\n"
3647 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3648 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3649 OnePerLine);
3650 OnePerLine.BinPackParameters = false;
3651 verifyFormat(
3652 "Constructor() :\n"
3653 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3654 " aaaaaaaaaaa().aaa(),\n"
3655 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3656 OnePerLine);
3657 OnePerLine.ColumnLimit = 60;
3658 verifyFormat("Constructor() :\n"
3659 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3660 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3661 OnePerLine);
3662
3663 EXPECT_EQ("Constructor() :\n"
3664 " // Comment forcing unwanted break.\n"
3665 " aaaa(aaaa) {}",
3666 format("Constructor() :\n"
3667 " // Comment forcing unwanted break.\n"
3668 " aaaa(aaaa) {}",
3669 Style));
3670
3671 Style.ColumnLimit = 0;
3672 verifyFormat("SomeClass::Constructor() :\n"
3673 " a(a) {}",
3674 Style);
3675 verifyFormat("SomeClass::Constructor() noexcept :\n"
3676 " a(a) {}",
3677 Style);
3678 verifyFormat("SomeClass::Constructor() :\n"
3679 " a(a), b(b), c(c) {}",
3680 Style);
3681 verifyFormat("SomeClass::Constructor() :\n"
3682 " a(a) {\n"
3683 " foo();\n"
3684 " bar();\n"
3685 "}",
3686 Style);
3687
3688 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3689 verifyFormat("SomeClass::Constructor() :\n"
3690 " a(a), b(b), c(c) {\n"
3691 "}",
3692 Style);
3693 verifyFormat("SomeClass::Constructor() :\n"
3694 " a(a) {\n"
3695 "}",
3696 Style);
3697
3698 Style.ColumnLimit = 80;
3699 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3700 Style.ConstructorInitializerIndentWidth = 2;
3701 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3702 Style);
3703 verifyFormat("SomeClass::Constructor() :\n"
3704 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3705 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3706 Style);
3707}
3708
David Blaikieea95dd72017-08-31 18:49:34 +00003709#ifndef EXPENSIVE_CHECKS
3710// Expensive checks enables libstdc++ checking which includes validating the
3711// state of ranges used in std::priority_queue - this blows out the
3712// runtime/scalability of the function and makes this test unacceptably slow.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003713TEST_F(FormatTest, MemoizationTests) {
3714 // This breaks if the memoization lookup does not take \c Indent and
3715 // \c LastSpace into account.
3716 verifyFormat(
3717 "extern CFRunLoopTimerRef\n"
3718 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3719 " CFTimeInterval interval, CFOptionFlags flags,\n"
3720 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003721 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003722
3723 // Deep nesting somewhat works around our memoization.
3724 verifyFormat(
3725 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3726 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3727 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3728 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3729 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3730 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003731 verifyFormat(
3732 "aaaaa(\n"
3733 " aaaaa,\n"
3734 " aaaaa(\n"
3735 " aaaaa,\n"
3736 " aaaaa(\n"
3737 " aaaaa,\n"
3738 " aaaaa(\n"
3739 " aaaaa,\n"
3740 " aaaaa(\n"
3741 " aaaaa,\n"
3742 " aaaaa(\n"
3743 " aaaaa,\n"
3744 " aaaaa(\n"
3745 " aaaaa,\n"
3746 " aaaaa(\n"
3747 " aaaaa,\n"
3748 " aaaaa(\n"
3749 " aaaaa,\n"
3750 " aaaaa(\n"
3751 " aaaaa,\n"
3752 " aaaaa(\n"
3753 " aaaaa,\n"
3754 " aaaaa(\n"
3755 " aaaaa,\n"
3756 " aaaaa))))))))))));",
3757 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003758 verifyFormat(
3759 "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"
3760 " a),\n"
3761 " a),\n"
3762 " a),\n"
3763 " a),\n"
3764 " a),\n"
3765 " a),\n"
3766 " a),\n"
3767 " a),\n"
3768 " a),\n"
3769 " a),\n"
3770 " a),\n"
3771 " a),\n"
3772 " a),\n"
3773 " a),\n"
3774 " a),\n"
3775 " a),\n"
3776 " a)",
3777 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003778
3779 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003780 FormatStyle OnePerLine = getLLVMStyle();
3781 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003782 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003783 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003784 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003785 for (unsigned i = 0, e = 80; i != e; ++i) {
3786 input += " a,\n";
3787 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003788 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003789 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003790}
David Blaikieea95dd72017-08-31 18:49:34 +00003791#endif
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003792
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003793TEST_F(FormatTest, BreaksAsHighAsPossible) {
3794 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003795 "void f() {\n"
3796 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3797 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3798 " f();\n"
3799 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003800 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003801 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003802}
3803
Daniel Jasper6728fc12013-04-11 14:29:13 +00003804TEST_F(FormatTest, BreaksFunctionDeclarations) {
3805 // Principially, we break function declarations in a certain order:
3806 // 1) break amongst arguments.
3807 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3808 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003809 verifyFormat("template <class TemplateIt>\n"
3810 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3811 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003812
3813 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003814 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003815 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003816 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003817 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003818
3819 // 3) break after (.
3820 verifyFormat(
3821 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003822 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3823 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003824
3825 // 4) break before after nested name specifiers.
3826 verifyFormat(
3827 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003828 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3829 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003830 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003831
3832 // However, there are exceptions, if a sufficient amount of lines can be
3833 // saved.
3834 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3835 // more adjusting.
3836 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3837 " Cccccccccccccc cccccccccc,\n"
3838 " Cccccccccccccc cccccccccc,\n"
3839 " Cccccccccccccc cccccccccc,\n"
3840 " Cccccccccccccc cccccccccc);");
3841 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003842 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003843 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3844 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3845 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003846 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003847 verifyFormat(
3848 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3849 " Cccccccccccccc cccccccccc,\n"
3850 " Cccccccccccccc cccccccccc,\n"
3851 " Cccccccccccccc cccccccccc,\n"
3852 " Cccccccccccccc cccccccccc,\n"
3853 " Cccccccccccccc cccccccccc,\n"
3854 " Cccccccccccccc cccccccccc);");
3855 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3856 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3857 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3858 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3859 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003860
3861 // Break after multi-line parameters.
3862 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3863 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3864 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3865 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003866 verifyFormat("void SomeLoooooooooooongFunction(\n"
3867 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3868 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3869 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003870
3871 // Treat overloaded operators like other functions.
3872 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3873 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003874 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3875 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003876 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3877 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3878 verifyGoogleFormat(
3879 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3880 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003881 verifyGoogleFormat(
3882 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3883 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003884 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3885 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3886 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3887 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003888 verifyGoogleFormat(
3889 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3890 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3891 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003892 verifyGoogleFormat(
3893 "template <typename T>\n"
3894 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3895 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3896 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003897
3898 FormatStyle Style = getLLVMStyle();
3899 Style.PointerAlignment = FormatStyle::PAS_Left;
3900 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3901 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3902 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003903 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3904 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3905 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003906}
3907
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003908TEST_F(FormatTest, TrailingReturnType) {
3909 verifyFormat("auto foo() -> int;\n");
3910 verifyFormat("struct S {\n"
3911 " auto bar() const -> int;\n"
3912 "};");
3913 verifyFormat("template <size_t Order, typename T>\n"
3914 "auto load_img(const std::string &filename)\n"
3915 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003916 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3917 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003918 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003919 verifyFormat("template <typename T>\n"
3920 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3921 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003922
3923 // Not trailing return types.
3924 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003925}
3926
Daniel Jasper5be31f72013-05-21 09:16:31 +00003927TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003928 // Avoid breaking before trailing 'const' or other trailing annotations, if
3929 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003930 FormatStyle Style = getGoogleStyle();
3931 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003932 verifyFormat("void someLongFunction(\n"
3933 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003934 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003935 verifyFormat("LoooooongReturnType\n"
3936 "someLoooooooongFunction() const {}",
3937 getLLVMStyleWithColumns(47));
3938 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3939 " const {}",
3940 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003941 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3942 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3943 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3944 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3945 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3946 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003947 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3948 " aaaaaaaaaaa aaaaa) const override;");
3949 verifyGoogleFormat(
3950 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3951 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003952
Daniel Jasper5550de62014-02-17 07:57:46 +00003953 // Even if the first parameter has to be wrapped.
3954 verifyFormat("void someLongFunction(\n"
3955 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003956 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003957 verifyFormat("void someLongFunction(\n"
3958 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003959 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003960 verifyFormat("void someLongFunction(\n"
3961 " int someLongParameter) override {}",
3962 Style);
3963 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003964 " int someLongParameter) OVERRIDE {}",
3965 Style);
3966 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003967 " int someLongParameter) final {}",
3968 Style);
3969 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003970 " int someLongParameter) FINAL {}",
3971 Style);
3972 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003973 " int parameter) const override {}",
3974 Style);
3975
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003976 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3977 verifyFormat("void someLongFunction(\n"
3978 " int someLongParameter) const\n"
3979 "{\n"
3980 "}",
3981 Style);
3982
Daniel Jasper5550de62014-02-17 07:57:46 +00003983 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003984 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3985 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3986 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003987
3988 // Breaking before function-like trailing annotations is fine to keep them
3989 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003990 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3991 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3992 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3993 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3994 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3995 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003996 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3997 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003998 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003999
4000 verifyFormat(
4001 "void aaaaaaaaaaaaaaaaaa()\n"
4002 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4003 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4004 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4005 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004006 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004007 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004008 " GUARDED_BY(aaaaaaaaaaaa);");
4009 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004010 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004011 " GUARDED_BY(aaaaaaaaaaaa);");
4012 verifyGoogleFormat(
4013 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4014 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004015 verifyGoogleFormat(
4016 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4017 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004018}
4019
Daniel Jasperf090f032015-05-18 09:47:22 +00004020TEST_F(FormatTest, FunctionAnnotations) {
4021 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004022 "int OldFunction(const string &parameter) {}");
4023 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004024 "string OldFunction(const string &parameter) {}");
4025 verifyFormat("template <typename T>\n"
4026 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4027 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004028
4029 // Not function annotations.
4030 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4031 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004032 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4033 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004034 verifyFormat("MACRO(abc).function() // wrap\n"
4035 " << abc;");
4036 verifyFormat("MACRO(abc)->function() // wrap\n"
4037 " << abc;");
4038 verifyFormat("MACRO(abc)::function() // wrap\n"
4039 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004040}
4041
Daniel Jasperf7935112012-12-03 18:12:45 +00004042TEST_F(FormatTest, BreaksDesireably) {
4043 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4044 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004045 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004046 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4047 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4048 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004049
4050 verifyFormat(
4051 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004052 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004053
4054 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4055 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4056 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004057
4058 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004059 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4060 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4061 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004062 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004064
4065 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4066 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4067
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004068 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004069 "void f() {\n"
4070 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4071 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4072 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004073 verifyFormat(
4074 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4075 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4076 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004077 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4078 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4079 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004080 "aaaaaa(aaa,\n"
4081 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004082 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4083 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004084 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4085 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4086 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004087
Daniel Jasper739b85f2015-06-29 10:42:59 +00004088 // Indent consistently independent of call expression and unary operator.
4089 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4090 " dddddddddddddddddddddddddddddd));");
4091 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4092 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004093 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004094 " dddddddddddddddddddddddddddddd));");
4095
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004096 // This test case breaks on an incorrect memoization, i.e. an optimization not
4097 // taking into account the StopAt value.
4098 verifyFormat(
4099 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004100 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4101 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4102 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004103
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004104 verifyFormat("{\n {\n {\n"
4105 " Annotation.SpaceRequiredBefore =\n"
4106 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4107 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4108 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004109
4110 // Break on an outer level if there was a break on an inner level.
4111 EXPECT_EQ("f(g(h(a, // comment\n"
4112 " b, c),\n"
4113 " d, e),\n"
4114 " x, y);",
4115 format("f(g(h(a, // comment\n"
4116 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004117
4118 // Prefer breaking similar line breaks.
4119 verifyFormat(
4120 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4121 " NSTrackingMouseEnteredAndExited |\n"
4122 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004123}
4124
Daniel Jasper18210d72014-10-09 09:52:05 +00004125TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4126 FormatStyle NoBinPacking = getGoogleStyle();
4127 NoBinPacking.BinPackParameters = false;
4128 NoBinPacking.BinPackArguments = true;
4129 verifyFormat("void f() {\n"
4130 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4131 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4132 "}",
4133 NoBinPacking);
4134 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4135 " int aaaaaaaaaaaaaaaaaaaa,\n"
4136 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4137 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004138
Daniel Jasper00693b082016-01-09 15:56:47 +00004139 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4140 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4141 " vector<int> bbbbbbbbbbbbbbb);",
4142 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004143 // FIXME: This behavior difference is probably not wanted. However, currently
4144 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4145 // template arguments from BreakBeforeParameter being set because of the
4146 // one-per-line formatting.
4147 verifyFormat(
4148 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4149 " aaaaaaaaaa> aaaaaaaaaa);",
4150 NoBinPacking);
4151 verifyFormat(
4152 "void fffffffffff(\n"
4153 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4154 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004155}
4156
Daniel Jasper9278eb92013-01-16 14:59:02 +00004157TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004158 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004159 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004160 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004161 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4162 " aaaaaaaaaaaaaaaaaaaa,\n"
4163 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4164 NoBinPacking);
4165 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4166 " aaaaaaaaaaaaa,\n"
4167 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4168 NoBinPacking);
4169 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004170 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4171 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4172 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4173 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4175 NoBinPacking);
4176 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4177 " .aaaaaaaaaaaaaaaaaa();",
4178 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004179 verifyFormat("void f() {\n"
4180 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4181 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4182 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004183 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004184
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004185 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004186 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4187 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004188 " aaaaaaaaaaaa);",
4189 NoBinPacking);
4190 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004191 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4192 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004193 " test);",
4194 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004195
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004196 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4197 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004198 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4199 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004200 NoBinPacking);
4201 verifyFormat("a(\"a\"\n"
4202 " \"a\",\n"
4203 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004204
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004205 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004206 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004207 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004208 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004209 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004210 verifyFormat(
4211 "void f() {\n"
4212 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4213 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004214 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004215 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004216 verifyFormat(
4217 "template <class SomeType, class SomeOtherType>\n"
4218 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4219 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004220}
4221
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004222TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4223 FormatStyle Style = getLLVMStyleWithColumns(15);
4224 Style.ExperimentalAutoDetectBinPacking = true;
4225 EXPECT_EQ("aaa(aaaa,\n"
4226 " aaaa,\n"
4227 " aaaa);\n"
4228 "aaa(aaaa,\n"
4229 " aaaa,\n"
4230 " aaaa);",
4231 format("aaa(aaaa,\n" // one-per-line
4232 " aaaa,\n"
4233 " aaaa );\n"
4234 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4235 Style));
4236 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4237 " aaaa);\n"
4238 "aaa(aaaa, aaaa,\n"
4239 " aaaa);",
4240 format("aaa(aaaa, aaaa,\n" // bin-packed
4241 " aaaa );\n"
4242 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4243 Style));
4244}
4245
Daniel Jasper04468962013-01-18 10:56:38 +00004246TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004247 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4248 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4249 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4250 " .StartsWith(\".init\", ORDER_INIT)\n"
4251 " .StartsWith(\".fini\", ORDER_FINI)\n"
4252 " .StartsWith(\".hash\", ORDER_HASH)\n"
4253 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004254
Daniel Jaspereb50c672013-02-15 20:33:06 +00004255 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004256 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004257 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004258 "aaaaaaa->aaaaaaa\n"
4259 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4260 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004261 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004262 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004263 "aaaaaaa->aaaaaaa\n"
4264 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4265 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4266 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004267 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004268 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004269 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004270 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4271 " aaaaaa->aaaaaaaaaaaa()\n"
4272 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004273 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004274 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004275 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004276 "void f() {\n"
4277 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004278 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004279 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004280 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004281 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004282 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004283 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004284 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004285 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004286 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004287 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004288 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004289
4290 verifyFormat(
4291 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4292 verifyFormat("aaaaaaaaaaaaaaa()\n"
4293 " .aaaaaaaaaaaaaaa()\n"
4294 " .aaaaaaaaaaaaaaa()\n"
4295 " .aaaaaaaaaaaaaaa()\n"
4296 " .aaaaaaaaaaaaaaa();");
4297 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4298 " .aaaaaaaaaaaaaaa()\n"
4299 " .aaaaaaaaaaaaaaa()\n"
4300 " .aaaaaaaaaaaaaaa();");
4301 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4302 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4303 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004304 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4305 " ->aaaaaaaaaaaaaae(0)\n"
4306 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004307
Daniel Jasper775954b2015-04-24 10:08:09 +00004308 // Don't linewrap after very short segments.
4309 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4310 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4311 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4312 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4313 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4314 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4315 verifyFormat("aaa()\n"
4316 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4317 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4318 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4319
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004320 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4321 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4322 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4323 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4324 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004325 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004326
Daniel Jaspera41aa532014-09-19 08:01:25 +00004327 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004328 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4329 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004330
4331 // Prefer not to create "hanging" indents.
4332 verifyFormat(
4333 "return !soooooooooooooome_map\n"
4334 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4335 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004336 verifyFormat(
4337 "return aaaaaaaaaaaaaaaa\n"
4338 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4339 " .aaaa(aaaaaaaaaaaaaa);");
4340 // No hanging indent here.
4341 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4342 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4343 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4344 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004345 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4346 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4347 getLLVMStyleWithColumns(60));
4348 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4349 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4350 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4351 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004352 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4353 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4354 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004355}
4356
Daniel Jasperde5c2072012-12-24 00:13:23 +00004357TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4358 verifyFormat(
4359 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004360 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004361 verifyFormat(
4362 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4363 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4364
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004365 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004366 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004367 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4368 " ccccccccccccccccccccccccc) {\n}");
4369
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004370 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004371 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004372 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4373 " ccccccccccccccccccccccccc) {\n}");
4374
Daniel Jasperde5c2072012-12-24 00:13:23 +00004375 verifyFormat(
4376 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004377 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004378 verifyFormat(
4379 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4380 " ccccccccccccccccccccccccc) {\n}");
4381
Daniel Jasper400adc62013-02-08 15:28:42 +00004382 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4383 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4384 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4385 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004386 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4387 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4388 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4389 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4390
Daniel Jasper400adc62013-02-08 15:28:42 +00004391 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4392 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4393 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004394 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4395 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4396 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004397}
4398
Daniel Jasper43b65482013-01-23 12:27:43 +00004399TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004400 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004401 "unsigned Cost =\n"
4402 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4403 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004404 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004405 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4406 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004407
4408 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004409 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4410 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004411 verifyFormat("unsigned OriginalStartColumn =\n"
4412 " SourceMgr.getSpellingColumnNumber(\n"
4413 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4414 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004415}
4416
Francois Ferrand9976efa2017-05-22 08:28:17 +00004417TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4418 FormatStyle Style = getLLVMStyle();
4419 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4420 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4421 Style);
4422
4423 Style.PenaltyBreakAssignment = 20;
4424 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4425 " cccccccccccccccccccccccccc;",
4426 Style);
4427}
4428
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004429TEST_F(FormatTest, AlignsAfterAssignments) {
4430 verifyFormat(
4431 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004432 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004433 verifyFormat(
4434 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004435 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004436 verifyFormat(
4437 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004438 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004439 verifyFormat(
4440 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004441 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004442 verifyFormat(
4443 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4444 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4445 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004446}
4447
4448TEST_F(FormatTest, AlignsAfterReturn) {
4449 verifyFormat(
4450 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4451 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4452 verifyFormat(
4453 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4454 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004455 verifyFormat(
4456 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004457 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004458 verifyFormat(
4459 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004460 " aaaaaaaaaaaaaaaaaaaaaa());");
4461 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4462 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4463 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4464 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4465 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004466 verifyFormat("return\n"
4467 " // true if code is one of a or b.\n"
4468 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004469}
4470
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004471TEST_F(FormatTest, AlignsAfterOpenBracket) {
4472 verifyFormat(
4473 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4474 " aaaaaaaaa aaaaaaa) {}");
4475 verifyFormat(
4476 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4477 " aaaaaaaaaaa aaaaaaaaa);");
4478 verifyFormat(
4479 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4480 " aaaaaaaaaaaaaaaaaaaaa));");
4481 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004482 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004483 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4484 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4485 Style);
4486 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4487 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4488 Style);
4489 verifyFormat("SomeLongVariableName->someFunction(\n"
4490 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4491 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004492 verifyFormat(
4493 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4494 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4495 Style);
4496 verifyFormat(
4497 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4498 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4499 Style);
4500 verifyFormat(
4501 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4502 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4503 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004504
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004505 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4506 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4507 " b));",
4508 Style);
4509
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004510 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4511 Style.BinPackArguments = false;
4512 Style.BinPackParameters = false;
4513 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4514 " aaaaaaaaaaa aaaaaaaa,\n"
4515 " aaaaaaaaa aaaaaaa,\n"
4516 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4517 Style);
4518 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4519 " aaaaaaaaaaa aaaaaaaaa,\n"
4520 " aaaaaaaaaaa aaaaaaaaa,\n"
4521 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4522 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004523 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4524 " aaaaaaaaaaaaaaa,\n"
4525 " aaaaaaaaaaaaaaaaaaaaa,\n"
4526 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004527 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004528 verifyFormat(
4529 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4530 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4531 Style);
4532 verifyFormat(
4533 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4534 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4535 Style);
4536 verifyFormat(
4537 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4538 " aaaaaaaaaaaaaaaaaaaaa(\n"
4539 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4540 " aaaaaaaaaaaaaaaa);",
4541 Style);
4542 verifyFormat(
4543 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4544 " aaaaaaaaaaaaaaaaaaaaa(\n"
4545 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4546 " aaaaaaaaaaaaaaaa);",
4547 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004548}
4549
Daniel Jasper3219e432014-12-02 13:24:51 +00004550TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4551 FormatStyle Style = getLLVMStyleWithColumns(40);
4552 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4553 " bbbbbbbbbbbbbbbbbbbbbb);",
4554 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004555 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004556 Style.AlignOperands = false;
4557 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4558 " bbbbbbbbbbbbbbbbbbbbbb);",
4559 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004560 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004561 Style.AlignOperands = true;
4562 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4563 " bbbbbbbbbbbbbbbbbbbbbb);",
4564 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004565 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004566 Style.AlignOperands = false;
4567 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4568 " bbbbbbbbbbbbbbbbbbbbbb);",
4569 Style);
4570}
4571
Daniel Jasper399d24b2013-01-09 07:06:56 +00004572TEST_F(FormatTest, BreaksConditionalExpressions) {
4573 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004574 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4575 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4576 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4577 verifyFormat(
4578 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004579 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4580 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004581 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004582 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4583 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4584 verifyFormat(
4585 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004586 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4587 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004588 verifyFormat(
4589 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4590 " : aaaaaaaaaaaaa);");
4591 verifyFormat(
4592 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004593 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004594 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4595 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004596 verifyFormat(
4597 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4598 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4599 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004600 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4601 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4602 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4603 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4604 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4605 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4606 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4607 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4608 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4609 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4610 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4611 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004612 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4613 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4614 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4615 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4616 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004617 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4618 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4619 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004620 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4621 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4622 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4623 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004624 verifyFormat(
4625 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4626 " ? aaaaaaaaaaaaaaa\n"
4627 " : aaaaaaaaaaaaaaa;");
4628 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004629 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004630 " ? b\n"
4631 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004632 verifyFormat("return aaaa == bbbb\n"
4633 " // comment\n"
4634 " ? aaaa\n"
4635 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004636 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004637 " format(TheLine.First,\n"
4638 " IndentForLevel[TheLine.Level] >= 0\n"
4639 " ? IndentForLevel[TheLine.Level]\n"
4640 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004641 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004642 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004643 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4644 " ? aaaaaaaaaaaaaaa\n"
4645 " : bbbbbbbbbbbbbbb //\n"
4646 " ? ccccccccccccccc\n"
4647 " : ddddddddddddddd;");
4648 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4649 " ? aaaaaaaaaaaaaaa\n"
4650 " : (bbbbbbbbbbbbbbb //\n"
4651 " ? ccccccccccccccc\n"
4652 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004653 verifyFormat(
4654 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4655 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4656 " aaaaaaaaaaaaaaaaaaaaa +\n"
4657 " aaaaaaaaaaaaaaaaaaaaa\n"
4658 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004659 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004660 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4661 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4662 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004663
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004664 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004665 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004666 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004667 "void f() {\n"
4668 " g(aaa,\n"
4669 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4670 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4671 " ? aaaaaaaaaaaaaaa\n"
4672 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004673 "}",
4674 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004675 verifyFormat(
4676 "void f() {\n"
4677 " g(aaa,\n"
4678 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4679 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4680 " ?: aaaaaaaaaaaaaaa);\n"
4681 "}",
4682 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004683
4684 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4685 " // comment.\n"
4686 " ccccccccccccccccccccccccccccccccccccccc\n"
4687 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4688 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004689
4690 // Assignments in conditional expressions. Apparently not uncommon :-(.
4691 verifyFormat("return a != b\n"
4692 " // comment\n"
4693 " ? a = b\n"
4694 " : a = b;");
4695 verifyFormat("return a != b\n"
4696 " // comment\n"
4697 " ? a = a != b\n"
4698 " // comment\n"
4699 " ? a = b\n"
4700 " : a\n"
4701 " : a;\n");
4702 verifyFormat("return a != b\n"
4703 " // comment\n"
4704 " ? a\n"
4705 " : a = a != b\n"
4706 " // comment\n"
4707 " ? a = b\n"
4708 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004709}
4710
Daniel Jasper165b29e2013-11-08 00:57:11 +00004711TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4712 FormatStyle Style = getLLVMStyle();
4713 Style.BreakBeforeTernaryOperators = false;
4714 Style.ColumnLimit = 70;
4715 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004716 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4717 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4718 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4719 Style);
4720 verifyFormat(
4721 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004722 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4723 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004724 Style);
4725 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004726 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4727 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4728 Style);
4729 verifyFormat(
4730 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004731 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4732 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004733 Style);
4734 verifyFormat(
4735 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4736 " aaaaaaaaaaaaa);",
4737 Style);
4738 verifyFormat(
4739 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4740 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4741 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4742 " aaaaaaaaaaaaa);",
4743 Style);
4744 verifyFormat(
4745 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4746 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4747 " aaaaaaaaaaaaa);",
4748 Style);
4749 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4750 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4752 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4753 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4754 Style);
4755 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4756 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4757 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4758 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4759 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4760 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4761 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4762 Style);
4763 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4764 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4765 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4766 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4767 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4768 Style);
4769 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4770 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4771 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4772 Style);
4773 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004774 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004775 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4776 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4777 Style);
4778 verifyFormat(
4779 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4780 " aaaaaaaaaaaaaaa :\n"
4781 " aaaaaaaaaaaaaaa;",
4782 Style);
4783 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4784 " aaaaaaaaa ?\n"
4785 " b :\n"
4786 " c);",
4787 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004788 verifyFormat("unsigned Indent =\n"
4789 " format(TheLine.First,\n"
4790 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4791 " IndentForLevel[TheLine.Level] :\n"
4792 " TheLine * 2,\n"
4793 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4794 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004795 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4796 " aaaaaaaaaaaaaaa :\n"
4797 " bbbbbbbbbbbbbbb ? //\n"
4798 " ccccccccccccccc :\n"
4799 " ddddddddddddddd;",
4800 Style);
4801 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4802 " aaaaaaaaaaaaaaa :\n"
4803 " (bbbbbbbbbbbbbbb ? //\n"
4804 " ccccccccccccccc :\n"
4805 " ddddddddddddddd);",
4806 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004807 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4808 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4809 " ccccccccccccccccccccccccccc;",
4810 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004811 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4812 " aaaaa :\n"
4813 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4814 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004815}
4816
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004817TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4818 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4819 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4820 verifyFormat("bool a = true, b = false;");
4821
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004822 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004823 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004824 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004825 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004826 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004827 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004828 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004829 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004830 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4831 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4832 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4833 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4834 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4835 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004836
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004837 FormatStyle Style = getGoogleStyle();
4838 Style.PointerAlignment = FormatStyle::PAS_Left;
4839 Style.DerivePointerAlignment = false;
4840 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4841 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4842 " *b = bbbbbbbbbbbbbbbbbbb;",
4843 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004844 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4845 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4846 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004847 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004848 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004849}
4850
Nico Weber4a5030c2013-01-12 01:28:06 +00004851TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4852 verifyFormat("arr[foo ? bar : baz];");
4853 verifyFormat("f()[foo ? bar : baz];");
4854 verifyFormat("(a + b)[foo ? bar : baz];");
4855 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4856}
4857
Daniel Jasperf7935112012-12-03 18:12:45 +00004858TEST_F(FormatTest, AlignsStringLiterals) {
4859 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4860 " \"short literal\");");
4861 verifyFormat(
4862 "looooooooooooooooooooooooongFunction(\n"
4863 " \"short literal\"\n"
4864 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004865 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4866 " \" string literals\",\n"
4867 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004868 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4869 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004870 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004871 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004872 getLLVMStyleWithColumns(28)));
4873 EXPECT_EQ(
4874 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4875 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4876 " \"aaaaaaaaaaaaaaaa\";",
4877 format("aaaaaa ="
4878 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4879 "aaaaaaaaaaaaaaaaaaaaa\" "
4880 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004881 verifyFormat("a = a + \"a\"\n"
4882 " \"a\"\n"
4883 " \"a\";");
4884 verifyFormat("f(\"a\", \"b\"\n"
4885 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004886
4887 verifyFormat(
4888 "#define LL_FORMAT \"ll\"\n"
4889 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4890 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004891
4892 verifyFormat("#define A(X) \\\n"
4893 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4894 " \"ccccc\"",
4895 getLLVMStyleWithColumns(23));
4896 verifyFormat("#define A \"def\"\n"
4897 "f(\"abc\" A \"ghi\"\n"
4898 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004899
4900 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004901 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004902 verifyFormat("#define A(X) \\\n"
4903 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4904 " L\"ccccc\"",
4905 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004906
4907 verifyFormat("f(@\"a\"\n"
4908 " @\"b\");");
4909 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004910 " @\"b\"\n"
4911 " @\"c\";");
4912 verifyFormat("NSString s = @\"a\"\n"
4913 " \"b\"\n"
4914 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004915}
4916
Zachary Turner448592e2015-12-18 22:20:15 +00004917TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004918 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004919 // No declarations or definitions should be moved to own line.
4920 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4921 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004922 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004923 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004924 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004925 "int f() { return 1; }\n"
4926 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004927 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004928
4929 // All declarations and definitions should have the return type moved to its
4930 // own
4931 // line.
4932 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4933 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004934 " int\n"
4935 " f() {\n"
4936 " return 1;\n"
4937 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004938 " int\n"
4939 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004940 "};\n"
4941 "int\n"
4942 "f() {\n"
4943 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004944 "}\n"
4945 "int\n"
4946 "g();\n",
4947 Style);
4948
4949 // Top-level definitions, and no kinds of declarations should have the
4950 // return type moved to its own line.
4951 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4952 verifyFormat("class B {\n"
4953 " int f() { return 1; }\n"
4954 " int g();\n"
4955 "};\n"
4956 "int\n"
4957 "f() {\n"
4958 " return 1;\n"
4959 "}\n"
4960 "int g();\n",
4961 Style);
4962
4963 // Top-level definitions and declarations should have the return type moved
4964 // to its own line.
4965 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4966 verifyFormat("class C {\n"
4967 " int f() { return 1; }\n"
4968 " int g();\n"
4969 "};\n"
4970 "int\n"
4971 "f() {\n"
4972 " return 1;\n"
4973 "}\n"
4974 "int\n"
4975 "g();\n",
4976 Style);
4977
4978 // All definitions should have the return type moved to its own line, but no
4979 // kinds of declarations.
4980 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4981 verifyFormat("class D {\n"
4982 " int\n"
4983 " f() {\n"
4984 " return 1;\n"
4985 " }\n"
4986 " int g();\n"
4987 "};\n"
4988 "int\n"
4989 "f() {\n"
4990 " return 1;\n"
4991 "}\n"
4992 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004993 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004994 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004995 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004996 " return \"\";\n"
4997 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004998 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004999 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005000 verifyFormat("template <class T>\n"
5001 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005002 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005003 " return NULL;\n"
5004 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005005 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005006 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005007 verifyFormat("class C {\n"
5008 " int\n"
5009 " operator+() {\n"
5010 " return 1;\n"
5011 " }\n"
5012 " int\n"
5013 " operator()() {\n"
5014 " return 1;\n"
5015 " }\n"
5016 "};\n",
5017 Style);
5018 verifyFormat("void\n"
5019 "A::operator()() {}\n"
5020 "void\n"
5021 "A::operator>>() {}\n"
5022 "void\n"
5023 "A::operator+() {}\n",
5024 Style);
5025 verifyFormat("void *operator new(std::size_t s);", // No break here.
5026 Style);
5027 verifyFormat("void *\n"
5028 "operator new(std::size_t s) {}",
5029 Style);
5030 verifyFormat("void *\n"
5031 "operator delete[](void *ptr) {}",
5032 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005033 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005034 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005035 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005036 "{\n"
5037 " return \"\";\n"
5038 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005039 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005040 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005041 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005042 "T *\n" // Problem here: no line break
5043 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005044 "{\n"
5045 " return NULL;\n"
5046 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005047 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005048 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005049}
5050
Alexander Kornienko58611712013-07-04 12:02:44 +00005051TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5052 FormatStyle NoBreak = getLLVMStyle();
5053 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5054 FormatStyle Break = getLLVMStyle();
5055 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005056 verifyFormat("aaaa = \"bbbb\"\n"
5057 " \"cccc\";",
5058 NoBreak);
5059 verifyFormat("aaaa =\n"
5060 " \"bbbb\"\n"
5061 " \"cccc\";",
5062 Break);
5063 verifyFormat("aaaa(\"bbbb\"\n"
5064 " \"cccc\");",
5065 NoBreak);
5066 verifyFormat("aaaa(\n"
5067 " \"bbbb\"\n"
5068 " \"cccc\");",
5069 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005070 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5071 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005072 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005073 verifyFormat("aaaa(qqq,\n"
5074 " \"bbbb\"\n"
5075 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005076 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005077 verifyFormat("aaaa(qqq,\n"
5078 " L\"bbbb\"\n"
5079 " L\"cccc\");",
5080 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005081 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5082 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005083 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005084 verifyFormat("string s = someFunction(\n"
5085 " \"abc\"\n"
5086 " \"abc\");",
5087 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005088
Daniel Jasper3251fff2014-06-10 06:27:23 +00005089 // As we break before unary operators, breaking right after them is bad.
5090 verifyFormat("string foo = abc ? \"x\"\n"
5091 " \"blah blah blah blah blah blah\"\n"
5092 " : \"y\";",
5093 Break);
5094
Daniel Jasperc834c702013-07-17 15:38:19 +00005095 // Don't break if there is no column gain.
5096 verifyFormat("f(\"aaaa\"\n"
5097 " \"bbbb\");",
5098 Break);
5099
5100 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005101 EXPECT_EQ("x = \"a\\\n"
5102 "b\\\n"
5103 "c\";",
5104 format("x = \"a\\\n"
5105 "b\\\n"
5106 "c\";",
5107 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005108 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005109 " \"a\\\n"
5110 "b\\\n"
5111 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005112 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005113 "b\\\n"
5114 "c\";",
5115 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005116
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00005117 EXPECT_EQ("NSString *const kString =\n"
5118 " @\"aaaa\"\n"
5119 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005120 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005121 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005122 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005123
5124 Break.ColumnLimit = 0;
5125 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005126}
5127
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005128TEST_F(FormatTest, AlignsPipes) {
5129 verifyFormat(
5130 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5131 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5132 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5133 verifyFormat(
5134 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5135 " << aaaaaaaaaaaaaaaaaaaa;");
5136 verifyFormat(
5137 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5138 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5139 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005140 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5141 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5142 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005143 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5144 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5145 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5146 verifyFormat(
5147 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5148 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5149 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005150 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5151 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5152 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5153 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005154 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5155 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005156 verifyFormat(
5157 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5158 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00005159 verifyFormat(
5160 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5161 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005162
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005163 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5164 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005165 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5166 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5167 " aaaaaaaaaaaaaaaaaaaaa)\n"
5168 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005169 verifyFormat("LOG_IF(aaa == //\n"
5170 " bbb)\n"
5171 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005172
Daniel Jasper467ddb12013-08-12 12:58:05 +00005173 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005174 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5175 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005176 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5177 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5178 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005179 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5180 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005181 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5182 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5183 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5184 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5185 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5186 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5187 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005188
Daniel Jasperc238c872013-04-02 14:33:13 +00005189 verifyFormat(
5190 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5191 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005192
5193 // Incomplete string literal.
5194 EXPECT_EQ("llvm::errs() << \"\n"
5195 " << a;",
5196 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005197
5198 verifyFormat("void f() {\n"
5199 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5200 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5201 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005202
5203 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005204 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5205 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5206 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005207
5208 // Handle '\n'.
5209 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5210 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5211 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5212 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5213 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5214 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5215 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005216}
5217
Daniel Jasper7209bb92016-12-13 11:16:42 +00005218TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5219 verifyFormat("return out << \"somepacket = {\\n\"\n"
5220 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5221 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5222 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5223 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5224 " << \"}\";");
5225
5226 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5227 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5228 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5229 verifyFormat(
5230 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5231 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5232 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5233 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5234 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5235 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5236 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5237 verifyFormat(
5238 "void f() {\n"
5239 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5240 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5241 "}");
5242
5243 // Breaking before the first "<<" is generally not desirable.
5244 verifyFormat(
5245 "llvm::errs()\n"
5246 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5247 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5248 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5249 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5250 getLLVMStyleWithColumns(70));
5251 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5252 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5253 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5254 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5255 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5256 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5257 getLLVMStyleWithColumns(70));
5258
5259 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5260 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5261 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5262 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5263 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5264 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005265 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5266 " (aaaa + aaaa);",
5267 getLLVMStyleWithColumns(40));
5268 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5269 " (aaaaaaa + aaaaa));",
5270 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005271 verifyFormat(
5272 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5273 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5274 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005275}
5276
Daniel Jasperf7935112012-12-03 18:12:45 +00005277TEST_F(FormatTest, UnderstandsEquals) {
5278 verifyFormat(
5279 "aaaaaaaaaaaaaaaaa =\n"
5280 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5281 verifyFormat(
5282 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005283 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005284 verifyFormat(
5285 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005286 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005287 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005288 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5289 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005290
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005291 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5292 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005293}
5294
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005295TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005296 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5297 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005298
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005299 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5300 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005301
5302 verifyFormat(
5303 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5304 " Parameter2);");
5305
5306 verifyFormat(
5307 "ShortObject->shortFunction(\n"
5308 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5309 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5310
5311 verifyFormat("loooooooooooooongFunction(\n"
5312 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5313
5314 verifyFormat(
5315 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5316 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5317
Daniel Jasper687af3b2013-02-14 14:26:07 +00005318 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5319 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005320 verifyFormat("void f() {\n"
5321 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5322 " .Times(2)\n"
5323 " .WillRepeatedly(Return(SomeValue));\n"
5324 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005325 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5326 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005327 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005328 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5329 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005330 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005331 verifyFormat("void f() {\n"
5332 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5333 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5334 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005335 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5336 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5337 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5338 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5339 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005340 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5341 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5342 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5343 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5344 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005345
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005346 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005347 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005348 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005349 verifyFormat(
5350 "aaaaaaaaaaa->aaaaaaaaa(\n"
5351 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5352 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005353
5354 verifyFormat(
5355 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5356 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005357 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5358 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5359 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5360 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005361
Daniel Jasper9b334242013-03-15 14:57:30 +00005362 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005363 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5364 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005365
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005366 FormatStyle NoBinPacking = getLLVMStyle();
5367 NoBinPacking.BinPackParameters = false;
5368 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5369 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5370 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5371 " aaaaaaaaaaaaaaaaaaa,\n"
5372 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5373 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005374
5375 // If there is a subsequent call, change to hanging indentation.
5376 verifyFormat(
5377 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5378 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5379 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5380 verifyFormat(
5381 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5382 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005383 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5384 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5385 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5386 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5387 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5388 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005389}
5390
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005391TEST_F(FormatTest, WrapsTemplateDeclarations) {
5392 verifyFormat("template <typename T>\n"
5393 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005394 verifyFormat("template <typename T>\n"
5395 "// T should be one of {A, B}.\n"
5396 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005397 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005398 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005399 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005400 verifyFormat("template <typename T>\n"
5401 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5402 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005403 verifyFormat(
5404 "template <typename T>\n"
5405 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5406 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005407 verifyFormat(
5408 "template <typename T>\n"
5409 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5410 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5411 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005412 verifyFormat("template <typename T>\n"
5413 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005414 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005415 verifyFormat(
5416 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5417 " typename T4 = char>\n"
5418 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005419 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5420 " template <typename> class cccccccccccccccccccccc,\n"
5421 " typename ddddddddddddd>\n"
5422 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005423 verifyFormat(
5424 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5425 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005426
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005427 verifyFormat("void f() {\n"
5428 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5429 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5430 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005431
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005432 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005433 verifyFormat("template <typename T> void f();");
5434 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005435 verifyFormat(
5436 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5437 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5438 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5439 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5440 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5441 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5442 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5443 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005444 EXPECT_EQ("static_cast<A< //\n"
5445 " B> *>(\n"
5446 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00005447 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00005448 format("static_cast<A<//\n"
5449 " B>*>(\n"
5450 "\n"
5451 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005452 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5453 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005454
5455 FormatStyle AlwaysBreak = getLLVMStyle();
5456 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5457 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5458 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5459 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5460 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5461 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5462 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5463 verifyFormat("template <template <typename> class Fooooooo,\n"
5464 " template <typename> class Baaaaaaar>\n"
5465 "struct C {};",
5466 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005467 verifyFormat("template <typename T> // T can be A, B or C.\n"
5468 "struct C {};",
5469 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005470 verifyFormat("template <enum E> class A {\n"
5471 "public:\n"
5472 " E *f();\n"
5473 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005474}
5475
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005476TEST_F(FormatTest, WrapsTemplateParameters) {
5477 FormatStyle Style = getLLVMStyle();
5478 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5479 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5480 verifyFormat(
5481 "template <typename... a> struct q {};\n"
5482 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5483 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5484 " y;",
5485 Style);
5486 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5487 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5488 verifyFormat(
5489 "template <typename... a> struct r {};\n"
5490 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5491 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5492 " y;",
5493 Style);
5494 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5495 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5496 verifyFormat(
5497 "template <typename... a> struct s {};\n"
5498 "extern s<\n"
5499 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5500 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5501 " y;",
5502 Style);
5503 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5504 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5505 verifyFormat(
5506 "template <typename... a> struct t {};\n"
5507 "extern t<\n"
5508 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5509 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5510 " y;",
5511 Style);
5512}
5513
Daniel Jasper45797022013-01-25 10:57:27 +00005514TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5515 verifyFormat(
5516 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5517 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5518 verifyFormat(
5519 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5520 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5521 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5522
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005523 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005524 verifyFormat(
5525 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5526 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005527 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005528
Daniel Jasper45797022013-01-25 10:57:27 +00005529 verifyFormat(
5530 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005531 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005532
5533 // Breaking at nested name specifiers is generally not desirable.
5534 verifyFormat(
5535 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5536 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005537
5538 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005539 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5540 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5541 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005542 " aaaaaaaaaaaaaaaaaaaaa);",
5543 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005544
5545 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5546 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5547 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005548}
5549
Daniel Jasperf7935112012-12-03 18:12:45 +00005550TEST_F(FormatTest, UnderstandsTemplateParameters) {
5551 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005552 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005553 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5554 verifyFormat("bool x = a < 1 || 2 > a;");
5555 verifyFormat("bool x = 5 < f<int>();");
5556 verifyFormat("bool x = f<int>() > 5;");
5557 verifyFormat("bool x = 5 < a<int>::x;");
5558 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5559 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5560
5561 verifyGoogleFormat("A<A<int>> a;");
5562 verifyGoogleFormat("A<A<A<int>>> a;");
5563 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005564 verifyGoogleFormat("A<A<int> > a;");
5565 verifyGoogleFormat("A<A<A<int> > > a;");
5566 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005567 verifyGoogleFormat("A<::A<int>> a;");
5568 verifyGoogleFormat("A<::A> a;");
5569 verifyGoogleFormat("A< ::A> a;");
5570 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005571 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5572 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005573 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5574 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005575 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5576 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005577
Nico Weber7533b4d2014-09-24 17:17:32 +00005578 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5579
Daniel Jasperf7935112012-12-03 18:12:45 +00005580 verifyFormat("test >> a >> b;");
5581 verifyFormat("test << a >> b;");
5582
5583 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005584 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005585 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005586 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5587 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005588 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005589 verifyFormat("f(a.operator()<A>());");
5590 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5591 " .template operator()<A>());",
5592 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005593
5594 // Not template parameters.
5595 verifyFormat("return a < b && c > d;");
5596 verifyFormat("void f() {\n"
5597 " while (a < b && c > d) {\n"
5598 " }\n"
5599 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005600 verifyFormat("template <typename... Types>\n"
5601 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005602
5603 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5604 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5605 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005606 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005607 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005608 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005609}
5610
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005611TEST_F(FormatTest, BitshiftOperatorWidth) {
5612 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5613 " bar */",
5614 format("int a=1<<2; /* foo\n"
5615 " bar */"));
5616
5617 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5618 " bar */",
5619 format("int b =256>>1 ; /* foo\n"
5620 " bar */"));
5621}
5622
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005623TEST_F(FormatTest, UnderstandsBinaryOperators) {
5624 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005625 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005626}
5627
5628TEST_F(FormatTest, UnderstandsPointersToMembers) {
5629 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005630 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005631 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005632 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005633 verifyFormat("void f() {\n"
5634 " (a->*f)();\n"
5635 " a->*x;\n"
5636 " (a.*f)();\n"
5637 " ((*a).*f)();\n"
5638 " a.*x;\n"
5639 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005640 verifyFormat("void f() {\n"
5641 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5642 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5643 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005644 verifyFormat(
5645 "(aaaaaaaaaa->*bbbbbbb)(\n"
5646 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005647 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005648 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005649 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005650}
5651
Daniel Jasper8dd40472012-12-21 09:41:31 +00005652TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005653 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005654 verifyFormat("f(-1, -2, -3);");
5655 verifyFormat("a[-1] = 5;");
5656 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005657 verifyFormat("if (i == -1) {\n}");
5658 verifyFormat("if (i != -1) {\n}");
5659 verifyFormat("if (i > -1) {\n}");
5660 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005661 verifyFormat("++(a->f());");
5662 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005663 verifyFormat("(a->f())++;");
5664 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005665 verifyFormat("if (!(a->f())) {\n}");
Krasimir Georgiev446d6ec2018-03-06 13:56:28 +00005666 verifyFormat("if (!+i) {\n}");
5667 verifyFormat("~&a;");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005668
5669 verifyFormat("a-- > b;");
5670 verifyFormat("b ? -a : c;");
5671 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005672 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005673 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005674 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005675
5676 verifyFormat("return -1;");
5677 verifyFormat("switch (a) {\n"
5678 "case -1:\n"
5679 " break;\n"
5680 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005681 verifyFormat("#define X -1");
5682 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005683
Chandler Carruthf8b72662014-03-02 12:37:31 +00005684 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5685 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005686
5687 verifyFormat("int a = /* confusing comment */ -1;");
5688 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5689 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005690}
5691
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005692TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005693 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005694 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005695 "}");
5696 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005697 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005698 verifyFormat("*aaa = aaaaaaa( // break\n"
5699 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005700}
5701
Daniel Jasper8863ada2013-08-26 08:10:17 +00005702TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005703 verifyFormat("bool operator<();");
5704 verifyFormat("bool operator>();");
5705 verifyFormat("bool operator=();");
5706 verifyFormat("bool operator==();");
5707 verifyFormat("bool operator!=();");
5708 verifyFormat("int operator+();");
5709 verifyFormat("int operator++();");
Daniel Jasperbbf5f4e2017-11-06 12:11:51 +00005710 verifyFormat("int operator++(int) volatile noexcept;");
Daniel Jasper804a2762016-01-09 15:56:40 +00005711 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005712 verifyFormat("bool operator();");
5713 verifyFormat("bool operator()();");
5714 verifyFormat("bool operator[]();");
5715 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005716 verifyFormat("operator int();");
5717 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005718 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005719 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005720 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005721 verifyFormat("void *operator new(std::size_t size);");
5722 verifyFormat("void *operator new[](std::size_t size);");
5723 verifyFormat("void operator delete(void *ptr);");
5724 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005725 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5726 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005727 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005728 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005729
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005730 verifyFormat(
5731 "ostream &operator<<(ostream &OutputStream,\n"
5732 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005733 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5734 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5735 " return left.group < right.group;\n"
5736 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005737 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005738 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005739
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005740 verifyGoogleFormat("operator void*();");
5741 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005742 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005743
5744 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005745 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5746 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005747}
5748
Daniel Jasper1c220482015-02-25 10:30:06 +00005749TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005750 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5751 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5752 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5753 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5754 verifyFormat("Deleted &operator=(const Deleted &) &;");
5755 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5756 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5757 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5758 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5759 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5760 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005761 verifyFormat("void Fn(T const &) const &;");
5762 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005763 verifyFormat("template <typename T>\n"
5764 "void F(T) && = delete;",
5765 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005766
Daniel Jasperaf642c62015-08-25 13:40:51 +00005767 FormatStyle AlignLeft = getLLVMStyle();
5768 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005769 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005770 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5771 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5772 AlignLeft);
5773 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5774 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005775 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5776 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5777 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5778 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005779 verifyFormat("void Fn(T const&) const&;", AlignLeft);
5780 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005781
5782 FormatStyle Spaces = getLLVMStyle();
5783 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005784 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5785 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5786 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5787 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005788
5789 Spaces.SpacesInCStyleCastParentheses = false;
5790 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005791 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5792 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5793 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5794 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005795}
5796
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005797TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005798 verifyFormat("void f() {\n"
5799 " A *a = new A;\n"
5800 " A *a = new (placement) A;\n"
5801 " delete a;\n"
5802 " delete (A *)a;\n"
5803 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005804 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5805 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005806 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5807 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5808 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005809 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005810}
5811
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005812TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005813 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005814 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005815 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005816 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005817 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005818 verifyIndependentOfContext("int a = b * 10;");
5819 verifyIndependentOfContext("int a = 10 * b;");
5820 verifyIndependentOfContext("int a = b * c;");
5821 verifyIndependentOfContext("int a += b * c;");
5822 verifyIndependentOfContext("int a -= b * c;");
5823 verifyIndependentOfContext("int a *= b * c;");
5824 verifyIndependentOfContext("int a /= b * c;");
5825 verifyIndependentOfContext("int a = *b;");
5826 verifyIndependentOfContext("int a = *b * c;");
5827 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005828 verifyIndependentOfContext("int a = b * (10);");
5829 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005830 verifyIndependentOfContext("return 10 * b;");
5831 verifyIndependentOfContext("return *b * *c;");
5832 verifyIndependentOfContext("return a & ~b;");
5833 verifyIndependentOfContext("f(b ? *c : *d);");
5834 verifyIndependentOfContext("int a = b ? *c : *d;");
5835 verifyIndependentOfContext("*b = a;");
5836 verifyIndependentOfContext("a * ~b;");
5837 verifyIndependentOfContext("a * !b;");
5838 verifyIndependentOfContext("a * +b;");
5839 verifyIndependentOfContext("a * -b;");
5840 verifyIndependentOfContext("a * ++b;");
5841 verifyIndependentOfContext("a * --b;");
5842 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005843 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005844 verifyIndependentOfContext("f() * b;");
5845 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005846 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005847 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005848 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005849 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005850 verifyIndependentOfContext("return sizeof(int **);");
5851 verifyIndependentOfContext("return sizeof(int ******);");
5852 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005853 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005854 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005855 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005856 verifyGoogleFormat("return sizeof(int**);");
5857 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5858 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005859 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005860 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005861 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005862 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005863 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005864 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005865 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005866 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005867 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005868 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005869 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005870 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005871 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005872 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005873 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005874 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00005875 verifyFormat("void f(const MyOverride &override);");
5876 verifyFormat("void f(const MyFinal &final);");
5877 verifyIndependentOfContext("bool a = f() && override.f();");
5878 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00005879
Daniel Jasper5b49f472013-01-23 12:10:53 +00005880 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005881
Daniel Jasper5b49f472013-01-23 12:10:53 +00005882 verifyIndependentOfContext("A<int *> a;");
5883 verifyIndependentOfContext("A<int **> a;");
5884 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005885 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005886 verifyIndependentOfContext(
5887 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005888 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005889 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005890 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005891 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005892 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005893
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005894 verifyFormat(
5895 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5896 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5897
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005898 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005899 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005900 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005901 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005902 verifyGoogleFormat("A<int*> a;");
5903 verifyGoogleFormat("A<int**> a;");
5904 verifyGoogleFormat("A<int*, int*> a;");
5905 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005906 verifyGoogleFormat("f(b ? *c : *d);");
5907 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005908 verifyGoogleFormat("Type* t = **x;");
5909 verifyGoogleFormat("Type* t = *++*x;");
5910 verifyGoogleFormat("*++*x;");
5911 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5912 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005913 verifyGoogleFormat(
5914 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005915 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005916 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5917 verifyGoogleFormat("template <typename T>\n"
5918 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005919
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005920 FormatStyle Left = getLLVMStyle();
5921 Left.PointerAlignment = FormatStyle::PAS_Left;
5922 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005923 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005924 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00005925 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00005926 verifyFormat("delete *x;", Left);
5927 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
5928 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
5929 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005930
Daniel Jasper5b49f472013-01-23 12:10:53 +00005931 verifyIndependentOfContext("a = *(x + y);");
5932 verifyIndependentOfContext("a = &(x + y);");
5933 verifyIndependentOfContext("*(x + y).call();");
5934 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005935 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005936
Daniel Jasper5b49f472013-01-23 12:10:53 +00005937 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005938 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005939 "int *MyValues = {\n"
5940 " *A, // Operator detection might be confused by the '{'\n"
5941 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005942 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005943
Daniel Jasper5b49f472013-01-23 12:10:53 +00005944 verifyIndependentOfContext("if (int *a = &b)");
5945 verifyIndependentOfContext("if (int &a = *b)");
5946 verifyIndependentOfContext("if (a & b[i])");
5947 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5948 verifyIndependentOfContext("if (*b[i])");
5949 verifyIndependentOfContext("if (int *a = (&b))");
5950 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005951 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005952 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005953 verifyFormat("void f() {\n"
5954 " for (const int &v : Values) {\n"
5955 " }\n"
5956 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005957 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5958 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005959 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005960
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005961 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005962 verifyFormat("#define MACRO \\\n"
5963 " int *i = a * b; \\\n"
5964 " void f(a *b);",
5965 getLLVMStyleWithColumns(19));
5966
Daniel Jasper97b89482013-03-13 07:49:51 +00005967 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005968 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005969 verifyIndependentOfContext("T **t = new T *;");
5970 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005971 verifyGoogleFormat("A = new SomeType*[Length]();");
5972 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005973 verifyGoogleFormat("T** t = new T*;");
5974 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005975
Daniel Jaspera65e8872014-03-25 10:52:45 +00005976 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5977 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005978 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005979 "typename t::if<x && y>::type f() {}");
5980 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005981 verifyFormat("vector<int *> v;");
5982 verifyFormat("vector<int *const> v;");
5983 verifyFormat("vector<int *const **const *> v;");
5984 verifyFormat("vector<int *volatile> v;");
5985 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005986 verifyFormat("foo<b && false>();");
5987 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005988 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005989 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005990 "template <class T, class = typename std::enable_if<\n"
5991 " std::is_integral<T>::value &&\n"
5992 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
5993 "void F();",
5994 getLLVMStyleWithColumns(70));
5995 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005996 "template <class T,\n"
5997 " class = typename std::enable_if<\n"
5998 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005999 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
6000 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006001 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006002 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006003 verifyFormat(
6004 "template <class T,\n"
6005 " class = typename ::std::enable_if<\n"
6006 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6007 "void F();",
6008 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006009
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006010 verifyIndependentOfContext("MACRO(int *i);");
6011 verifyIndependentOfContext("MACRO(auto *a);");
6012 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00006013 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006014 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006015 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006016 // FIXME: Is there a way to make this work?
6017 // verifyIndependentOfContext("MACRO(A *a);");
6018
Daniel Jasper32ccb032014-06-23 07:36:18 +00006019 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006020 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006021
Daniel Jasper866468a2014-04-14 13:15:29 +00006022 EXPECT_EQ("#define OP(x) \\\n"
6023 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6024 " return s << a.DebugString(); \\\n"
6025 " }",
6026 format("#define OP(x) \\\n"
6027 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6028 " return s << a.DebugString(); \\\n"
6029 " }",
6030 getLLVMStyleWithColumns(50)));
6031
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006032 // FIXME: We cannot handle this case yet; we might be able to figure out that
6033 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006034 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006035
6036 FormatStyle PointerMiddle = getLLVMStyle();
6037 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6038 verifyFormat("delete *x;", PointerMiddle);
6039 verifyFormat("int * x;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006040 verifyFormat("int *[] x;", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006041 verifyFormat("template <int * y> f() {}", PointerMiddle);
6042 verifyFormat("int * f(int * a) {}", PointerMiddle);
6043 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6044 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6045 verifyFormat("A<int *> a;", PointerMiddle);
6046 verifyFormat("A<int **> a;", PointerMiddle);
6047 verifyFormat("A<int *, int *> a;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006048 verifyFormat("A<int *[]> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006049 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6050 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006051 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006052
6053 // Member function reference qualifiers aren't binary operators.
6054 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006055 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006056 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006057 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006058 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006059 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006060}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006061
Daniel Jasperee6d6502013-07-17 20:25:02 +00006062TEST_F(FormatTest, UnderstandsAttributes) {
6063 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006064 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6065 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006066 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006067 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006068 verifyFormat("__attribute__((nodebug)) void\n"
6069 "foo() {}\n",
6070 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006071}
6072
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006073TEST_F(FormatTest, UnderstandsSquareAttributes) {
6074 verifyFormat("SomeType s [[unused]] (InitValue);");
6075 verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
6076 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
6077 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
6078 verifyFormat("void f() [[deprecated(\"so sorry\")]];");
6079 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6080 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Manuel Klimekd0f3fe52018-04-11 14:51:54 +00006081
6082 // Make sure we do not mistake attributes for array subscripts.
6083 verifyFormat("int a() {}\n"
6084 "[[unused]] int b() {}\n");
6085
6086 // On the other hand, we still need to correctly find array subscripts.
6087 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
6088
6089 // Make sure we do not parse attributes as lambda introducers.
6090 FormatStyle MultiLineFunctions = getLLVMStyle();
6091 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6092 verifyFormat("[[unused]] int b() {\n"
6093 " return 42;\n"
6094 "}\n",
6095 MultiLineFunctions);
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006096}
6097
Daniel Jasper10cd5812013-05-06 06:35:44 +00006098TEST_F(FormatTest, UnderstandsEllipsis) {
6099 verifyFormat("int printf(const char *fmt, ...);");
6100 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006101 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6102
6103 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006104 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006105 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006106}
6107
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006108TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006109 EXPECT_EQ("int *a;\n"
6110 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006111 "int *a;",
6112 format("int *a;\n"
6113 "int* a;\n"
6114 "int *a;",
6115 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006116 EXPECT_EQ("int* a;\n"
6117 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006118 "int* a;",
6119 format("int* a;\n"
6120 "int* a;\n"
6121 "int *a;",
6122 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006123 EXPECT_EQ("int *a;\n"
6124 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006125 "int *a;",
6126 format("int *a;\n"
6127 "int * a;\n"
6128 "int * a;",
6129 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006130 EXPECT_EQ("auto x = [] {\n"
6131 " int *a;\n"
6132 " int *a;\n"
6133 " int *a;\n"
6134 "};",
6135 format("auto x=[]{int *a;\n"
6136 "int * a;\n"
6137 "int * a;};",
6138 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006139}
6140
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006141TEST_F(FormatTest, UnderstandsRvalueReferences) {
6142 verifyFormat("int f(int &&a) {}");
6143 verifyFormat("int f(int a, char &&b) {}");
6144 verifyFormat("void f() { int &&a = b; }");
6145 verifyGoogleFormat("int f(int a, char&& b) {}");
6146 verifyGoogleFormat("void f() { int&& a = b; }");
6147
Daniel Jasper1eff9082013-05-27 16:36:33 +00006148 verifyIndependentOfContext("A<int &&> a;");
6149 verifyIndependentOfContext("A<int &&, int &&> a;");
6150 verifyGoogleFormat("A<int&&> a;");
6151 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006152
6153 // Not rvalue references:
6154 verifyFormat("template <bool B, bool C> class A {\n"
6155 " static_assert(B && C, \"Something is wrong\");\n"
6156 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006157 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6158 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006159 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006160}
6161
Manuel Klimekc1237a82013-01-23 14:08:21 +00006162TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6163 verifyFormat("void f() {\n"
6164 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006165 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006166 "}",
6167 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006168}
6169
Daniel Jasperef906a92013-01-13 08:01:36 +00006170TEST_F(FormatTest, FormatsCasts) {
6171 verifyFormat("Type *A = static_cast<Type *>(P);");
6172 verifyFormat("Type *A = (Type *)P;");
6173 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6174 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006175 verifyFormat("int a = (int)2.0f;");
6176 verifyFormat("x[(int32)y];");
6177 verifyFormat("x = (int32)y;");
6178 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6179 verifyFormat("int a = (int)*b;");
6180 verifyFormat("int a = (int)2.0f;");
6181 verifyFormat("int a = (int)~0;");
6182 verifyFormat("int a = (int)++a;");
6183 verifyFormat("int a = (int)sizeof(int);");
6184 verifyFormat("int a = (int)+2;");
6185 verifyFormat("my_int a = (my_int)2.0f;");
6186 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006187 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006188 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006189 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006190 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006191 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006192
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006193 verifyFormat("void f() { my_int a = (my_int)*b; }");
6194 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6195 verifyFormat("my_int a = (my_int)~0;");
6196 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006197 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006198 verifyFormat("my_int a = (my_int)1;");
6199 verifyFormat("my_int a = (my_int *)1;");
6200 verifyFormat("my_int a = (const my_int)-1;");
6201 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006202 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006203 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006204 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006205 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006206
6207 // FIXME: single value wrapped with paren will be treated as cast.
6208 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006209
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006210 verifyFormat("{ (void)F; }");
6211
Daniel Jasper998cabc2013-07-18 14:46:07 +00006212 // Don't break after a cast's
6213 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6214 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6215 " bbbbbbbbbbbbbbbbbbbbbb);");
6216
Daniel Jasperef906a92013-01-13 08:01:36 +00006217 // These are not casts.
6218 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006219 verifyFormat("f(foo)->b;");
6220 verifyFormat("f(foo).b;");
6221 verifyFormat("f(foo)(b);");
6222 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006223 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006224 verifyFormat("(*funptr)(foo)[4];");
6225 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006226 verifyFormat("void f(int *);");
6227 verifyFormat("void f(int *) = 0;");
6228 verifyFormat("void f(SmallVector<int>) {}");
6229 verifyFormat("void f(SmallVector<int>);");
6230 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006231 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006232 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006233 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006234 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6235 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006236 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006237
Daniel Jasperba0bda92013-02-23 08:07:18 +00006238 // These are not casts, but at some point were confused with casts.
6239 verifyFormat("virtual void foo(int *) override;");
6240 verifyFormat("virtual void foo(char &) const;");
6241 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006242 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006243 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006244 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006245 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006246
6247 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6248 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006249 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006250 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006251 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6252 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6253 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006254}
6255
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006256TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006257 verifyFormat("A<bool()> a;");
6258 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006259 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006260 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006261 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006262 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006263 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006264 verifyFormat("template <class CallbackClass>\n"
6265 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006266
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006267 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6268 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006269 verifyGoogleFormat(
6270 "template <class CallbackClass>\n"
6271 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006272
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006273 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006274 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006275 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006276 verifyFormat("some_var = function(*some_pointer_var)[0];");
6277 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006278 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006279 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00006280 verifyFormat("std::function<\n"
6281 " LooooooooooongTemplatedType<\n"
6282 " SomeType>*(\n"
6283 " LooooooooooooooooongType type)>\n"
6284 " function;",
6285 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006286}
6287
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006288TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6289 verifyFormat("A (*foo_)[6];");
6290 verifyFormat("vector<int> (*foo_)[6];");
6291}
6292
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006293TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6294 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6295 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6296 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6297 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006298 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6299 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006300
6301 // Different ways of ()-initializiation.
6302 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6303 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6304 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6305 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6306 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6307 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006308 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6309 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006310
6311 // Lambdas should not confuse the variable declaration heuristic.
6312 verifyFormat("LooooooooooooooooongType\n"
6313 " variable(nullptr, [](A *a) {});",
6314 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006315}
6316
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006317TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006318 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006319 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006320 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006321 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006322 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006323 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006324 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6325 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006326 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6327 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006328 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6329 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006330 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6331 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006332 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6333 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006334 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6335 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6336 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6337 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006338 FormatStyle Indented = getLLVMStyle();
6339 Indented.IndentWrappedFunctionNames = true;
6340 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6341 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6342 Indented);
6343 verifyFormat(
6344 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6345 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6346 Indented);
6347 verifyFormat(
6348 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6349 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6350 Indented);
6351 verifyFormat(
6352 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6353 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6354 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006355
6356 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006357 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6358 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6359 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006360
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006361 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006362 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006363 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006364 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6365 " SourceLocation L, IdentifierIn *II,\n"
6366 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006367 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006368 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006369 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006370 " const SomeType<string, SomeOtherTemplateParameter>\n"
6371 " &ReallyReallyLongParameterName,\n"
6372 " const SomeType<string, SomeOtherTemplateParameter>\n"
6373 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006374 verifyFormat("template <typename A>\n"
6375 "SomeLoooooooooooooooooooooongType<\n"
6376 " typename some_namespace::SomeOtherType<A>::Type>\n"
6377 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006378
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006379 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006380 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6381 " aaaaaaaaaaaaaaaaaaaaaaa;");
6382 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006383 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6384 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006385 verifyGoogleFormat(
6386 "some_namespace::LongReturnType\n"
6387 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006388 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006389
6390 verifyGoogleFormat("template <typename T>\n"
6391 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006392 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006393 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6394 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006395
6396 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006397 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6398 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006399 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6400 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6401 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6402 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6403 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6404 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6405 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006406
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006407 verifyFormat("template <typename T> // Templates on own line.\n"
6408 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006409 "MyFunction(int a);",
6410 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006411}
6412
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006413TEST_F(FormatTest, FormatsArrays) {
6414 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6415 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006416 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6417 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006418 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6419 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006420 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6421 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6422 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6423 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6424 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6425 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6426 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6427 verifyFormat(
6428 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6429 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6430 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006431 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6432 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006433
6434 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6435 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006436 verifyFormat(
6437 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6438 " .aaaaaaa[0]\n"
6439 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006440 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006441
6442 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006443
6444 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6445 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006446}
6447
Daniel Jaspere9de2602012-12-06 09:56:08 +00006448TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6449 verifyFormat("(a)->b();");
6450 verifyFormat("--a;");
6451}
6452
Daniel Jasper8b529712012-12-04 13:02:32 +00006453TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006454 verifyFormat("#include <string>\n"
6455 "#include <a/b/c.h>\n"
6456 "#include \"a/b/string\"\n"
6457 "#include \"string.h\"\n"
6458 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006459 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006460 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006461 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006462 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006463 "#include \"some long include\" // with a comment\n"
Manuel Klimek45ab5592017-11-14 09:19:53 +00006464 "#include \"some very long include path\"\n"
6465 "#include <some/very/long/include/path>\n",
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006466 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006467 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6468 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006469
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006470 verifyFormat("#import <string>");
6471 verifyFormat("#import <a/b/c.h>");
6472 verifyFormat("#import \"a/b/string\"");
6473 verifyFormat("#import \"string.h\"");
6474 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006475 verifyFormat("#if __has_include(<strstream>)\n"
6476 "#include <strstream>\n"
6477 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006478
Daniel Jasper343643b2014-08-13 08:29:18 +00006479 verifyFormat("#define MY_IMPORT <a/b>");
6480
Nico Weber21088802017-02-10 19:36:52 +00006481 verifyFormat("#if __has_include(<a/b>)");
6482 verifyFormat("#if __has_include_next(<a/b>)");
6483 verifyFormat("#define F __has_include(<a/b>)");
6484 verifyFormat("#define F __has_include_next(<a/b>)");
6485
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006486 // Protocol buffer definition or missing "#".
6487 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6488 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006489
6490 FormatStyle Style = getLLVMStyle();
6491 Style.AlwaysBreakBeforeMultilineStrings = true;
6492 Style.ColumnLimit = 0;
6493 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006494
6495 // But 'import' might also be a regular C++ namespace.
6496 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6497 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006498}
6499
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006500//===----------------------------------------------------------------------===//
6501// Error recovery tests.
6502//===----------------------------------------------------------------------===//
6503
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006504TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006505 FormatStyle NoBinPacking = getLLVMStyle();
6506 NoBinPacking.BinPackParameters = false;
6507 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6508 " double *min_x,\n"
6509 " double *max_x,\n"
6510 " double *min_y,\n"
6511 " double *max_y,\n"
6512 " double *min_z,\n"
6513 " double *max_z, ) {}",
6514 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006515}
6516
Daniel Jasper83a54d22013-01-10 09:26:47 +00006517TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006518 verifyFormat("void f() { return; }\n42");
6519 verifyFormat("void f() {\n"
6520 " if (0)\n"
6521 " return;\n"
6522 "}\n"
6523 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006524 verifyFormat("void f() { return }\n42");
6525 verifyFormat("void f() {\n"
6526 " if (0)\n"
6527 " return\n"
6528 "}\n"
6529 "42");
6530}
6531
6532TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6533 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6534 EXPECT_EQ("void f() {\n"
6535 " if (a)\n"
6536 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006537 "}",
6538 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006539 EXPECT_EQ("namespace N {\n"
6540 "void f()\n"
6541 "}",
6542 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006543 EXPECT_EQ("namespace N {\n"
6544 "void f() {}\n"
6545 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006546 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006547 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006548}
6549
Daniel Jasper2df93312013-01-09 10:16:05 +00006550TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6551 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006552 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006553 " b;",
6554 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006555 verifyFormat("function(\n"
6556 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006557 " LoooooooooooongArgument);\n",
6558 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006559}
6560
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006561TEST_F(FormatTest, IncorrectAccessSpecifier) {
6562 verifyFormat("public:");
6563 verifyFormat("class A {\n"
6564 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006565 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006566 "};");
6567 verifyFormat("public\n"
6568 "int qwerty;");
6569 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006570 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006571 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006572 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006573 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006574 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006575}
Daniel Jasperf7935112012-12-03 18:12:45 +00006576
Daniel Jasper291f9362013-03-20 15:58:10 +00006577TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6578 verifyFormat("{");
6579 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006580 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006581}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006582
6583TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006584 verifyFormat("do {\n}");
6585 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006586 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006587 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006588 "wheeee(fun);");
6589 verifyFormat("do {\n"
6590 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006591 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006592}
6593
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006594TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006595 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006596 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006597 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006598 verifyFormat("while {\n foo;\n foo();\n}");
6599 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006600}
6601
Daniel Jasperc0880a92013-01-04 18:52:56 +00006602TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006603 verifyIncompleteFormat("namespace {\n"
6604 "class Foo { Foo (\n"
6605 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006606 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006607}
6608
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006609TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006610 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006611 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6612 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006613 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006614
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006615 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006616 " {\n"
6617 " breakme(\n"
6618 " qwe);\n"
6619 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006620 format("{\n"
6621 " {\n"
6622 " breakme(qwe);\n"
6623 "}\n",
6624 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006625}
6626
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006627TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006628 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006629 " avariable,\n"
6630 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006631 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006632}
6633
Manuel Klimek762dd182013-01-21 10:07:49 +00006634TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006635 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006636}
6637
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006638TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006639 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006640 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006641 " 1,\n"
6642 " 2,\n"
6643 " 3,\n"
6644 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006645 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006646 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6647 verifyFormat("f({1, 2});");
6648 verifyFormat("auto v = Foo{-1};");
6649 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6650 verifyFormat("Class::Class : member{1, 2, 3} {}");
6651 verifyFormat("new vector<int>{1, 2, 3};");
6652 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006653 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006654 verifyFormat("return {arg1, arg2};");
6655 verifyFormat("return {arg1, SomeType{parameter}};");
6656 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6657 verifyFormat("new T{arg1, arg2};");
6658 verifyFormat("f(MyMap[{composite, key}]);");
6659 verifyFormat("class Class {\n"
6660 " T member = {arg1, arg2};\n"
6661 "};");
6662 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006663 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6664 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006665 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6666 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006667
Daniel Jasper438059e2014-05-22 12:11:13 +00006668 verifyFormat("int foo(int i) { return fo1{}(i); }");
6669 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006670 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006671 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006672 verifyFormat("Node n{1, Node{1000}, //\n"
6673 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006674 verifyFormat("Aaaa aaaaaaa{\n"
6675 " {\n"
6676 " aaaa,\n"
6677 " },\n"
6678 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006679 verifyFormat("class C : public D {\n"
6680 " SomeClass SC{2};\n"
6681 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006682 verifyFormat("class C : public A {\n"
6683 " class D : public B {\n"
6684 " void f() { int i{2}; }\n"
6685 " };\n"
6686 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006687 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006688
Francois Ferrandd2130f52017-06-30 20:00:02 +00006689 // Binpacking only if there is no trailing comma
6690 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6691 " cccccccccc, dddddddddd};",
6692 getLLVMStyleWithColumns(50));
6693 verifyFormat("const Aaaaaa aaaaa = {\n"
6694 " aaaaaaaaaaa,\n"
6695 " bbbbbbbbbbb,\n"
6696 " ccccccccccc,\n"
6697 " ddddddddddd,\n"
6698 "};", getLLVMStyleWithColumns(50));
6699
Daniel Jaspere4ada022016-12-13 10:05:03 +00006700 // Cases where distinguising braced lists and blocks is hard.
6701 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6702 verifyFormat("void f() {\n"
6703 " return; // comment\n"
6704 "}\n"
6705 "SomeType t;");
6706 verifyFormat("void f() {\n"
6707 " if (a) {\n"
6708 " f();\n"
6709 " }\n"
6710 "}\n"
6711 "SomeType t;");
6712
Daniel Jasper08434342015-05-26 07:26:26 +00006713 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006714 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006715 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006716 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6717 " bbbbb,\n"
6718 " ccccc,\n"
6719 " ddddd,\n"
6720 " eeeee,\n"
6721 " ffffff,\n"
6722 " ggggg,\n"
6723 " hhhhhh,\n"
6724 " iiiiii,\n"
6725 " jjjjjj,\n"
6726 " kkkkkk};",
6727 NoBinPacking);
6728 verifyFormat("const Aaaaaa aaaaa = {\n"
6729 " aaaaa,\n"
6730 " bbbbb,\n"
6731 " ccccc,\n"
6732 " ddddd,\n"
6733 " eeeee,\n"
6734 " ffffff,\n"
6735 " ggggg,\n"
6736 " hhhhhh,\n"
6737 " iiiiii,\n"
6738 " jjjjjj,\n"
6739 " kkkkkk,\n"
6740 "};",
6741 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006742 verifyFormat(
6743 "const Aaaaaa aaaaa = {\n"
6744 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6745 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6746 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6747 "};",
6748 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006749
Chandler Carruthf8b72662014-03-02 12:37:31 +00006750 // FIXME: The alignment of these trailing comments might be bad. Then again,
6751 // this might be utterly useless in real code.
6752 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006753 " : some_value{ //\n"
6754 " aaaaaaa, //\n"
6755 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006756
Chandler Carruthf8b72662014-03-02 12:37:31 +00006757 // In braced lists, the first comment is always assumed to belong to the
6758 // first element. Thus, it can be moved to the next or previous line as
6759 // appropriate.
6760 EXPECT_EQ("function({// First element:\n"
6761 " 1,\n"
6762 " // Second element:\n"
6763 " 2});",
6764 format("function({\n"
6765 " // First element:\n"
6766 " 1,\n"
6767 " // Second element:\n"
6768 " 2});"));
6769 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6770 " // First element:\n"
6771 " 1,\n"
6772 " // Second element:\n"
6773 " 2};",
6774 format("std::vector<int> MyNumbers{// First element:\n"
6775 " 1,\n"
6776 " // Second element:\n"
6777 " 2};",
6778 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00006779 // A trailing comma should still lead to an enforced line break and no
6780 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00006781 EXPECT_EQ("vector<int> SomeVector = {\n"
6782 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006783 " 1,\n"
6784 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006785 "};",
6786 format("vector<int> SomeVector = { // aaa\n"
6787 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006788
Chandler Carruthf8b72662014-03-02 12:37:31 +00006789 FormatStyle ExtraSpaces = getLLVMStyle();
6790 ExtraSpaces.Cpp11BracedListStyle = false;
6791 ExtraSpaces.ColumnLimit = 75;
6792 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6793 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6794 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6795 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6796 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6797 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6798 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6799 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6800 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6801 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6802 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6803 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6804 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6805 verifyFormat("class Class {\n"
6806 " T member = { arg1, arg2 };\n"
6807 "};",
6808 ExtraSpaces);
6809 verifyFormat(
6810 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6811 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6812 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6813 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6814 ExtraSpaces);
6815 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006816 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006817 ExtraSpaces);
6818 verifyFormat(
6819 "someFunction(OtherParam,\n"
6820 " BracedList{ // comment 1 (Forcing interesting break)\n"
6821 " param1, param2,\n"
6822 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006823 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006824 ExtraSpaces);
6825 verifyFormat(
6826 "std::this_thread::sleep_for(\n"
6827 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6828 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006829 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006830 " aaaaaaa,\n"
6831 " aaaaaaaaaa,\n"
6832 " aaaaa,\n"
6833 " aaaaaaaaaaaaaaa,\n"
6834 " aaa,\n"
6835 " aaaaaaaaaa,\n"
6836 " a,\n"
6837 " aaaaaaaaaaaaaaaaaaaaa,\n"
6838 " aaaaaaaaaaaa,\n"
6839 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6840 " aaaaaaa,\n"
6841 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006842 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00006843 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
6844 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006845}
6846
Daniel Jasper33b909c2013-10-25 14:29:37 +00006847TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006848 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6849 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6850 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6851 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6852 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6853 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006854 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006855 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006856 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006857 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6858 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006859 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006860 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6861 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6862 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6863 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6864 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6865 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6866 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006867 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006868 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6869 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006870 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6871 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6872 " // Separating comment.\n"
6873 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6874 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6875 " // Leading comment\n"
6876 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6877 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006878 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6879 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006880 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006881 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6882 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006883 getLLVMStyleWithColumns(38));
6884 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006885 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6886 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006887 verifyFormat(
6888 "static unsigned SomeValues[10][3] = {\n"
6889 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6890 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6891 verifyFormat("static auto fields = new vector<string>{\n"
6892 " \"aaaaaaaaaaaaa\",\n"
6893 " \"aaaaaaaaaaaaa\",\n"
6894 " \"aaaaaaaaaaaa\",\n"
6895 " \"aaaaaaaaaaaaaa\",\n"
6896 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6897 " \"aaaaaaaaaaaa\",\n"
6898 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6899 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006900 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6901 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6902 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6903 " 3, cccccccccccccccccccccc};",
6904 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006905
6906 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006907 verifyFormat("vector<int> x = {\n"
6908 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6909 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006910 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006911 verifyFormat("vector<int> x = {\n"
6912 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006913 "};",
6914 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006915 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6916 " 1, 1, 1, 1,\n"
6917 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006918 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006919
Daniel Jasper60c27072015-05-13 08:16:00 +00006920 // Trailing comment in the first line.
6921 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6922 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6923 " 111111111, 222222222, 3333333333, 444444444, //\n"
6924 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006925 // Trailing comment in the last line.
6926 verifyFormat("int aaaaa[] = {\n"
6927 " 1, 2, 3, // comment\n"
6928 " 4, 5, 6 // comment\n"
6929 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006930
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006931 // With nested lists, we should either format one item per line or all nested
6932 // lists one on line.
6933 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006934 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6935 " {aaaaaaaaaaaaaaaaaaa},\n"
6936 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6937 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006938 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006939 verifyFormat(
6940 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006941 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6942 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6943 " {aaa, aaa},\n"
6944 " {aaa, aaa},\n"
6945 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6946 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6947 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006948
6949 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00006950 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006951 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006952
6953 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006954
Daniel Jaspereb65e912015-12-21 18:31:15 +00006955 // No braced initializer here.
6956 verifyFormat("void f() {\n"
6957 " struct Dummy {};\n"
6958 " f(v);\n"
6959 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006960
6961 // Long lists should be formatted in columns even if they are nested.
6962 verifyFormat(
6963 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6964 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6965 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6966 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6967 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6968 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006969
6970 // Allow "single-column" layout even if that violates the column limit. There
6971 // isn't going to be a better way.
6972 verifyFormat("std::vector<int> a = {\n"
6973 " aaaaaaaa,\n"
6974 " aaaaaaaa,\n"
6975 " aaaaaaaa,\n"
6976 " aaaaaaaa,\n"
6977 " aaaaaaaaaa,\n"
6978 " aaaaaaaa,\n"
6979 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6980 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006981 verifyFormat("vector<int> aaaa = {\n"
6982 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6983 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6984 " aaaaaa.aaaaaaa,\n"
6985 " aaaaaa.aaaaaaa,\n"
6986 " aaaaaa.aaaaaaa,\n"
6987 " aaaaaa.aaaaaaa,\n"
6988 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006989
6990 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006991 verifyFormat("someFunction(Param, {List1, List2,\n"
6992 " List3});",
6993 getLLVMStyleWithColumns(35));
6994 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006995 " {List1, List2,\n"
6996 " List3});",
6997 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006998 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6999 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007000}
7001
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007002TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007003 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007004 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007005
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007006 verifyFormat("void f() { return 42; }");
7007 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007008 " return 42;\n"
7009 "}",
7010 DoNotMerge);
7011 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007012 " // Comment\n"
7013 "}");
7014 verifyFormat("{\n"
7015 "#error {\n"
7016 " int a;\n"
7017 "}");
7018 verifyFormat("{\n"
7019 " int a;\n"
7020 "#error {\n"
7021 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007022 verifyFormat("void f() {} // comment");
7023 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007024 verifyFormat("void f() {\n"
7025 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007026 DoNotMerge);
7027 verifyFormat("void f() {\n"
7028 " int a;\n"
7029 "} // comment",
7030 DoNotMerge);
7031 verifyFormat("void f() {\n"
7032 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007033 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007034
7035 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7036 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7037
7038 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7039 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007040 verifyFormat("class C {\n"
7041 " C()\n"
7042 " : iiiiiiii(nullptr),\n"
7043 " kkkkkkk(nullptr),\n"
7044 " mmmmmmm(nullptr),\n"
7045 " nnnnnnn(nullptr) {}\n"
7046 "};",
7047 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007048
7049 FormatStyle NoColumnLimit = getLLVMStyle();
7050 NoColumnLimit.ColumnLimit = 0;
7051 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7052 EXPECT_EQ("class C {\n"
7053 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007054 "};",
7055 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007056 EXPECT_EQ("A()\n"
7057 " : b(0) {\n"
7058 "}",
7059 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7060
7061 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007062 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7063 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007064 EXPECT_EQ("A()\n"
7065 " : b(0) {\n"
7066 "}",
7067 format("A():b(0){}", DoNotMergeNoColumnLimit));
7068 EXPECT_EQ("A()\n"
7069 " : b(0) {\n"
7070 "}",
7071 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007072
7073 verifyFormat("#define A \\\n"
7074 " void f() { \\\n"
7075 " int i; \\\n"
7076 " }",
7077 getLLVMStyleWithColumns(20));
7078 verifyFormat("#define A \\\n"
7079 " void f() { int i; }",
7080 getLLVMStyleWithColumns(21));
7081 verifyFormat("#define A \\\n"
7082 " void f() { \\\n"
7083 " int i; \\\n"
7084 " } \\\n"
7085 " int j;",
7086 getLLVMStyleWithColumns(22));
7087 verifyFormat("#define A \\\n"
7088 " void f() { int i; } \\\n"
7089 " int j;",
7090 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007091}
7092
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007093TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
7094 FormatStyle MergeEmptyOnly = getLLVMStyle();
7095 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7096 verifyFormat("class C {\n"
7097 " int f() {}\n"
7098 "};",
7099 MergeEmptyOnly);
7100 verifyFormat("class C {\n"
7101 " int f() {\n"
7102 " return 42;\n"
7103 " }\n"
7104 "};",
7105 MergeEmptyOnly);
7106 verifyFormat("int f() {}", MergeEmptyOnly);
7107 verifyFormat("int f() {\n"
7108 " return 42;\n"
7109 "}",
7110 MergeEmptyOnly);
7111
7112 // Also verify behavior when BraceWrapping.AfterFunction = true
7113 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7114 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
7115 verifyFormat("int f() {}", MergeEmptyOnly);
7116 verifyFormat("class C {\n"
7117 " int f() {}\n"
7118 "};",
7119 MergeEmptyOnly);
7120}
7121
Daniel Jasperd74cf402014-04-08 12:46:38 +00007122TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7123 FormatStyle MergeInlineOnly = getLLVMStyle();
7124 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7125 verifyFormat("class C {\n"
7126 " int f() { return 42; }\n"
7127 "};",
7128 MergeInlineOnly);
7129 verifyFormat("int f() {\n"
7130 " return 42;\n"
7131 "}",
7132 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007133
7134 // SFS_Inline implies SFS_Empty
7135 verifyFormat("class C {\n"
7136 " int f() {}\n"
7137 "};",
7138 MergeInlineOnly);
7139 verifyFormat("int f() {}", MergeInlineOnly);
7140
7141 // Also verify behavior when BraceWrapping.AfterFunction = true
7142 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7143 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7144 verifyFormat("class C {\n"
7145 " int f() { return 42; }\n"
7146 "};",
7147 MergeInlineOnly);
7148 verifyFormat("int f()\n"
7149 "{\n"
7150 " return 42;\n"
7151 "}",
7152 MergeInlineOnly);
7153
7154 // SFS_Inline implies SFS_Empty
7155 verifyFormat("int f() {}", MergeInlineOnly);
7156 verifyFormat("class C {\n"
7157 " int f() {}\n"
7158 "};",
7159 MergeInlineOnly);
7160}
7161
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00007162TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
7163 FormatStyle MergeInlineOnly = getLLVMStyle();
7164 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
7165 FormatStyle::SFS_InlineOnly;
7166 verifyFormat("class C {\n"
7167 " int f() { return 42; }\n"
7168 "};",
7169 MergeInlineOnly);
7170 verifyFormat("int f() {\n"
7171 " return 42;\n"
7172 "}",
7173 MergeInlineOnly);
7174
7175 // SFS_InlineOnly does not imply SFS_Empty
7176 verifyFormat("class C {\n"
7177 " int f() {}\n"
7178 "};",
7179 MergeInlineOnly);
7180 verifyFormat("int f() {\n"
7181 "}",
7182 MergeInlineOnly);
7183
7184 // Also verify behavior when BraceWrapping.AfterFunction = true
7185 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7186 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7187 verifyFormat("class C {\n"
7188 " int f() { return 42; }\n"
7189 "};",
7190 MergeInlineOnly);
7191 verifyFormat("int f()\n"
7192 "{\n"
7193 " return 42;\n"
7194 "}",
7195 MergeInlineOnly);
7196
7197 // SFS_InlineOnly does not imply SFS_Empty
7198 verifyFormat("int f()\n"
7199 "{\n"
7200 "}",
7201 MergeInlineOnly);
7202 verifyFormat("class C {\n"
7203 " int f() {}\n"
7204 "};",
7205 MergeInlineOnly);
7206}
7207
Francois Ferrandad722562017-06-30 20:25:55 +00007208TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007209 FormatStyle Style = getLLVMStyle();
7210 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7211 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7212 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00007213 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007214 Style.ColumnLimit = 40;
7215
7216 verifyFormat("int f()\n"
7217 "{}",
7218 Style);
7219 verifyFormat("int f()\n"
7220 "{\n"
7221 " return 42;\n"
7222 "}",
7223 Style);
7224 verifyFormat("int f()\n"
7225 "{\n"
7226 " // some comment\n"
7227 "}",
7228 Style);
7229
7230 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7231 verifyFormat("int f() {}", Style);
7232 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7233 "{}",
7234 Style);
7235 verifyFormat("int f()\n"
7236 "{\n"
7237 " return 0;\n"
7238 "}",
7239 Style);
7240
7241 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7242 verifyFormat("class Foo {\n"
7243 " int f() {}\n"
7244 "};\n",
7245 Style);
7246 verifyFormat("class Foo {\n"
7247 " int f() { return 0; }\n"
7248 "};\n",
7249 Style);
7250 verifyFormat("class Foo {\n"
7251 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7252 " {}\n"
7253 "};\n",
7254 Style);
7255 verifyFormat("class Foo {\n"
7256 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7257 " {\n"
7258 " return 0;\n"
7259 " }\n"
7260 "};\n",
7261 Style);
7262
7263 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7264 verifyFormat("int f() {}", Style);
7265 verifyFormat("int f() { return 0; }", Style);
7266 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7267 "{}",
7268 Style);
7269 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7270 "{\n"
7271 " return 0;\n"
7272 "}",
7273 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00007274}
Krasimir Georgiev6a1c9d52017-10-02 15:53:37 +00007275TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
7276 FormatStyle Style = getLLVMStyle();
7277 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7278 verifyFormat("#ifdef A\n"
7279 "int f() {}\n"
7280 "#else\n"
7281 "int g() {}\n"
7282 "#endif",
7283 Style);
7284}
Daniel Jasperd74cf402014-04-08 12:46:38 +00007285
Francois Ferrandad722562017-06-30 20:25:55 +00007286TEST_F(FormatTest, SplitEmptyClass) {
7287 FormatStyle Style = getLLVMStyle();
7288 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7289 Style.BraceWrapping.AfterClass = true;
7290 Style.BraceWrapping.SplitEmptyRecord = false;
7291
7292 verifyFormat("class Foo\n"
7293 "{};",
7294 Style);
7295 verifyFormat("/* something */ class Foo\n"
7296 "{};",
7297 Style);
7298 verifyFormat("template <typename X> class Foo\n"
7299 "{};",
7300 Style);
7301 verifyFormat("class Foo\n"
7302 "{\n"
7303 " Foo();\n"
7304 "};",
7305 Style);
7306 verifyFormat("typedef class Foo\n"
7307 "{\n"
7308 "} Foo_t;",
7309 Style);
7310}
7311
7312TEST_F(FormatTest, SplitEmptyStruct) {
7313 FormatStyle Style = getLLVMStyle();
7314 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7315 Style.BraceWrapping.AfterStruct = true;
7316 Style.BraceWrapping.SplitEmptyRecord = false;
7317
7318 verifyFormat("struct Foo\n"
7319 "{};",
7320 Style);
7321 verifyFormat("/* something */ struct Foo\n"
7322 "{};",
7323 Style);
7324 verifyFormat("template <typename X> struct Foo\n"
7325 "{};",
7326 Style);
7327 verifyFormat("struct Foo\n"
7328 "{\n"
7329 " Foo();\n"
7330 "};",
7331 Style);
7332 verifyFormat("typedef struct Foo\n"
7333 "{\n"
7334 "} Foo_t;",
7335 Style);
7336 //typedef struct Bar {} Bar_t;
7337}
7338
7339TEST_F(FormatTest, SplitEmptyUnion) {
7340 FormatStyle Style = getLLVMStyle();
7341 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7342 Style.BraceWrapping.AfterUnion = true;
7343 Style.BraceWrapping.SplitEmptyRecord = false;
7344
7345 verifyFormat("union Foo\n"
7346 "{};",
7347 Style);
7348 verifyFormat("/* something */ union Foo\n"
7349 "{};",
7350 Style);
7351 verifyFormat("union Foo\n"
7352 "{\n"
7353 " A,\n"
7354 "};",
7355 Style);
7356 verifyFormat("typedef union Foo\n"
7357 "{\n"
7358 "} Foo_t;",
7359 Style);
7360}
7361
7362TEST_F(FormatTest, SplitEmptyNamespace) {
7363 FormatStyle Style = getLLVMStyle();
7364 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7365 Style.BraceWrapping.AfterNamespace = true;
7366 Style.BraceWrapping.SplitEmptyNamespace = false;
7367
7368 verifyFormat("namespace Foo\n"
7369 "{};",
7370 Style);
7371 verifyFormat("/* something */ namespace Foo\n"
7372 "{};",
7373 Style);
7374 verifyFormat("inline namespace Foo\n"
7375 "{};",
7376 Style);
7377 verifyFormat("namespace Foo\n"
7378 "{\n"
7379 "void Bar();\n"
7380 "};",
7381 Style);
7382}
7383
7384TEST_F(FormatTest, NeverMergeShortRecords) {
7385 FormatStyle Style = getLLVMStyle();
7386
7387 verifyFormat("class Foo {\n"
7388 " Foo();\n"
7389 "};",
7390 Style);
7391 verifyFormat("typedef class Foo {\n"
7392 " Foo();\n"
7393 "} Foo_t;",
7394 Style);
7395 verifyFormat("struct Foo {\n"
7396 " Foo();\n"
7397 "};",
7398 Style);
7399 verifyFormat("typedef struct Foo {\n"
7400 " Foo();\n"
7401 "} Foo_t;",
7402 Style);
7403 verifyFormat("union Foo {\n"
7404 " A,\n"
7405 "};",
7406 Style);
7407 verifyFormat("typedef union Foo {\n"
7408 " A,\n"
7409 "} Foo_t;",
7410 Style);
7411 verifyFormat("namespace Foo {\n"
7412 "void Bar();\n"
7413 "};",
7414 Style);
7415
7416 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7417 Style.BraceWrapping.AfterClass = true;
7418 Style.BraceWrapping.AfterStruct = true;
7419 Style.BraceWrapping.AfterUnion = true;
7420 Style.BraceWrapping.AfterNamespace = true;
7421 verifyFormat("class Foo\n"
7422 "{\n"
7423 " Foo();\n"
7424 "};",
7425 Style);
7426 verifyFormat("typedef class Foo\n"
7427 "{\n"
7428 " Foo();\n"
7429 "} Foo_t;",
7430 Style);
7431 verifyFormat("struct Foo\n"
7432 "{\n"
7433 " Foo();\n"
7434 "};",
7435 Style);
7436 verifyFormat("typedef struct Foo\n"
7437 "{\n"
7438 " Foo();\n"
7439 "} Foo_t;",
7440 Style);
7441 verifyFormat("union Foo\n"
7442 "{\n"
7443 " A,\n"
7444 "};",
7445 Style);
7446 verifyFormat("typedef union Foo\n"
7447 "{\n"
7448 " A,\n"
7449 "} Foo_t;",
7450 Style);
7451 verifyFormat("namespace Foo\n"
7452 "{\n"
7453 "void Bar();\n"
7454 "};",
7455 Style);
7456}
7457
Manuel Klimeke01bab52013-01-15 13:38:33 +00007458TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7459 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007460 verifyFormat("struct foo a = {bar};\nint n;");
7461 verifyFormat("class foo a = {bar};\nint n;");
7462 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007463
7464 // Elaborate types inside function definitions.
7465 verifyFormat("struct foo f() {}\nint n;");
7466 verifyFormat("class foo f() {}\nint n;");
7467 verifyFormat("union foo f() {}\nint n;");
7468
7469 // Templates.
7470 verifyFormat("template <class X> void f() {}\nint n;");
7471 verifyFormat("template <struct X> void f() {}\nint n;");
7472 verifyFormat("template <union X> void f() {}\nint n;");
7473
7474 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007475 verifyFormat("struct {\n} n;");
7476 verifyFormat(
7477 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007478 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007479 verifyFormat("class MACRO Z {\n} n;");
7480 verifyFormat("class MACRO(X) Z {\n} n;");
7481 verifyFormat("class __attribute__(X) Z {\n} n;");
7482 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007483 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007484 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007485 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7486 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007487
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007488 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007489 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007490
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007491 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007492 verifyFormat(
7493 "template <typename F>\n"
7494 "Matcher(const Matcher<F> &Other,\n"
7495 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7496 " !is_same<F, T>::value>::type * = 0)\n"
7497 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7498
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007499 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007500 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007501 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007502
7503 // FIXME:
7504 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007505 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007506
Manuel Klimeke01bab52013-01-15 13:38:33 +00007507 // Elaborate types where incorrectly parsing the structural element would
7508 // break the indent.
7509 verifyFormat("if (true)\n"
7510 " class X x;\n"
7511 "else\n"
7512 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007513
7514 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007515 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007516}
7517
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007518TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007519 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7520 format("#error Leave all white!!!!! space* alone!\n"));
7521 EXPECT_EQ(
7522 "#warning Leave all white!!!!! space* alone!\n",
7523 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007524 EXPECT_EQ("#error 1", format(" # error 1"));
7525 EXPECT_EQ("#warning 1", format(" # warning 1"));
7526}
7527
Daniel Jasper4431aa92013-04-23 13:54:04 +00007528TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007529 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007530 verifyFormat("#if (AAAA && BBBB)");
7531 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007532 // FIXME: Come up with a better indentation for #elif.
7533 verifyFormat(
7534 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7535 " defined(BBBBBBBB)\n"
7536 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7537 " defined(BBBBBBBB)\n"
7538 "#endif",
7539 getLLVMStyleWithColumns(65));
7540}
7541
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007542TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7543 FormatStyle AllowsMergedIf = getGoogleStyle();
7544 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7545 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7546 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007547 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7548 EXPECT_EQ("if (true) return 42;",
7549 format("if (true)\nreturn 42;", AllowsMergedIf));
7550 FormatStyle ShortMergedIf = AllowsMergedIf;
7551 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007552 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007553 " if (true) return 42;",
7554 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007555 verifyFormat("#define A \\\n"
7556 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007557 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007558 "#define B",
7559 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007560 verifyFormat("#define A \\\n"
7561 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007562 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007563 "g();",
7564 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007565 verifyFormat("{\n"
7566 "#ifdef A\n"
7567 " // Comment\n"
7568 " if (true) continue;\n"
7569 "#endif\n"
7570 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007571 " if (true) continue;\n"
7572 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007573 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007574 ShortMergedIf.ColumnLimit = 33;
7575 verifyFormat("#define A \\\n"
7576 " if constexpr (true) return 42;",
7577 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007578 ShortMergedIf.ColumnLimit = 29;
7579 verifyFormat("#define A \\\n"
7580 " if (aaaaaaaaaa) return 1; \\\n"
7581 " return 2;",
7582 ShortMergedIf);
7583 ShortMergedIf.ColumnLimit = 28;
7584 verifyFormat("#define A \\\n"
7585 " if (aaaaaaaaaa) \\\n"
7586 " return 1; \\\n"
7587 " return 2;",
7588 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007589 verifyFormat("#define A \\\n"
7590 " if constexpr (aaaaaaa) \\\n"
7591 " return 1; \\\n"
7592 " return 2;",
7593 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007594}
7595
Manuel Klimekd33516e2013-01-23 10:09:28 +00007596TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007597 verifyFormat("void f(int *a);");
7598 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007599 verifyFormat("class A {\n void f(int *a);\n};");
7600 verifyFormat("class A {\n int *a;\n};");
7601 verifyFormat("namespace a {\n"
7602 "namespace b {\n"
7603 "class A {\n"
7604 " void f() {}\n"
7605 " int *a;\n"
7606 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00007607 "} // namespace b\n"
7608 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007609}
7610
Manuel Klimekd33516e2013-01-23 10:09:28 +00007611TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7612 verifyFormat("while");
7613 verifyFormat("operator");
7614}
7615
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007616TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7617 // This code would be painfully slow to format if we didn't skip it.
7618 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
7619 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7620 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7621 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7622 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7623 "A(1, 1)\n"
7624 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
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 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7629 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7630 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7631 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7632 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7633 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7634 // Deeply nested part is untouched, rest is formatted.
7635 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7636 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00007637 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007638}
7639
Nico Weber7e6a7a12013-01-08 17:56:31 +00007640//===----------------------------------------------------------------------===//
7641// Objective-C tests.
7642//===----------------------------------------------------------------------===//
7643
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007644TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7645 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7646 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7647 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007648 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007649 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7650 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7651 format("-(NSInteger)Method3:(id)anObject;"));
7652 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7653 format("-(NSInteger)Method4:(id)anObject;"));
7654 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7655 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7656 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7657 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007658 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7659 "forAllCells:(BOOL)flag;",
7660 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7661 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007662
7663 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007664 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7665 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007666 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7667 " inRange:(NSRange)range\n"
7668 " outRange:(NSRange)out_range\n"
7669 " outRange1:(NSRange)out_range1\n"
7670 " outRange2:(NSRange)out_range2\n"
7671 " outRange3:(NSRange)out_range3\n"
7672 " outRange4:(NSRange)out_range4\n"
7673 " outRange5:(NSRange)out_range5\n"
7674 " outRange6:(NSRange)out_range6\n"
7675 " outRange7:(NSRange)out_range7\n"
7676 " outRange8:(NSRange)out_range8\n"
7677 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007678
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007679 // When the function name has to be wrapped.
7680 FormatStyle Style = getLLVMStyle();
Ben Hamilton416348e2018-04-12 15:11:48 +00007681 // ObjC ignores IndentWrappedFunctionNames when wrapping methods
7682 // and always indents instead.
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007683 Style.IndentWrappedFunctionNames = false;
7684 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
Ben Hamilton416348e2018-04-12 15:11:48 +00007685 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7686 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007687 "}",
7688 Style);
7689 Style.IndentWrappedFunctionNames = true;
7690 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
Ben Hamilton416348e2018-04-12 15:11:48 +00007691 " veryLooooooooooongName:(NSString)cccccccccccccc\n"
7692 " anotherName:(NSString)dddddddddddddd {\n"
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007693 "}",
7694 Style);
7695
Nico Weberd6f962f2013-01-10 20:18:33 +00007696 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007697 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007698 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7699 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007700 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007701
Daniel Jasper37194282013-05-28 08:33:00 +00007702 verifyFormat("- (int (*)())foo:(int (*)())f;");
7703 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007704
7705 // If there's no return type (very rare in practice!), LLVM and Google style
7706 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007707 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007708 verifyFormat("- foo:(int)f;");
7709 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007710}
7711
Nico Weber0588b502013-02-07 00:19:29 +00007712
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007713TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007714 EXPECT_EQ("\"some text \"\n"
7715 "\"other\";",
7716 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007717 EXPECT_EQ("\"some text \"\n"
7718 "\"other\";",
7719 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007720 EXPECT_EQ(
7721 "#define A \\\n"
7722 " \"some \" \\\n"
7723 " \"text \" \\\n"
7724 " \"other\";",
7725 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7726 EXPECT_EQ(
7727 "#define A \\\n"
7728 " \"so \" \\\n"
7729 " \"text \" \\\n"
7730 " \"other\";",
7731 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7732
7733 EXPECT_EQ("\"some text\"",
7734 format("\"some text\"", getLLVMStyleWithColumns(1)));
7735 EXPECT_EQ("\"some text\"",
7736 format("\"some text\"", getLLVMStyleWithColumns(11)));
7737 EXPECT_EQ("\"some \"\n"
7738 "\"text\"",
7739 format("\"some text\"", getLLVMStyleWithColumns(10)));
7740 EXPECT_EQ("\"some \"\n"
7741 "\"text\"",
7742 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007743 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007744 "\" tex\"\n"
7745 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007746 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007747 EXPECT_EQ("\"some\"\n"
7748 "\" tex\"\n"
7749 "\" and\"",
7750 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7751 EXPECT_EQ("\"some\"\n"
7752 "\"/tex\"\n"
7753 "\"/and\"",
7754 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007755
7756 EXPECT_EQ("variable =\n"
7757 " \"long string \"\n"
7758 " \"literal\";",
7759 format("variable = \"long string literal\";",
7760 getLLVMStyleWithColumns(20)));
7761
7762 EXPECT_EQ("variable = f(\n"
7763 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007764 " \"literal\",\n"
7765 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007766 " loooooooooooooooooooong);",
7767 format("variable = f(\"long string literal\", short, "
7768 "loooooooooooooooooooong);",
7769 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007770
Daniel Jaspera44991332015-04-29 13:06:49 +00007771 EXPECT_EQ(
7772 "f(g(\"long string \"\n"
7773 " \"literal\"),\n"
7774 " b);",
7775 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007776 EXPECT_EQ("f(g(\"long string \"\n"
7777 " \"literal\",\n"
7778 " a),\n"
7779 " b);",
7780 format("f(g(\"long string literal\", a), b);",
7781 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007782 EXPECT_EQ(
7783 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007784 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007785 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7786 EXPECT_EQ("f(\"one two three four five six \"\n"
7787 " \"seven\".split(\n"
7788 " really_looooong_variable));",
7789 format("f(\"one two three four five six seven\"."
7790 "split(really_looooong_variable));",
7791 getLLVMStyleWithColumns(33)));
7792
7793 EXPECT_EQ("f(\"some \"\n"
7794 " \"text\",\n"
7795 " other);",
7796 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007797
7798 // Only break as a last resort.
7799 verifyFormat(
7800 "aaaaaaaaaaaaaaaaaaaa(\n"
7801 " aaaaaaaaaaaaaaaaaaaa,\n"
7802 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007803
Daniel Jaspera44991332015-04-29 13:06:49 +00007804 EXPECT_EQ("\"splitmea\"\n"
7805 "\"trandomp\"\n"
7806 "\"oint\"",
7807 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007808
Daniel Jaspera44991332015-04-29 13:06:49 +00007809 EXPECT_EQ("\"split/\"\n"
7810 "\"pathat/\"\n"
7811 "\"slashes\"",
7812 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007813
Daniel Jaspera44991332015-04-29 13:06:49 +00007814 EXPECT_EQ("\"split/\"\n"
7815 "\"pathat/\"\n"
7816 "\"slashes\"",
7817 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007818 EXPECT_EQ("\"split at \"\n"
7819 "\"spaces/at/\"\n"
7820 "\"slashes.at.any$\"\n"
7821 "\"non-alphanumeric%\"\n"
7822 "\"1111111111characte\"\n"
7823 "\"rs\"",
7824 format("\"split at "
7825 "spaces/at/"
7826 "slashes.at."
7827 "any$non-"
7828 "alphanumeric%"
7829 "1111111111characte"
7830 "rs\"",
7831 getLLVMStyleWithColumns(20)));
7832
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007833 // Verify that splitting the strings understands
7834 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007835 EXPECT_EQ(
7836 "aaaaaaaaaaaa(\n"
7837 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7838 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7839 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7840 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7841 "aaaaaaaaaaaaaaaaaaaaaa\");",
7842 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007843 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7844 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7845 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7846 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7847 "aaaaaaaaaaaaaaaaaaaaaa\";",
7848 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007849 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7850 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7851 format("llvm::outs() << "
7852 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7853 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007854 EXPECT_EQ("ffff(\n"
7855 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7856 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7857 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7858 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7859 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007860
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007861 FormatStyle Style = getLLVMStyleWithColumns(12);
7862 Style.BreakStringLiterals = false;
7863 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7864
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007865 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007866 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00007867 EXPECT_EQ("#define A \\\n"
7868 " \"some \" \\\n"
7869 " \"text \" \\\n"
7870 " \"other\";",
7871 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007872}
7873
Manuel Klimek93699f42017-11-29 14:29:43 +00007874TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
7875 EXPECT_EQ("C a = \"some more \"\n"
7876 " \"text\";",
7877 format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
7878}
7879
Manuel Klimek9e321992015-07-28 15:50:24 +00007880TEST_F(FormatTest, FullyRemoveEmptyLines) {
7881 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7882 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7883 EXPECT_EQ("int i = a(b());",
7884 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7885}
7886
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007887TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7888 EXPECT_EQ(
7889 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7890 "(\n"
7891 " \"x\t\");",
7892 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7893 "aaaaaaa("
7894 "\"x\t\");"));
7895}
7896
Daniel Jasper174b0122014-01-09 14:18:12 +00007897TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007898 EXPECT_EQ(
7899 "u8\"utf8 string \"\n"
7900 "u8\"literal\";",
7901 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7902 EXPECT_EQ(
7903 "u\"utf16 string \"\n"
7904 "u\"literal\";",
7905 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7906 EXPECT_EQ(
7907 "U\"utf32 string \"\n"
7908 "U\"literal\";",
7909 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7910 EXPECT_EQ("L\"wide string \"\n"
7911 "L\"literal\";",
7912 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007913 EXPECT_EQ("@\"NSString \"\n"
7914 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007915 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00007916 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007917
7918 // This input makes clang-format try to split the incomplete unicode escape
7919 // sequence, which used to lead to a crasher.
7920 verifyNoCrash(
7921 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7922 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007923}
7924
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007925TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7926 FormatStyle Style = getGoogleStyleWithColumns(15);
7927 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7928 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7929 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7930 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7931 EXPECT_EQ("u8R\"x(raw literal)x\";",
7932 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007933}
7934
7935TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7936 FormatStyle Style = getLLVMStyleWithColumns(20);
7937 EXPECT_EQ(
7938 "_T(\"aaaaaaaaaaaaaa\")\n"
7939 "_T(\"aaaaaaaaaaaaaa\")\n"
7940 "_T(\"aaaaaaaaaaaa\")",
7941 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007942 EXPECT_EQ("f(x,\n"
7943 " _T(\"aaaaaaaaaaaa\")\n"
7944 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00007945 " z);",
7946 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7947
7948 // FIXME: Handle embedded spaces in one iteration.
7949 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7950 // "_T(\"aaaaaaaaaaaaa\")\n"
7951 // "_T(\"aaaaaaaaaaaaa\")\n"
7952 // "_T(\"a\")",
7953 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7954 // getLLVMStyleWithColumns(20)));
7955 EXPECT_EQ(
7956 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7957 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007958 EXPECT_EQ("f(\n"
7959 "#if !TEST\n"
7960 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7961 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00007962 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007963 format("f(\n"
7964 "#if !TEST\n"
7965 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7966 "#endif\n"
7967 ");"));
7968 EXPECT_EQ("f(\n"
7969 "\n"
7970 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7971 format("f(\n"
7972 "\n"
7973 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007974}
7975
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007976TEST_F(FormatTest, BreaksStringLiteralOperands) {
7977 // In a function call with two operands, the second can be broken with no line
7978 // break before it.
7979 EXPECT_EQ("func(a, \"long long \"\n"
7980 " \"long long\");",
7981 format("func(a, \"long long long long\");",
7982 getLLVMStyleWithColumns(24)));
7983 // In a function call with three operands, the second must be broken with a
7984 // line break before it.
7985 EXPECT_EQ("func(a,\n"
7986 " \"long long long \"\n"
7987 " \"long\",\n"
7988 " c);",
7989 format("func(a, \"long long long long\", c);",
7990 getLLVMStyleWithColumns(24)));
7991 // In a function call with three operands, the third must be broken with a
7992 // line break before it.
7993 EXPECT_EQ("func(a, b,\n"
7994 " \"long long long \"\n"
7995 " \"long\");",
7996 format("func(a, b, \"long long long long\");",
7997 getLLVMStyleWithColumns(24)));
7998 // In a function call with three operands, both the second and the third must
7999 // be broken with a line break before them.
8000 EXPECT_EQ("func(a,\n"
8001 " \"long long long \"\n"
8002 " \"long\",\n"
8003 " \"long long long \"\n"
8004 " \"long\");",
8005 format("func(a, \"long long long long\", \"long long long long\");",
8006 getLLVMStyleWithColumns(24)));
8007 // In a chain of << with two operands, the second can be broken with no line
8008 // break before it.
8009 EXPECT_EQ("a << \"line line \"\n"
8010 " \"line\";",
8011 format("a << \"line line line\";",
8012 getLLVMStyleWithColumns(20)));
8013 // In a chain of << with three operands, the second can be broken with no line
8014 // break before it.
8015 EXPECT_EQ("abcde << \"line \"\n"
8016 " \"line line\"\n"
8017 " << c;",
8018 format("abcde << \"line line line\" << c;",
8019 getLLVMStyleWithColumns(20)));
8020 // In a chain of << with three operands, the third must be broken with a line
8021 // break before it.
8022 EXPECT_EQ("a << b\n"
8023 " << \"line line \"\n"
8024 " \"line\";",
8025 format("a << b << \"line line line\";",
8026 getLLVMStyleWithColumns(20)));
8027 // In a chain of << with three operands, the second can be broken with no line
8028 // break before it and the third must be broken with a line break before it.
8029 EXPECT_EQ("abcd << \"line line \"\n"
8030 " \"line\"\n"
8031 " << \"line line \"\n"
8032 " \"line\";",
8033 format("abcd << \"line line line\" << \"line line line\";",
8034 getLLVMStyleWithColumns(20)));
8035 // In a chain of binary operators with two operands, the second can be broken
8036 // with no line break before it.
8037 EXPECT_EQ("abcd + \"line line \"\n"
8038 " \"line line\";",
8039 format("abcd + \"line line line line\";",
8040 getLLVMStyleWithColumns(20)));
8041 // In a chain of binary operators with three operands, the second must be
8042 // broken with a line break before it.
8043 EXPECT_EQ("abcd +\n"
8044 " \"line line \"\n"
8045 " \"line line\" +\n"
8046 " e;",
8047 format("abcd + \"line line line line\" + e;",
8048 getLLVMStyleWithColumns(20)));
8049 // In a function call with two operands, with AlignAfterOpenBracket enabled,
8050 // the first must be broken with a line break before it.
8051 FormatStyle Style = getLLVMStyleWithColumns(25);
8052 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8053 EXPECT_EQ("someFunction(\n"
8054 " \"long long long \"\n"
8055 " \"long\",\n"
8056 " a);",
8057 format("someFunction(\"long long long long\", a);", Style));
8058}
8059
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008060TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008061 EXPECT_EQ(
8062 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8064 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8065 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8066 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8067 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8068}
8069
8070TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8071 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008072 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008073 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8074 "multiline raw string literal xxxxxxxxxxxxxx\n"
8075 ")x\",\n"
8076 " a),\n"
8077 " b);",
8078 format("fffffffffff(g(R\"x(\n"
8079 "multiline raw string literal xxxxxxxxxxxxxx\n"
8080 ")x\", a), b);",
8081 getGoogleStyleWithColumns(20)));
8082 EXPECT_EQ("fffffffffff(\n"
8083 " g(R\"x(qqq\n"
8084 "multiline raw string literal xxxxxxxxxxxxxx\n"
8085 ")x\",\n"
8086 " a),\n"
8087 " b);",
8088 format("fffffffffff(g(R\"x(qqq\n"
8089 "multiline raw string literal xxxxxxxxxxxxxx\n"
8090 ")x\", a), b);",
8091 getGoogleStyleWithColumns(20)));
8092
8093 EXPECT_EQ("fffffffffff(R\"x(\n"
8094 "multiline raw string literal xxxxxxxxxxxxxx\n"
8095 ")x\");",
8096 format("fffffffffff(R\"x(\n"
8097 "multiline raw string literal xxxxxxxxxxxxxx\n"
8098 ")x\");",
8099 getGoogleStyleWithColumns(20)));
8100 EXPECT_EQ("fffffffffff(R\"x(\n"
8101 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008102 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008103 format("fffffffffff(R\"x(\n"
8104 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008105 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008106 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008107 EXPECT_EQ("fffffffffff(\n"
8108 " R\"x(\n"
8109 "multiline raw string literal xxxxxxxxxxxxxx\n"
8110 ")x\" +\n"
8111 " bbbbbb);",
8112 format("fffffffffff(\n"
8113 " R\"x(\n"
8114 "multiline raw string literal xxxxxxxxxxxxxx\n"
8115 ")x\" + bbbbbb);",
8116 getGoogleStyleWithColumns(20)));
Daniel Jasperfd327672018-03-22 14:43:54 +00008117 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
8118 format("fffffffffff(\n"
8119 " R\"(single line raw string)\" + bbbbbb);"));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008120}
8121
Alexander Kornienkobe633902013-06-14 11:46:10 +00008122TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008123 verifyFormat("string a = \"unterminated;");
8124 EXPECT_EQ("function(\"unterminated,\n"
8125 " OtherParameter);",
8126 format("function( \"unterminated,\n"
8127 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008128}
8129
8130TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008131 FormatStyle Style = getLLVMStyle();
8132 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008133 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008134 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008135}
8136
Daniel Jaspera44991332015-04-29 13:06:49 +00008137TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008138
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008139TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8140 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8141 " \"ddeeefff\");",
8142 format("someFunction(\"aaabbbcccdddeeefff\");",
8143 getLLVMStyleWithColumns(25)));
8144 EXPECT_EQ("someFunction1234567890(\n"
8145 " \"aaabbbcccdddeeefff\");",
8146 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8147 getLLVMStyleWithColumns(26)));
8148 EXPECT_EQ("someFunction1234567890(\n"
8149 " \"aaabbbcccdddeeeff\"\n"
8150 " \"f\");",
8151 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8152 getLLVMStyleWithColumns(25)));
8153 EXPECT_EQ("someFunction1234567890(\n"
8154 " \"aaabbbcccdddeeeff\"\n"
8155 " \"f\");",
8156 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8157 getLLVMStyleWithColumns(24)));
Manuel Klimek77866142017-11-17 11:17:15 +00008158 EXPECT_EQ("someFunction(\n"
8159 " \"aaabbbcc ddde \"\n"
8160 " \"efff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008161 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008162 getLLVMStyleWithColumns(25)));
8163 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8164 " \"ddeeefff\");",
8165 format("someFunction(\"aaabbbccc ddeeefff\");",
8166 getLLVMStyleWithColumns(25)));
8167 EXPECT_EQ("someFunction1234567890(\n"
8168 " \"aaabb \"\n"
8169 " \"cccdddeeefff\");",
8170 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8171 getLLVMStyleWithColumns(25)));
8172 EXPECT_EQ("#define A \\\n"
8173 " string s = \\\n"
8174 " \"123456789\" \\\n"
8175 " \"0\"; \\\n"
8176 " int i;",
8177 format("#define A string s = \"1234567890\"; int i;",
8178 getLLVMStyleWithColumns(20)));
Manuel Klimek77866142017-11-17 11:17:15 +00008179 EXPECT_EQ("someFunction(\n"
8180 " \"aaabbbcc \"\n"
8181 " \"dddeeefff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008182 format("someFunction(\"aaabbbcc dddeeefff\");",
8183 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008184}
8185
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008186TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008187 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8188 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008189 EXPECT_EQ("\"test\"\n"
8190 "\"\\n\"",
8191 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8192 EXPECT_EQ("\"tes\\\\\"\n"
8193 "\"n\"",
8194 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8195 EXPECT_EQ("\"\\\\\\\\\"\n"
8196 "\"\\n\"",
8197 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008198 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008199 EXPECT_EQ("\"\\uff01\"\n"
8200 "\"test\"",
8201 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8202 EXPECT_EQ("\"\\Uff01ff02\"",
8203 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8204 EXPECT_EQ("\"\\x000000000001\"\n"
8205 "\"next\"",
8206 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8207 EXPECT_EQ("\"\\x000000000001next\"",
8208 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8209 EXPECT_EQ("\"\\x000000000001\"",
8210 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8211 EXPECT_EQ("\"test\"\n"
8212 "\"\\000000\"\n"
8213 "\"000001\"",
8214 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8215 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008216 "\"00000000\"\n"
8217 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008218 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008219}
8220
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008221TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8222 verifyFormat("void f() {\n"
8223 " return g() {}\n"
8224 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008225 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008226 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008227 "}");
8228}
8229
Manuel Klimek421147e2014-01-24 09:25:23 +00008230TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8231 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008232 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008233}
8234
Manuel Klimek13b97d82013-05-13 08:42:42 +00008235TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8236 verifyFormat("class X {\n"
8237 " void f() {\n"
8238 " }\n"
8239 "};",
8240 getLLVMStyleWithColumns(12));
8241}
8242
8243TEST_F(FormatTest, ConfigurableIndentWidth) {
8244 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8245 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008246 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008247 verifyFormat("void f() {\n"
8248 " someFunction();\n"
8249 " if (true) {\n"
8250 " f();\n"
8251 " }\n"
8252 "}",
8253 EightIndent);
8254 verifyFormat("class X {\n"
8255 " void f() {\n"
8256 " }\n"
8257 "};",
8258 EightIndent);
8259 verifyFormat("int x[] = {\n"
8260 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008261 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008262 EightIndent);
8263}
8264
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008265TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008266 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008267 "f();",
8268 getLLVMStyleWithColumns(8));
8269}
8270
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008271TEST_F(FormatTest, ConfigurableUseOfTab) {
8272 FormatStyle Tab = getLLVMStyleWithColumns(42);
8273 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008274 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008275 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008276
8277 EXPECT_EQ("if (aaaaaaaa && // q\n"
8278 " bb)\t\t// w\n"
8279 "\t;",
8280 format("if (aaaaaaaa &&// q\n"
8281 "bb)// w\n"
8282 ";",
8283 Tab));
8284 EXPECT_EQ("if (aaa && bbb) // w\n"
8285 "\t;",
8286 format("if(aaa&&bbb)// w\n"
8287 ";",
8288 Tab));
8289
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008290 verifyFormat("class X {\n"
8291 "\tvoid f() {\n"
8292 "\t\tsomeFunction(parameter1,\n"
8293 "\t\t\t parameter2);\n"
8294 "\t}\n"
8295 "};",
8296 Tab);
8297 verifyFormat("#define A \\\n"
8298 "\tvoid f() { \\\n"
8299 "\t\tsomeFunction( \\\n"
8300 "\t\t parameter1, \\\n"
8301 "\t\t parameter2); \\\n"
8302 "\t}",
8303 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008304
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008305 Tab.TabWidth = 4;
8306 Tab.IndentWidth = 8;
8307 verifyFormat("class TabWidth4Indent8 {\n"
8308 "\t\tvoid f() {\n"
8309 "\t\t\t\tsomeFunction(parameter1,\n"
8310 "\t\t\t\t\t\t\t parameter2);\n"
8311 "\t\t}\n"
8312 "};",
8313 Tab);
8314
8315 Tab.TabWidth = 4;
8316 Tab.IndentWidth = 4;
8317 verifyFormat("class TabWidth4Indent4 {\n"
8318 "\tvoid f() {\n"
8319 "\t\tsomeFunction(parameter1,\n"
8320 "\t\t\t\t\t parameter2);\n"
8321 "\t}\n"
8322 "};",
8323 Tab);
8324
8325 Tab.TabWidth = 8;
8326 Tab.IndentWidth = 4;
8327 verifyFormat("class TabWidth8Indent4 {\n"
8328 " void f() {\n"
8329 "\tsomeFunction(parameter1,\n"
8330 "\t\t parameter2);\n"
8331 " }\n"
8332 "};",
8333 Tab);
8334
Alexander Kornienko39856b72013-09-10 09:38:25 +00008335 Tab.TabWidth = 8;
8336 Tab.IndentWidth = 8;
8337 EXPECT_EQ("/*\n"
8338 "\t a\t\tcomment\n"
8339 "\t in multiple lines\n"
8340 " */",
8341 format(" /*\t \t \n"
8342 " \t \t a\t\tcomment\t \t\n"
8343 " \t \t in multiple lines\t\n"
8344 " \t */",
8345 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008346
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008347 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008348 verifyFormat("{\n"
8349 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8350 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8351 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8352 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8353 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8354 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008355 "};",
8356 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008357 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008358 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008359 "\ta2,\n"
8360 "\ta3\n"
8361 "};",
8362 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008363 EXPECT_EQ("if (aaaaaaaa && // q\n"
8364 " bb) // w\n"
8365 "\t;",
8366 format("if (aaaaaaaa &&// q\n"
8367 "bb)// w\n"
8368 ";",
8369 Tab));
8370 verifyFormat("class X {\n"
8371 "\tvoid f() {\n"
8372 "\t\tsomeFunction(parameter1,\n"
8373 "\t\t parameter2);\n"
8374 "\t}\n"
8375 "};",
8376 Tab);
8377 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008378 "\tQ(\n"
8379 "\t {\n"
8380 "\t\t int a;\n"
8381 "\t\t someFunction(aaaaaaaa,\n"
8382 "\t\t bbbbbbb);\n"
8383 "\t },\n"
8384 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008385 "}",
8386 Tab);
8387 EXPECT_EQ("{\n"
8388 "\t/* aaaa\n"
8389 "\t bbbb */\n"
8390 "}",
8391 format("{\n"
8392 "/* aaaa\n"
8393 " bbbb */\n"
8394 "}",
8395 Tab));
8396 EXPECT_EQ("{\n"
8397 "\t/*\n"
8398 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8399 "\t bbbbbbbbbbbbb\n"
8400 "\t*/\n"
8401 "}",
8402 format("{\n"
8403 "/*\n"
8404 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8405 "*/\n"
8406 "}",
8407 Tab));
8408 EXPECT_EQ("{\n"
8409 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8410 "\t// bbbbbbbbbbbbb\n"
8411 "}",
8412 format("{\n"
8413 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8414 "}",
8415 Tab));
8416 EXPECT_EQ("{\n"
8417 "\t/*\n"
8418 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8419 "\t bbbbbbbbbbbbb\n"
8420 "\t*/\n"
8421 "}",
8422 format("{\n"
8423 "\t/*\n"
8424 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8425 "\t*/\n"
8426 "}",
8427 Tab));
8428 EXPECT_EQ("{\n"
8429 "\t/*\n"
8430 "\n"
8431 "\t*/\n"
8432 "}",
8433 format("{\n"
8434 "\t/*\n"
8435 "\n"
8436 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008437 "}",
8438 Tab));
8439 EXPECT_EQ("{\n"
8440 "\t/*\n"
8441 " asdf\n"
8442 "\t*/\n"
8443 "}",
8444 format("{\n"
8445 "\t/*\n"
8446 " asdf\n"
8447 "\t*/\n"
8448 "}",
8449 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008450
8451 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008452 EXPECT_EQ("/*\n"
8453 " a\t\tcomment\n"
8454 " in multiple lines\n"
8455 " */",
8456 format(" /*\t \t \n"
8457 " \t \t a\t\tcomment\t \t\n"
8458 " \t \t in multiple lines\t\n"
8459 " \t */",
8460 Tab));
8461 EXPECT_EQ("/* some\n"
8462 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008463 format(" \t \t /* some\n"
8464 " \t \t comment */",
8465 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008466 EXPECT_EQ("int a; /* some\n"
8467 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008468 format(" \t \t int a; /* some\n"
8469 " \t \t comment */",
8470 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008471
Alexander Kornienko39856b72013-09-10 09:38:25 +00008472 EXPECT_EQ("int a; /* some\n"
8473 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008474 format(" \t \t int\ta; /* some\n"
8475 " \t \t comment */",
8476 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008477 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8478 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008479 format(" \t \t f(\"\t\t\"); /* some\n"
8480 " \t \t comment */",
8481 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008482 EXPECT_EQ("{\n"
8483 " /*\n"
8484 " * Comment\n"
8485 " */\n"
8486 " int i;\n"
8487 "}",
8488 format("{\n"
8489 "\t/*\n"
8490 "\t * Comment\n"
8491 "\t */\n"
8492 "\t int i;\n"
8493 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008494
8495 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8496 Tab.TabWidth = 8;
8497 Tab.IndentWidth = 8;
8498 EXPECT_EQ("if (aaaaaaaa && // q\n"
8499 " bb) // w\n"
8500 "\t;",
8501 format("if (aaaaaaaa &&// q\n"
8502 "bb)// w\n"
8503 ";",
8504 Tab));
8505 EXPECT_EQ("if (aaa && bbb) // w\n"
8506 "\t;",
8507 format("if(aaa&&bbb)// w\n"
8508 ";",
8509 Tab));
8510 verifyFormat("class X {\n"
8511 "\tvoid f() {\n"
8512 "\t\tsomeFunction(parameter1,\n"
8513 "\t\t\t parameter2);\n"
8514 "\t}\n"
8515 "};",
8516 Tab);
8517 verifyFormat("#define A \\\n"
8518 "\tvoid f() { \\\n"
8519 "\t\tsomeFunction( \\\n"
8520 "\t\t parameter1, \\\n"
8521 "\t\t parameter2); \\\n"
8522 "\t}",
8523 Tab);
8524 Tab.TabWidth = 4;
8525 Tab.IndentWidth = 8;
8526 verifyFormat("class TabWidth4Indent8 {\n"
8527 "\t\tvoid f() {\n"
8528 "\t\t\t\tsomeFunction(parameter1,\n"
8529 "\t\t\t\t\t\t\t parameter2);\n"
8530 "\t\t}\n"
8531 "};",
8532 Tab);
8533 Tab.TabWidth = 4;
8534 Tab.IndentWidth = 4;
8535 verifyFormat("class TabWidth4Indent4 {\n"
8536 "\tvoid f() {\n"
8537 "\t\tsomeFunction(parameter1,\n"
8538 "\t\t\t\t\t parameter2);\n"
8539 "\t}\n"
8540 "};",
8541 Tab);
8542 Tab.TabWidth = 8;
8543 Tab.IndentWidth = 4;
8544 verifyFormat("class TabWidth8Indent4 {\n"
8545 " void f() {\n"
8546 "\tsomeFunction(parameter1,\n"
8547 "\t\t parameter2);\n"
8548 " }\n"
8549 "};",
8550 Tab);
8551 Tab.TabWidth = 8;
8552 Tab.IndentWidth = 8;
8553 EXPECT_EQ("/*\n"
8554 "\t a\t\tcomment\n"
8555 "\t in multiple lines\n"
8556 " */",
8557 format(" /*\t \t \n"
8558 " \t \t a\t\tcomment\t \t\n"
8559 " \t \t in multiple lines\t\n"
8560 " \t */",
8561 Tab));
8562 verifyFormat("{\n"
8563 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8564 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8565 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8566 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8567 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8568 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8569 "};",
8570 Tab);
8571 verifyFormat("enum AA {\n"
8572 "\ta1, // Force multiple lines\n"
8573 "\ta2,\n"
8574 "\ta3\n"
8575 "};",
8576 Tab);
8577 EXPECT_EQ("if (aaaaaaaa && // q\n"
8578 " bb) // w\n"
8579 "\t;",
8580 format("if (aaaaaaaa &&// q\n"
8581 "bb)// w\n"
8582 ";",
8583 Tab));
8584 verifyFormat("class X {\n"
8585 "\tvoid f() {\n"
8586 "\t\tsomeFunction(parameter1,\n"
8587 "\t\t\t parameter2);\n"
8588 "\t}\n"
8589 "};",
8590 Tab);
8591 verifyFormat("{\n"
8592 "\tQ(\n"
8593 "\t {\n"
8594 "\t\t int a;\n"
8595 "\t\t someFunction(aaaaaaaa,\n"
8596 "\t\t\t\t bbbbbbb);\n"
8597 "\t },\n"
8598 "\t p);\n"
8599 "}",
8600 Tab);
8601 EXPECT_EQ("{\n"
8602 "\t/* aaaa\n"
8603 "\t bbbb */\n"
8604 "}",
8605 format("{\n"
8606 "/* aaaa\n"
8607 " bbbb */\n"
8608 "}",
8609 Tab));
8610 EXPECT_EQ("{\n"
8611 "\t/*\n"
8612 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8613 "\t bbbbbbbbbbbbb\n"
8614 "\t*/\n"
8615 "}",
8616 format("{\n"
8617 "/*\n"
8618 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8619 "*/\n"
8620 "}",
8621 Tab));
8622 EXPECT_EQ("{\n"
8623 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8624 "\t// bbbbbbbbbbbbb\n"
8625 "}",
8626 format("{\n"
8627 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8628 "}",
8629 Tab));
8630 EXPECT_EQ("{\n"
8631 "\t/*\n"
8632 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8633 "\t bbbbbbbbbbbbb\n"
8634 "\t*/\n"
8635 "}",
8636 format("{\n"
8637 "\t/*\n"
8638 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8639 "\t*/\n"
8640 "}",
8641 Tab));
8642 EXPECT_EQ("{\n"
8643 "\t/*\n"
8644 "\n"
8645 "\t*/\n"
8646 "}",
8647 format("{\n"
8648 "\t/*\n"
8649 "\n"
8650 "\t*/\n"
8651 "}",
8652 Tab));
8653 EXPECT_EQ("{\n"
8654 "\t/*\n"
8655 " asdf\n"
8656 "\t*/\n"
8657 "}",
8658 format("{\n"
8659 "\t/*\n"
8660 " asdf\n"
8661 "\t*/\n"
8662 "}",
8663 Tab));
8664 EXPECT_EQ("/*\n"
8665 "\t a\t\tcomment\n"
8666 "\t in multiple lines\n"
8667 " */",
8668 format(" /*\t \t \n"
8669 " \t \t a\t\tcomment\t \t\n"
8670 " \t \t in multiple lines\t\n"
8671 " \t */",
8672 Tab));
8673 EXPECT_EQ("/* some\n"
8674 " comment */",
8675 format(" \t \t /* some\n"
8676 " \t \t comment */",
8677 Tab));
8678 EXPECT_EQ("int a; /* some\n"
8679 " comment */",
8680 format(" \t \t int a; /* some\n"
8681 " \t \t comment */",
8682 Tab));
8683 EXPECT_EQ("int a; /* some\n"
8684 "comment */",
8685 format(" \t \t int\ta; /* some\n"
8686 " \t \t comment */",
8687 Tab));
8688 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8689 " comment */",
8690 format(" \t \t f(\"\t\t\"); /* some\n"
8691 " \t \t comment */",
8692 Tab));
8693 EXPECT_EQ("{\n"
8694 " /*\n"
8695 " * Comment\n"
8696 " */\n"
8697 " int i;\n"
8698 "}",
8699 format("{\n"
8700 "\t/*\n"
8701 "\t * Comment\n"
8702 "\t */\n"
8703 "\t int i;\n"
8704 "}"));
8705 Tab.AlignConsecutiveAssignments = true;
8706 Tab.AlignConsecutiveDeclarations = true;
8707 Tab.TabWidth = 4;
8708 Tab.IndentWidth = 4;
8709 verifyFormat("class Assign {\n"
8710 "\tvoid f() {\n"
8711 "\t\tint x = 123;\n"
8712 "\t\tint random = 4;\n"
8713 "\t\tstd::string alphabet =\n"
8714 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8715 "\t}\n"
8716 "};",
8717 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008718}
8719
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008720TEST_F(FormatTest, CalculatesOriginalColumn) {
8721 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8722 "q\"; /* some\n"
8723 " comment */",
8724 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8725 "q\"; /* some\n"
8726 " comment */",
8727 getLLVMStyle()));
8728 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8729 "/* some\n"
8730 " comment */",
8731 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8732 " /* some\n"
8733 " comment */",
8734 getLLVMStyle()));
8735 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8736 "qqq\n"
8737 "/* some\n"
8738 " comment */",
8739 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8740 "qqq\n"
8741 " /* some\n"
8742 " comment */",
8743 getLLVMStyle()));
8744 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8745 "wwww; /* some\n"
8746 " comment */",
8747 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8748 "wwww; /* some\n"
8749 " comment */",
8750 getLLVMStyle()));
8751}
8752
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008753TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008754 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008755 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008756
8757 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008758 " continue;",
8759 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008760 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008761 " continue;",
8762 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008763 verifyFormat("if(true)\n"
8764 " f();\n"
8765 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008766 " f();",
8767 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008768 verifyFormat("do {\n"
8769 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008770 "} while(something());",
8771 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008772 verifyFormat("switch(x) {\n"
8773 "default:\n"
8774 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008775 "}",
8776 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008777 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008778 verifyFormat("size_t x = sizeof(x);", NoSpace);
8779 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8780 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8781 verifyFormat("alignas(128) char a[128];", NoSpace);
8782 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8783 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8784 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008785 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008786 verifyFormat("T A::operator()();", NoSpace);
8787 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008788
8789 FormatStyle Space = getLLVMStyle();
8790 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8791
8792 verifyFormat("int f ();", Space);
8793 verifyFormat("void f (int a, T b) {\n"
8794 " while (true)\n"
8795 " continue;\n"
8796 "}",
8797 Space);
8798 verifyFormat("if (true)\n"
8799 " f ();\n"
8800 "else if (true)\n"
8801 " f ();",
8802 Space);
8803 verifyFormat("do {\n"
8804 " do_something ();\n"
8805 "} while (something ());",
8806 Space);
8807 verifyFormat("switch (x) {\n"
8808 "default:\n"
8809 " break;\n"
8810 "}",
8811 Space);
8812 verifyFormat("A::A () : a (1) {}", Space);
8813 verifyFormat("void f () __attribute__ ((asdf));", Space);
8814 verifyFormat("*(&a + 1);\n"
8815 "&((&a)[1]);\n"
8816 "a[(b + c) * d];\n"
8817 "(((a + 1) * 2) + 3) * 4;",
8818 Space);
8819 verifyFormat("#define A(x) x", Space);
8820 verifyFormat("#define A (x) x", Space);
8821 verifyFormat("#if defined(x)\n"
8822 "#endif",
8823 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008824 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008825 verifyFormat("size_t x = sizeof (x);", Space);
8826 verifyFormat("auto f (int x) -> decltype (x);", Space);
8827 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8828 verifyFormat("alignas (128) char a[128];", Space);
8829 verifyFormat("size_t x = alignof (MyType);", Space);
8830 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8831 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008832 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008833 verifyFormat("T A::operator() ();", Space);
8834 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008835}
8836
8837TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8838 FormatStyle Spaces = getLLVMStyle();
8839
8840 Spaces.SpacesInParentheses = true;
Daniel Jasperd5e9ff42018-03-22 14:30:28 +00008841 verifyFormat("do_something( ::globalVar );", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008842 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008843 verifyFormat("call();", Spaces);
8844 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008845 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8846 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008847 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008848 " continue;",
8849 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008850 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008851 " continue;",
8852 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008853 verifyFormat("if ( true )\n"
8854 " f();\n"
8855 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008856 " f();",
8857 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008858 verifyFormat("do {\n"
8859 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008860 "} while ( something() );",
8861 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008862 verifyFormat("switch ( x ) {\n"
8863 "default:\n"
8864 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008865 "}",
8866 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008867
8868 Spaces.SpacesInParentheses = false;
8869 Spaces.SpacesInCStyleCastParentheses = true;
8870 verifyFormat("Type *A = ( Type * )P;", Spaces);
8871 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8872 verifyFormat("x = ( int32 )y;", Spaces);
8873 verifyFormat("int a = ( int )(2.0f);", Spaces);
8874 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8875 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8876 verifyFormat("#define x (( int )-1)", Spaces);
8877
Daniel Jasper92e09822015-03-18 12:59:19 +00008878 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008879 Spaces.SpacesInParentheses = false;
8880 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008881 Spaces.SpacesInCStyleCastParentheses = true;
8882 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008883 verifyFormat("call( );", Spaces);
8884 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008885 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008886 " continue;",
8887 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008888 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008889 " continue;",
8890 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008891 verifyFormat("if (true)\n"
8892 " f( );\n"
8893 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008894 " f( );",
8895 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008896 verifyFormat("do {\n"
8897 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008898 "} while (something( ));",
8899 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008900 verifyFormat("switch (x) {\n"
8901 "default:\n"
8902 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008903 "}",
8904 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008905
Daniel Jasper92e09822015-03-18 12:59:19 +00008906 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008907 Spaces.SpaceAfterCStyleCast = true;
8908 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008909 verifyFormat("call( );", Spaces);
8910 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008911 verifyFormat("while (( bool ) 1)\n"
8912 " continue;",
8913 Spaces);
8914 verifyFormat("for (;;)\n"
8915 " continue;",
8916 Spaces);
8917 verifyFormat("if (true)\n"
8918 " f( );\n"
8919 "else if (true)\n"
8920 " f( );",
8921 Spaces);
8922 verifyFormat("do {\n"
8923 " do_something(( int ) i);\n"
8924 "} while (something( ));",
8925 Spaces);
8926 verifyFormat("switch (x) {\n"
8927 "default:\n"
8928 " break;\n"
8929 "}",
8930 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008931
8932 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008933 Spaces.SpacesInCStyleCastParentheses = false;
8934 Spaces.SpaceAfterCStyleCast = true;
8935 verifyFormat("while ((bool) 1)\n"
8936 " continue;",
8937 Spaces);
8938 verifyFormat("do {\n"
8939 " do_something((int) i);\n"
8940 "} while (something( ));",
8941 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008942}
8943
Daniel Jasperad981f82014-08-26 11:41:14 +00008944TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8945 verifyFormat("int a[5];");
8946 verifyFormat("a[3] += 42;");
8947
8948 FormatStyle Spaces = getLLVMStyle();
8949 Spaces.SpacesInSquareBrackets = true;
8950 // Lambdas unchanged.
8951 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8952 verifyFormat("return [i, args...] {};", Spaces);
8953
8954 // Not lambdas.
8955 verifyFormat("int a[ 5 ];", Spaces);
8956 verifyFormat("a[ 3 ] += 42;", Spaces);
8957 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8958 verifyFormat("double &operator[](int i) { return 0; }\n"
8959 "int i;",
8960 Spaces);
8961 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8962 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8963 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8964}
8965
Daniel Jasperd94bff32013-09-25 15:15:02 +00008966TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8967 verifyFormat("int a = 5;");
8968 verifyFormat("a += 42;");
8969 verifyFormat("a or_eq 8;");
8970
8971 FormatStyle Spaces = getLLVMStyle();
8972 Spaces.SpaceBeforeAssignmentOperators = false;
8973 verifyFormat("int a= 5;", Spaces);
8974 verifyFormat("a+= 42;", Spaces);
8975 verifyFormat("a or_eq 8;", Spaces);
8976}
8977
Francois Ferrand2a9ea782018-03-01 10:09:13 +00008978TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
8979 verifyFormat("class Foo : public Bar {};");
8980 verifyFormat("Foo::Foo() : foo(1) {}");
8981 verifyFormat("for (auto a : b) {\n}");
8982 verifyFormat("int x = a ? b : c;");
8983 verifyFormat("{\n"
8984 "label0:\n"
8985 " int x = 0;\n"
8986 "}");
8987 verifyFormat("switch (x) {\n"
8988 "case 1:\n"
8989 "default:\n"
8990 "}");
8991
8992 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
8993 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
8994 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
8995 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
8996 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
8997 verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
8998 verifyFormat("{\n"
8999 "label1:\n"
9000 " int x = 0;\n"
9001 "}",
9002 CtorInitializerStyle);
9003 verifyFormat("switch (x) {\n"
9004 "case 1:\n"
9005 "default:\n"
9006 "}",
9007 CtorInitializerStyle);
9008 CtorInitializerStyle.BreakConstructorInitializers =
9009 FormatStyle::BCIS_AfterColon;
9010 verifyFormat("Fooooooooooo::Fooooooooooo():\n"
9011 " aaaaaaaaaaaaaaaa(1),\n"
9012 " bbbbbbbbbbbbbbbb(2) {}",
9013 CtorInitializerStyle);
9014 CtorInitializerStyle.BreakConstructorInitializers =
9015 FormatStyle::BCIS_BeforeComma;
9016 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9017 " : aaaaaaaaaaaaaaaa(1)\n"
9018 " , bbbbbbbbbbbbbbbb(2) {}",
9019 CtorInitializerStyle);
9020 CtorInitializerStyle.BreakConstructorInitializers =
9021 FormatStyle::BCIS_BeforeColon;
9022 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9023 " : aaaaaaaaaaaaaaaa(1),\n"
9024 " bbbbbbbbbbbbbbbb(2) {}",
9025 CtorInitializerStyle);
9026 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
9027 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9028 ": aaaaaaaaaaaaaaaa(1),\n"
9029 " bbbbbbbbbbbbbbbb(2) {}",
9030 CtorInitializerStyle);
9031
9032 FormatStyle InheritanceStyle = getLLVMStyle();
9033 InheritanceStyle.SpaceBeforeInheritanceColon = false;
9034 verifyFormat("class Foo: public Bar {};", InheritanceStyle);
9035 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
9036 verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
9037 verifyFormat("int x = a ? b : c;", InheritanceStyle);
9038 verifyFormat("{\n"
9039 "label2:\n"
9040 " int x = 0;\n"
9041 "}",
9042 InheritanceStyle);
9043 verifyFormat("switch (x) {\n"
9044 "case 1:\n"
9045 "default:\n"
9046 "}",
9047 InheritanceStyle);
9048
9049 FormatStyle ForLoopStyle = getLLVMStyle();
9050 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
9051 verifyFormat("class Foo : public Bar {};", ForLoopStyle);
9052 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
9053 verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
9054 verifyFormat("int x = a ? b : c;", ForLoopStyle);
9055 verifyFormat("{\n"
9056 "label2:\n"
9057 " int x = 0;\n"
9058 "}",
9059 ForLoopStyle);
9060 verifyFormat("switch (x) {\n"
9061 "case 1:\n"
9062 "default:\n"
9063 "}",
9064 ForLoopStyle);
9065
9066 FormatStyle NoSpaceStyle = getLLVMStyle();
9067 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
9068 NoSpaceStyle.SpaceBeforeInheritanceColon = false;
9069 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
9070 verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
9071 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
9072 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
9073 verifyFormat("int x = a ? b : c;", NoSpaceStyle);
9074 verifyFormat("{\n"
9075 "label3:\n"
9076 " int x = 0;\n"
9077 "}",
9078 NoSpaceStyle);
9079 verifyFormat("switch (x) {\n"
9080 "case 1:\n"
9081 "default:\n"
9082 "}",
9083 NoSpaceStyle);
9084}
9085
Daniel Jaspera44991332015-04-29 13:06:49 +00009086TEST_F(FormatTest, AlignConsecutiveAssignments) {
9087 FormatStyle Alignment = getLLVMStyle();
9088 Alignment.AlignConsecutiveAssignments = false;
9089 verifyFormat("int a = 5;\n"
9090 "int oneTwoThree = 123;",
9091 Alignment);
9092 verifyFormat("int a = 5;\n"
9093 "int oneTwoThree = 123;",
9094 Alignment);
9095
9096 Alignment.AlignConsecutiveAssignments = true;
9097 verifyFormat("int a = 5;\n"
9098 "int oneTwoThree = 123;",
9099 Alignment);
9100 verifyFormat("int a = method();\n"
9101 "int oneTwoThree = 133;",
9102 Alignment);
9103 verifyFormat("a &= 5;\n"
9104 "bcd *= 5;\n"
9105 "ghtyf += 5;\n"
9106 "dvfvdb -= 5;\n"
9107 "a /= 5;\n"
9108 "vdsvsv %= 5;\n"
9109 "sfdbddfbdfbb ^= 5;\n"
9110 "dvsdsv |= 5;\n"
9111 "int dsvvdvsdvvv = 123;",
9112 Alignment);
9113 verifyFormat("int i = 1, j = 10;\n"
9114 "something = 2000;",
9115 Alignment);
9116 verifyFormat("something = 2000;\n"
9117 "int i = 1, j = 10;\n",
9118 Alignment);
9119 verifyFormat("something = 2000;\n"
9120 "another = 911;\n"
9121 "int i = 1, j = 10;\n"
9122 "oneMore = 1;\n"
9123 "i = 2;",
9124 Alignment);
9125 verifyFormat("int a = 5;\n"
9126 "int one = 1;\n"
9127 "method();\n"
9128 "int oneTwoThree = 123;\n"
9129 "int oneTwo = 12;",
9130 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009131 verifyFormat("int oneTwoThree = 123;\n"
9132 "int oneTwo = 12;\n"
9133 "method();\n",
9134 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009135 verifyFormat("int oneTwoThree = 123; // comment\n"
9136 "int oneTwo = 12; // comment",
9137 Alignment);
9138 EXPECT_EQ("int a = 5;\n"
9139 "\n"
9140 "int oneTwoThree = 123;",
9141 format("int a = 5;\n"
9142 "\n"
9143 "int oneTwoThree= 123;",
9144 Alignment));
9145 EXPECT_EQ("int a = 5;\n"
9146 "int one = 1;\n"
9147 "\n"
9148 "int oneTwoThree = 123;",
9149 format("int a = 5;\n"
9150 "int one = 1;\n"
9151 "\n"
9152 "int oneTwoThree = 123;",
9153 Alignment));
9154 EXPECT_EQ("int a = 5;\n"
9155 "int one = 1;\n"
9156 "\n"
9157 "int oneTwoThree = 123;\n"
9158 "int oneTwo = 12;",
9159 format("int a = 5;\n"
9160 "int one = 1;\n"
9161 "\n"
9162 "int oneTwoThree = 123;\n"
9163 "int oneTwo = 12;",
9164 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009165 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9166 verifyFormat("#define A \\\n"
9167 " int aaaa = 12; \\\n"
9168 " int b = 23; \\\n"
9169 " int ccc = 234; \\\n"
9170 " int dddddddddd = 2345;",
9171 Alignment);
9172 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00009173 verifyFormat("#define A \\\n"
9174 " int aaaa = 12; \\\n"
9175 " int b = 23; \\\n"
9176 " int ccc = 234; \\\n"
9177 " int dddddddddd = 2345;",
9178 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009179 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00009180 verifyFormat("#define A "
9181 " \\\n"
9182 " int aaaa = 12; "
9183 " \\\n"
9184 " int b = 23; "
9185 " \\\n"
9186 " int ccc = 234; "
9187 " \\\n"
9188 " int dddddddddd = 2345;",
9189 Alignment);
9190 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9191 "k = 4, int l = 5,\n"
9192 " int m = 6) {\n"
9193 " int j = 10;\n"
9194 " otherThing = 1;\n"
9195 "}",
9196 Alignment);
9197 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9198 " int i = 1;\n"
9199 " int j = 2;\n"
9200 " int big = 10000;\n"
9201 "}",
9202 Alignment);
9203 verifyFormat("class C {\n"
9204 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009205 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009206 " virtual void f() = 0;\n"
9207 "};",
9208 Alignment);
9209 verifyFormat("int i = 1;\n"
9210 "if (SomeType t = getSomething()) {\n"
9211 "}\n"
9212 "int j = 2;\n"
9213 "int big = 10000;",
9214 Alignment);
9215 verifyFormat("int j = 7;\n"
9216 "for (int k = 0; k < N; ++k) {\n"
9217 "}\n"
9218 "int j = 2;\n"
9219 "int big = 10000;\n"
9220 "}",
9221 Alignment);
9222 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9223 verifyFormat("int i = 1;\n"
9224 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9225 " = someLooooooooooooooooongFunction();\n"
9226 "int j = 2;",
9227 Alignment);
9228 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9229 verifyFormat("int i = 1;\n"
9230 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9231 " someLooooooooooooooooongFunction();\n"
9232 "int j = 2;",
9233 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009234
9235 verifyFormat("auto lambda = []() {\n"
9236 " auto i = 0;\n"
9237 " return 0;\n"
9238 "};\n"
9239 "int i = 0;\n"
9240 "auto v = type{\n"
9241 " i = 1, //\n"
9242 " (i = 2), //\n"
9243 " i = 3 //\n"
9244 "};",
9245 Alignment);
9246
Daniel Jaspera44991332015-04-29 13:06:49 +00009247 verifyFormat(
9248 "int i = 1;\n"
9249 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9250 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009251 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00009252 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009253
9254 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9255 " typename B = very_long_type_name_1,\n"
9256 " typename T_2 = very_long_type_name_2>\n"
9257 "auto foo() {}\n",
9258 Alignment);
9259 verifyFormat("int a, b = 1;\n"
9260 "int c = 2;\n"
9261 "int dd = 3;\n",
9262 Alignment);
9263 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9264 "float b[1][] = {{3.f}};\n",
9265 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009266 verifyFormat("for (int i = 0; i < 1; i++)\n"
9267 " int x = 1;\n",
9268 Alignment);
9269 verifyFormat("for (i = 0; i < 1; i++)\n"
9270 " x = 1;\n"
9271 "y = 1;\n",
9272 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009273}
9274
Daniel Jaspere12597c2015-10-01 10:06:54 +00009275TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9276 FormatStyle Alignment = getLLVMStyle();
9277 Alignment.AlignConsecutiveDeclarations = false;
9278 verifyFormat("float const a = 5;\n"
9279 "int oneTwoThree = 123;",
9280 Alignment);
9281 verifyFormat("int a = 5;\n"
9282 "float const oneTwoThree = 123;",
9283 Alignment);
9284
9285 Alignment.AlignConsecutiveDeclarations = true;
9286 verifyFormat("float const a = 5;\n"
9287 "int oneTwoThree = 123;",
9288 Alignment);
9289 verifyFormat("int a = method();\n"
9290 "float const oneTwoThree = 133;",
9291 Alignment);
9292 verifyFormat("int i = 1, j = 10;\n"
9293 "something = 2000;",
9294 Alignment);
9295 verifyFormat("something = 2000;\n"
9296 "int i = 1, j = 10;\n",
9297 Alignment);
9298 verifyFormat("float something = 2000;\n"
9299 "double another = 911;\n"
9300 "int i = 1, j = 10;\n"
9301 "const int *oneMore = 1;\n"
9302 "unsigned i = 2;",
9303 Alignment);
9304 verifyFormat("float a = 5;\n"
9305 "int one = 1;\n"
9306 "method();\n"
9307 "const double oneTwoThree = 123;\n"
9308 "const unsigned int oneTwo = 12;",
9309 Alignment);
9310 verifyFormat("int oneTwoThree{0}; // comment\n"
9311 "unsigned oneTwo; // comment",
9312 Alignment);
9313 EXPECT_EQ("float const a = 5;\n"
9314 "\n"
9315 "int oneTwoThree = 123;",
9316 format("float const a = 5;\n"
9317 "\n"
9318 "int oneTwoThree= 123;",
9319 Alignment));
9320 EXPECT_EQ("float a = 5;\n"
9321 "int one = 1;\n"
9322 "\n"
9323 "unsigned oneTwoThree = 123;",
9324 format("float a = 5;\n"
9325 "int one = 1;\n"
9326 "\n"
9327 "unsigned oneTwoThree = 123;",
9328 Alignment));
9329 EXPECT_EQ("float a = 5;\n"
9330 "int one = 1;\n"
9331 "\n"
9332 "unsigned oneTwoThree = 123;\n"
9333 "int oneTwo = 12;",
9334 format("float a = 5;\n"
9335 "int one = 1;\n"
9336 "\n"
9337 "unsigned oneTwoThree = 123;\n"
9338 "int oneTwo = 12;",
9339 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009340 // Function prototype alignment
9341 verifyFormat("int a();\n"
9342 "double b();",
9343 Alignment);
9344 verifyFormat("int a(int x);\n"
9345 "double b();",
9346 Alignment);
9347 unsigned OldColumnLimit = Alignment.ColumnLimit;
9348 // We need to set ColumnLimit to zero, in order to stress nested alignments,
9349 // otherwise the function parameters will be re-flowed onto a single line.
9350 Alignment.ColumnLimit = 0;
9351 EXPECT_EQ("int a(int x,\n"
9352 " float y);\n"
9353 "double b(int x,\n"
9354 " double y);",
9355 format("int a(int x,\n"
9356 " float y);\n"
9357 "double b(int x,\n"
9358 " double y);",
9359 Alignment));
9360 // This ensures that function parameters of function declarations are
9361 // correctly indented when their owning functions are indented.
9362 // The failure case here is for 'double y' to not be indented enough.
9363 EXPECT_EQ("double a(int x);\n"
9364 "int b(int y,\n"
9365 " double z);",
9366 format("double a(int x);\n"
9367 "int b(int y,\n"
9368 " double z);",
9369 Alignment));
9370 // Set ColumnLimit low so that we induce wrapping immediately after
9371 // the function name and opening paren.
9372 Alignment.ColumnLimit = 13;
9373 verifyFormat("int function(\n"
9374 " int x,\n"
9375 " bool y);",
9376 Alignment);
9377 Alignment.ColumnLimit = OldColumnLimit;
9378 // Ensure function pointers don't screw up recursive alignment
9379 verifyFormat("int a(int x, void (*fp)(int y));\n"
9380 "double b();",
9381 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009382 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009383 // Ensure recursive alignment is broken by function braces, so that the
9384 // "a = 1" does not align with subsequent assignments inside the function
9385 // body.
9386 verifyFormat("int func(int a = 1) {\n"
9387 " int b = 2;\n"
9388 " int cc = 3;\n"
9389 "}",
9390 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009391 verifyFormat("float something = 2000;\n"
9392 "double another = 911;\n"
9393 "int i = 1, j = 10;\n"
9394 "const int *oneMore = 1;\n"
9395 "unsigned i = 2;",
9396 Alignment);
9397 verifyFormat("int oneTwoThree = {0}; // comment\n"
9398 "unsigned oneTwo = 0; // comment",
9399 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009400 // Make sure that scope is correctly tracked, in the absence of braces
9401 verifyFormat("for (int i = 0; i < n; i++)\n"
9402 " j = i;\n"
9403 "double x = 1;\n",
9404 Alignment);
9405 verifyFormat("if (int i = 0)\n"
9406 " j = i;\n"
9407 "double x = 1;\n",
9408 Alignment);
9409 // Ensure operator[] and operator() are comprehended
9410 verifyFormat("struct test {\n"
9411 " long long int foo();\n"
9412 " int operator[](int a);\n"
9413 " double bar();\n"
9414 "};\n",
9415 Alignment);
9416 verifyFormat("struct test {\n"
9417 " long long int foo();\n"
9418 " int operator()(int a);\n"
9419 " double bar();\n"
9420 "};\n",
9421 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009422 EXPECT_EQ("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 format("void SomeFunction(int parameter= 0) {\n"
9434 " int const i= 1;\n"
9435 " int *j=2;\n"
9436 " int big = 10000;\n"
9437 "\n"
9438 "unsigned oneTwoThree =123;\n"
9439 "int oneTwo = 12;\n"
9440 " method();\n"
9441 "float k= 2;\n"
9442 "int ll=10000;\n"
9443 "}",
9444 Alignment));
9445 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009446 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9447 verifyFormat("#define A \\\n"
9448 " int aaaa = 12; \\\n"
9449 " float b = 23; \\\n"
9450 " const int ccc = 234; \\\n"
9451 " unsigned dddddddddd = 2345;",
9452 Alignment);
9453 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009454 verifyFormat("#define A \\\n"
9455 " int aaaa = 12; \\\n"
9456 " float b = 23; \\\n"
9457 " const int ccc = 234; \\\n"
9458 " unsigned dddddddddd = 2345;",
9459 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009460 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009461 Alignment.ColumnLimit = 30;
9462 verifyFormat("#define A \\\n"
9463 " int aaaa = 12; \\\n"
9464 " float b = 23; \\\n"
9465 " const int ccc = 234; \\\n"
9466 " int dddddddddd = 2345;",
9467 Alignment);
9468 Alignment.ColumnLimit = 80;
9469 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9470 "k = 4, int l = 5,\n"
9471 " int m = 6) {\n"
9472 " const int j = 10;\n"
9473 " otherThing = 1;\n"
9474 "}",
9475 Alignment);
9476 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9477 " int const i = 1;\n"
9478 " int * j = 2;\n"
9479 " int big = 10000;\n"
9480 "}",
9481 Alignment);
9482 verifyFormat("class C {\n"
9483 "public:\n"
9484 " int i = 1;\n"
9485 " virtual void f() = 0;\n"
9486 "};",
9487 Alignment);
9488 verifyFormat("float i = 1;\n"
9489 "if (SomeType t = getSomething()) {\n"
9490 "}\n"
9491 "const unsigned j = 2;\n"
9492 "int big = 10000;",
9493 Alignment);
9494 verifyFormat("float j = 7;\n"
9495 "for (int k = 0; k < N; ++k) {\n"
9496 "}\n"
9497 "unsigned j = 2;\n"
9498 "int big = 10000;\n"
9499 "}",
9500 Alignment);
9501 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9502 verifyFormat("float i = 1;\n"
9503 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9504 " = someLooooooooooooooooongFunction();\n"
9505 "int j = 2;",
9506 Alignment);
9507 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9508 verifyFormat("int i = 1;\n"
9509 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9510 " someLooooooooooooooooongFunction();\n"
9511 "int j = 2;",
9512 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009513
9514 Alignment.AlignConsecutiveAssignments = true;
9515 verifyFormat("auto lambda = []() {\n"
9516 " auto ii = 0;\n"
9517 " float j = 0;\n"
9518 " return 0;\n"
9519 "};\n"
9520 "int i = 0;\n"
9521 "float i2 = 0;\n"
9522 "auto v = type{\n"
9523 " i = 1, //\n"
9524 " (i = 2), //\n"
9525 " i = 3 //\n"
9526 "};",
9527 Alignment);
9528 Alignment.AlignConsecutiveAssignments = false;
9529
Daniel Jaspere12597c2015-10-01 10:06:54 +00009530 verifyFormat(
9531 "int i = 1;\n"
9532 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9533 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009534 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009535 Alignment);
9536
9537 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9538 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009539 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00009540 // happens.
9541 Alignment.AlignConsecutiveAssignments = true;
9542 Alignment.ColumnLimit = 30;
9543 verifyFormat("float ii = 1;\n"
9544 "unsigned j = 2;\n"
9545 "int someVerylongVariable = 1;\n"
9546 "AnotherLongType ll = 123456;\n"
9547 "VeryVeryLongType k = 2;\n"
9548 "int myvar = 1;",
9549 Alignment);
9550 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009551 Alignment.AlignConsecutiveAssignments = false;
9552
9553 verifyFormat(
9554 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9555 " typename LongType, typename B>\n"
9556 "auto foo() {}\n",
9557 Alignment);
9558 verifyFormat("float a, b = 1;\n"
9559 "int c = 2;\n"
9560 "int dd = 3;\n",
9561 Alignment);
9562 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9563 "float b[1][] = {{3.f}};\n",
9564 Alignment);
9565 Alignment.AlignConsecutiveAssignments = true;
9566 verifyFormat("float a, b = 1;\n"
9567 "int c = 2;\n"
9568 "int dd = 3;\n",
9569 Alignment);
9570 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9571 "float b[1][] = {{3.f}};\n",
9572 Alignment);
9573 Alignment.AlignConsecutiveAssignments = false;
9574
9575 Alignment.ColumnLimit = 30;
9576 Alignment.BinPackParameters = false;
9577 verifyFormat("void foo(float a,\n"
9578 " float b,\n"
9579 " int c,\n"
9580 " uint32_t *d) {\n"
9581 " int * e = 0;\n"
9582 " float f = 0;\n"
9583 " double g = 0;\n"
9584 "}\n"
9585 "void bar(ino_t a,\n"
9586 " int b,\n"
9587 " uint32_t *c,\n"
9588 " bool d) {}\n",
9589 Alignment);
9590 Alignment.BinPackParameters = true;
9591 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +00009592
9593 // Bug 33507
9594 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
9595 verifyFormat(
9596 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
9597 " static const Version verVs2017;\n"
9598 " return true;\n"
9599 "});\n",
9600 Alignment);
9601 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009602}
9603
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009604TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009605 FormatStyle LinuxBraceStyle = getLLVMStyle();
9606 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009607 verifyFormat("namespace a\n"
9608 "{\n"
9609 "class A\n"
9610 "{\n"
9611 " void f()\n"
9612 " {\n"
9613 " if (true) {\n"
9614 " a();\n"
9615 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009616 " } else {\n"
9617 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009618 " }\n"
9619 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009620 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009621 "};\n"
9622 "struct B {\n"
9623 " int x;\n"
9624 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009625 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009626 LinuxBraceStyle);
9627 verifyFormat("enum X {\n"
9628 " Y = 0,\n"
9629 "}\n",
9630 LinuxBraceStyle);
9631 verifyFormat("struct S {\n"
9632 " int Type;\n"
9633 " union {\n"
9634 " int x;\n"
9635 " double y;\n"
9636 " } Value;\n"
9637 " class C\n"
9638 " {\n"
9639 " MyFavoriteType Value;\n"
9640 " } Class;\n"
9641 "}\n",
9642 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009643}
9644
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009645TEST_F(FormatTest, MozillaBraceBreaking) {
9646 FormatStyle MozillaBraceStyle = getLLVMStyle();
9647 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009648 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009649 verifyFormat("namespace a {\n"
9650 "class A\n"
9651 "{\n"
9652 " void f()\n"
9653 " {\n"
9654 " if (true) {\n"
9655 " a();\n"
9656 " b();\n"
9657 " }\n"
9658 " }\n"
9659 " void g() { return; }\n"
9660 "};\n"
9661 "enum E\n"
9662 "{\n"
9663 " A,\n"
9664 " // foo\n"
9665 " B,\n"
9666 " C\n"
9667 "};\n"
9668 "struct B\n"
9669 "{\n"
9670 " int x;\n"
9671 "};\n"
9672 "}\n",
9673 MozillaBraceStyle);
9674 verifyFormat("struct S\n"
9675 "{\n"
9676 " int Type;\n"
9677 " union\n"
9678 " {\n"
9679 " int x;\n"
9680 " double y;\n"
9681 " } Value;\n"
9682 " class C\n"
9683 " {\n"
9684 " MyFavoriteType Value;\n"
9685 " } Class;\n"
9686 "}\n",
9687 MozillaBraceStyle);
9688}
9689
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009690TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009691 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9692 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009693 verifyFormat("namespace a {\n"
9694 "class A {\n"
9695 " void f()\n"
9696 " {\n"
9697 " if (true) {\n"
9698 " a();\n"
9699 " b();\n"
9700 " }\n"
9701 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009702 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009703 "};\n"
9704 "struct B {\n"
9705 " int x;\n"
9706 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00009707 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009708 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009709
Daniel Jasperd9670872014-08-05 12:06:20 +00009710 verifyFormat("void foo()\n"
9711 "{\n"
9712 " if (a) {\n"
9713 " a();\n"
9714 " }\n"
9715 " else {\n"
9716 " b();\n"
9717 " }\n"
9718 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009719 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009720
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009721 verifyFormat("#ifdef _DEBUG\n"
9722 "int foo(int i = 0)\n"
9723 "#else\n"
9724 "int foo(int i = 5)\n"
9725 "#endif\n"
9726 "{\n"
9727 " return i;\n"
9728 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009729 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009730
9731 verifyFormat("void foo() {}\n"
9732 "void bar()\n"
9733 "#ifdef _DEBUG\n"
9734 "{\n"
9735 " foo();\n"
9736 "}\n"
9737 "#else\n"
9738 "{\n"
9739 "}\n"
9740 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009741 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009742
9743 verifyFormat("void foobar() { int i = 5; }\n"
9744 "#ifdef _DEBUG\n"
9745 "void bar() {}\n"
9746 "#else\n"
9747 "void bar() { foobar(); }\n"
9748 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009749 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009750}
9751
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009752TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009753 FormatStyle AllmanBraceStyle = getLLVMStyle();
9754 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009755
9756 EXPECT_EQ("namespace a\n"
9757 "{\n"
9758 "void f();\n"
9759 "void g();\n"
9760 "} // namespace a\n",
9761 format("namespace a\n"
9762 "{\n"
9763 "void f();\n"
9764 "void g();\n"
9765 "}\n",
9766 AllmanBraceStyle));
9767
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009768 verifyFormat("namespace a\n"
9769 "{\n"
9770 "class A\n"
9771 "{\n"
9772 " void f()\n"
9773 " {\n"
9774 " if (true)\n"
9775 " {\n"
9776 " a();\n"
9777 " b();\n"
9778 " }\n"
9779 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009780 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009781 "};\n"
9782 "struct B\n"
9783 "{\n"
9784 " int x;\n"
9785 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009786 "} // namespace a",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009787 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009788
9789 verifyFormat("void f()\n"
9790 "{\n"
9791 " if (true)\n"
9792 " {\n"
9793 " a();\n"
9794 " }\n"
9795 " else if (false)\n"
9796 " {\n"
9797 " b();\n"
9798 " }\n"
9799 " else\n"
9800 " {\n"
9801 " c();\n"
9802 " }\n"
9803 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009804 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009805
9806 verifyFormat("void f()\n"
9807 "{\n"
9808 " for (int i = 0; i < 10; ++i)\n"
9809 " {\n"
9810 " a();\n"
9811 " }\n"
9812 " while (false)\n"
9813 " {\n"
9814 " b();\n"
9815 " }\n"
9816 " do\n"
9817 " {\n"
9818 " c();\n"
9819 " } while (false)\n"
9820 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009821 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009822
9823 verifyFormat("void f(int a)\n"
9824 "{\n"
9825 " switch (a)\n"
9826 " {\n"
9827 " case 0:\n"
9828 " break;\n"
9829 " case 1:\n"
9830 " {\n"
9831 " break;\n"
9832 " }\n"
9833 " case 2:\n"
9834 " {\n"
9835 " }\n"
9836 " break;\n"
9837 " default:\n"
9838 " break;\n"
9839 " }\n"
9840 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009841 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009842
9843 verifyFormat("enum X\n"
9844 "{\n"
9845 " Y = 0,\n"
9846 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009847 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009848 verifyFormat("enum X\n"
9849 "{\n"
9850 " Y = 0\n"
9851 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009852 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009853
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009854 verifyFormat("@interface BSApplicationController ()\n"
9855 "{\n"
9856 "@private\n"
9857 " id _extraIvar;\n"
9858 "}\n"
9859 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009860 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009861
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009862 verifyFormat("#ifdef _DEBUG\n"
9863 "int foo(int i = 0)\n"
9864 "#else\n"
9865 "int foo(int i = 5)\n"
9866 "#endif\n"
9867 "{\n"
9868 " return i;\n"
9869 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009870 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009871
9872 verifyFormat("void foo() {}\n"
9873 "void bar()\n"
9874 "#ifdef _DEBUG\n"
9875 "{\n"
9876 " foo();\n"
9877 "}\n"
9878 "#else\n"
9879 "{\n"
9880 "}\n"
9881 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009882 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009883
9884 verifyFormat("void foobar() { int i = 5; }\n"
9885 "#ifdef _DEBUG\n"
9886 "void bar() {}\n"
9887 "#else\n"
9888 "void bar() { foobar(); }\n"
9889 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009890 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009891
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009892 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009893 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009894 " // ...\n"
9895 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009896 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009897 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009898 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009899 " // ...\n"
9900 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009901 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009902 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009903 // .. or dict literals.
9904 verifyFormat("void f()\n"
9905 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00009906 " // ...\n"
9907 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
9908 "}",
9909 AllmanBraceStyle);
9910 verifyFormat("void f()\n"
9911 "{\n"
9912 " // ...\n"
9913 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009914 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009915 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009916 verifyFormat("int f()\n"
9917 "{ // comment\n"
9918 " return 42;\n"
9919 "}",
9920 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009921
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009922 AllmanBraceStyle.ColumnLimit = 19;
9923 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9924 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009925 verifyFormat("void f()\n"
9926 "{\n"
9927 " int i;\n"
9928 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009929 AllmanBraceStyle);
9930 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009931
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009932 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009933 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9934 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9935 verifyFormat("void f(bool b)\n"
9936 "{\n"
9937 " if (b)\n"
9938 " {\n"
9939 " return;\n"
9940 " }\n"
9941 "}\n",
9942 BreakBeforeBraceShortIfs);
9943 verifyFormat("void f(bool b)\n"
9944 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009945 " if constexpr (b)\n"
9946 " {\n"
9947 " return;\n"
9948 " }\n"
9949 "}\n",
9950 BreakBeforeBraceShortIfs);
9951 verifyFormat("void f(bool b)\n"
9952 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009953 " if (b) return;\n"
9954 "}\n",
9955 BreakBeforeBraceShortIfs);
9956 verifyFormat("void f(bool b)\n"
9957 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009958 " if constexpr (b) return;\n"
9959 "}\n",
9960 BreakBeforeBraceShortIfs);
9961 verifyFormat("void f(bool b)\n"
9962 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009963 " while (b)\n"
9964 " {\n"
9965 " return;\n"
9966 " }\n"
9967 "}\n",
9968 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009969}
9970
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009971TEST_F(FormatTest, GNUBraceBreaking) {
9972 FormatStyle GNUBraceStyle = getLLVMStyle();
9973 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9974 verifyFormat("namespace a\n"
9975 "{\n"
9976 "class A\n"
9977 "{\n"
9978 " void f()\n"
9979 " {\n"
9980 " int a;\n"
9981 " {\n"
9982 " int b;\n"
9983 " }\n"
9984 " if (true)\n"
9985 " {\n"
9986 " a();\n"
9987 " b();\n"
9988 " }\n"
9989 " }\n"
9990 " void g() { return; }\n"
9991 "}\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009992 "} // namespace a",
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009993 GNUBraceStyle);
9994
9995 verifyFormat("void f()\n"
9996 "{\n"
9997 " if (true)\n"
9998 " {\n"
9999 " a();\n"
10000 " }\n"
10001 " else if (false)\n"
10002 " {\n"
10003 " b();\n"
10004 " }\n"
10005 " else\n"
10006 " {\n"
10007 " c();\n"
10008 " }\n"
10009 "}\n",
10010 GNUBraceStyle);
10011
10012 verifyFormat("void f()\n"
10013 "{\n"
10014 " for (int i = 0; i < 10; ++i)\n"
10015 " {\n"
10016 " a();\n"
10017 " }\n"
10018 " while (false)\n"
10019 " {\n"
10020 " b();\n"
10021 " }\n"
10022 " do\n"
10023 " {\n"
10024 " c();\n"
10025 " }\n"
10026 " while (false);\n"
10027 "}\n",
10028 GNUBraceStyle);
10029
10030 verifyFormat("void f(int a)\n"
10031 "{\n"
10032 " switch (a)\n"
10033 " {\n"
10034 " case 0:\n"
10035 " break;\n"
10036 " case 1:\n"
10037 " {\n"
10038 " break;\n"
10039 " }\n"
10040 " case 2:\n"
10041 " {\n"
10042 " }\n"
10043 " break;\n"
10044 " default:\n"
10045 " break;\n"
10046 " }\n"
10047 "}\n",
10048 GNUBraceStyle);
10049
10050 verifyFormat("enum X\n"
10051 "{\n"
10052 " Y = 0,\n"
10053 "}\n",
10054 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010055
10056 verifyFormat("@interface BSApplicationController ()\n"
10057 "{\n"
10058 "@private\n"
10059 " id _extraIvar;\n"
10060 "}\n"
10061 "@end\n",
10062 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010063
10064 verifyFormat("#ifdef _DEBUG\n"
10065 "int foo(int i = 0)\n"
10066 "#else\n"
10067 "int foo(int i = 5)\n"
10068 "#endif\n"
10069 "{\n"
10070 " return i;\n"
10071 "}",
10072 GNUBraceStyle);
10073
10074 verifyFormat("void foo() {}\n"
10075 "void bar()\n"
10076 "#ifdef _DEBUG\n"
10077 "{\n"
10078 " foo();\n"
10079 "}\n"
10080 "#else\n"
10081 "{\n"
10082 "}\n"
10083 "#endif",
10084 GNUBraceStyle);
10085
10086 verifyFormat("void foobar() { int i = 5; }\n"
10087 "#ifdef _DEBUG\n"
10088 "void bar() {}\n"
10089 "#else\n"
10090 "void bar() { foobar(); }\n"
10091 "#endif",
10092 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010093}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010094
10095TEST_F(FormatTest, WebKitBraceBreaking) {
10096 FormatStyle WebKitBraceStyle = getLLVMStyle();
10097 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010098 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010099 verifyFormat("namespace a {\n"
10100 "class A {\n"
10101 " void f()\n"
10102 " {\n"
10103 " if (true) {\n"
10104 " a();\n"
10105 " b();\n"
10106 " }\n"
10107 " }\n"
10108 " void g() { return; }\n"
10109 "};\n"
10110 "enum E {\n"
10111 " A,\n"
10112 " // foo\n"
10113 " B,\n"
10114 " C\n"
10115 "};\n"
10116 "struct B {\n"
10117 " int x;\n"
10118 "};\n"
10119 "}\n",
10120 WebKitBraceStyle);
10121 verifyFormat("struct S {\n"
10122 " int Type;\n"
10123 " union {\n"
10124 " int x;\n"
10125 " double y;\n"
10126 " } Value;\n"
10127 " class C {\n"
10128 " MyFavoriteType Value;\n"
10129 " } Class;\n"
10130 "};\n",
10131 WebKitBraceStyle);
10132}
10133
Manuel Klimekd5735502013-08-12 03:51:17 +000010134TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10135 verifyFormat("void f() {\n"
10136 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010137 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010138 " }\n"
10139 "}\n",
10140 getLLVMStyle());
10141}
10142
Daniel Jasper9613c812013-08-07 16:29:23 +000010143TEST_F(FormatTest, UnderstandsPragmas) {
10144 verifyFormat("#pragma omp reduction(| : var)");
10145 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010146
10147 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10148 "(including parentheses).",
10149 format("#pragma mark Any non-hyphenated or hyphenated string "
10150 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010151}
10152
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010153TEST_F(FormatTest, UnderstandPragmaOption) {
10154 verifyFormat("#pragma option -C -A");
10155
10156 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10157}
10158
Manuel Klimek77866142017-11-17 11:17:15 +000010159TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
10160 FormatStyle Style = getLLVMStyle();
10161 Style.ColumnLimit = 20;
10162
10163 verifyFormat("int a; // the\n"
10164 " // comment", Style);
10165 EXPECT_EQ("int a; /* first line\n"
10166 " * second\n"
10167 " * line third\n"
10168 " * line\n"
10169 " */",
10170 format("int a; /* first line\n"
10171 " * second\n"
10172 " * line third\n"
10173 " * line\n"
10174 " */",
10175 Style));
10176 EXPECT_EQ("int a; // first line\n"
10177 " // second\n"
10178 " // line third\n"
10179 " // line",
10180 format("int a; // first line\n"
10181 " // second line\n"
10182 " // third line",
10183 Style));
10184
10185 Style.PenaltyExcessCharacter = 90;
10186 verifyFormat("int a; // the comment", Style);
Manuel Klimek93699f42017-11-29 14:29:43 +000010187 EXPECT_EQ("int a; // the comment\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010188 " // aaa",
10189 format("int a; // the comment aaa", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010190 EXPECT_EQ("int a; /* first line\n"
10191 " * second line\n"
10192 " * third line\n"
10193 " */",
10194 format("int a; /* first line\n"
10195 " * second line\n"
10196 " * third line\n"
10197 " */",
10198 Style));
Manuel Klimek93699f42017-11-29 14:29:43 +000010199 EXPECT_EQ("int a; // first line\n"
10200 " // second line\n"
10201 " // third line",
10202 format("int a; // first line\n"
10203 " // second line\n"
10204 " // third line",
10205 Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010206 // FIXME: Investigate why this is not getting the same layout as the test
10207 // above.
10208 EXPECT_EQ("int a; /* first line\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010209 " * second line\n"
10210 " * third line\n"
Manuel Klimek77866142017-11-17 11:17:15 +000010211 " */",
10212 format("int a; /* first line second line third line"
10213 "\n*/",
10214 Style));
10215
10216 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010217 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010218 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010219 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010220 Style));
10221 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010222 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010223 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010224 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010225 Style));
10226
10227 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
10228 // next one.
Manuel Klimek93699f42017-11-29 14:29:43 +000010229 EXPECT_EQ("// foo bar baz bazfoo\n"
10230 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010231 format("// foo bar baz bazfoo bar\n"
10232 "// foo bar\n",
10233 Style));
10234
10235 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010236 "// foo bar baz bazfoo\n"
10237 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010238 format("// foo bar baz bazfoo\n"
10239 "// foo bar baz bazfoo bar\n"
10240 "// foo bar\n",
10241 Style));
10242
Manuel Klimek77866142017-11-17 11:17:15 +000010243 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010244 "// foo bar baz bazfoo\n"
10245 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010246 format("// foo bar baz bazfoo\n"
10247 "// foo bar baz bazfoo bar\n"
10248 "// foo bar\n",
10249 Style));
Manuel Klimek0b58c322017-12-01 13:28:08 +000010250
10251 // Make sure we do not keep protruding characters if strict mode reflow is
10252 // cheaper than keeping protruding characters.
10253 Style.ColumnLimit = 21;
10254 EXPECT_EQ("// foo foo foo foo\n"
10255 "// foo foo foo foo\n"
10256 "// foo foo foo foo\n",
10257 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
10258 Style));
10259
10260 EXPECT_EQ("int a = /* long block\n"
10261 " comment */\n"
10262 " 42;",
10263 format("int a = /* long block comment */ 42;", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010264}
10265
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010266#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10267 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010268 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10269 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010270
10271TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010272 SmallVector<FormatStyle, 3> Styles;
10273 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010274
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010275 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010276 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10277 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10278 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010279
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010280 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010281 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10282 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10283 EXPECT_ALL_STYLES_EQUAL(Styles);
10284
Nico Weber514ecc82014-02-02 20:50:45 +000010285 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010286 EXPECT_TRUE(
10287 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10288 EXPECT_TRUE(
10289 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10290 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010291
Nico Weber514ecc82014-02-02 20:50:45 +000010292 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010293 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10294 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10295 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010296
10297 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010298 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10299 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10300 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010301
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010302 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010303 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10304 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10305 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010306
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010307 Styles[0] = getGNUStyle();
10308 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10309 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10310 EXPECT_ALL_STYLES_EQUAL(Styles);
10311
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010312 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10313}
10314
10315TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10316 SmallVector<FormatStyle, 8> Styles;
10317 Styles.resize(2);
10318
10319 Styles[0] = getGoogleStyle();
10320 Styles[1] = getLLVMStyle();
10321 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10322 EXPECT_ALL_STYLES_EQUAL(Styles);
10323
10324 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010325 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010326 Styles[1] = getLLVMStyle();
10327 Styles[1].Language = FormatStyle::LK_JavaScript;
10328 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10329
10330 Styles[2] = getLLVMStyle();
10331 Styles[2].Language = FormatStyle::LK_JavaScript;
10332 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10333 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010334 &Styles[2])
10335 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010336
10337 Styles[3] = getLLVMStyle();
10338 Styles[3].Language = FormatStyle::LK_JavaScript;
10339 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10340 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010341 &Styles[3])
10342 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010343
10344 Styles[4] = getLLVMStyle();
10345 Styles[4].Language = FormatStyle::LK_JavaScript;
10346 EXPECT_EQ(0, parseConfiguration("---\n"
10347 "BasedOnStyle: LLVM\n"
10348 "IndentWidth: 123\n"
10349 "---\n"
10350 "BasedOnStyle: Google\n"
10351 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010352 &Styles[4])
10353 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010354 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010355}
10356
Daniel Jasper91881d92014-09-29 08:07:46 +000010357#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010358 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010359 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010360 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010361 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010362 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010363
Daniel Jasper91881d92014-09-29 08:07:46 +000010364#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10365
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010366#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10367 Style.STRUCT.FIELD = false; \
10368 EXPECT_EQ(0, \
10369 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10370 .value()); \
10371 EXPECT_TRUE(Style.STRUCT.FIELD); \
10372 EXPECT_EQ(0, \
10373 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10374 .value()); \
10375 EXPECT_FALSE(Style.STRUCT.FIELD);
10376
10377#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10378 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10379
Daniel Jasper00853002014-09-16 16:22:30 +000010380#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10381 EXPECT_NE(VALUE, Style.FIELD); \
10382 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10383 EXPECT_EQ(VALUE, Style.FIELD)
10384
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010385TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010386 FormatStyle Style = {};
10387 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +000010388 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010389 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010390 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010391 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010392 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010393 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010394 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010395 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010396 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010397 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010398 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010399 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010400 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010401 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010402 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +000010403 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Francois Ferrande56a8292017-06-14 12:29:47 +000010404 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010405 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010406 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010407 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010408 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010409 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010410 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010411 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010412 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010413 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010414 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010415 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010416 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +000010417 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010418 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010419 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010420 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010421 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010422 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010423 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010424 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010425 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010426 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Francois Ferrand2a9ea782018-03-01 10:09:13 +000010427 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
10428 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
10429 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010430
10431 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10432 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10433 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10434 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10435 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10436 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10437 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10438 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
Krasimir Georgievd6ce9372017-09-15 11:23:50 +000010439 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010440 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10441 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10442 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +000010443 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10444 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10445 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010446}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010447
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010448#undef CHECK_PARSE_BOOL
10449
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010450TEST_F(FormatTest, ParsesConfiguration) {
10451 FormatStyle Style = {};
10452 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010453 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010454 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10455 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010456 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010457 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10458 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +000010459 CHECK_PARSE("PenaltyBreakAssignment: 1234",
10460 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010461 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10462 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010463 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10464 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10465 PenaltyReturnTypeOnItsOwnLine, 1234u);
10466 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10467 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010468 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010469 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010470 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010471
Daniel Jasper553d4872014-06-17 12:40:34 +000010472 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010473 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10474 FormatStyle::PAS_Left);
10475 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10476 FormatStyle::PAS_Right);
10477 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10478 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010479 // For backward compatibility:
10480 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10481 FormatStyle::PAS_Left);
10482 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10483 FormatStyle::PAS_Right);
10484 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10485 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010486
Alexander Kornienkod6538332013-05-07 15:32:14 +000010487 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010488 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10489 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010490 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10491 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10492 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10493
Daniel Jasperac043c92014-09-15 11:11:00 +000010494 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010495 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10496 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010497 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10498 FormatStyle::BOS_None);
10499 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10500 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010501 // For backward compatibility:
10502 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10503 FormatStyle::BOS_None);
10504 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10505 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010506
Francois Ferranda6b6d512017-05-24 11:36:58 +000010507 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10508 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10509 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10510 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10511 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10512 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10513 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10514 // For backward compatibility:
10515 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10516 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10517
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010518 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10519 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10520 FormatStyle::BAS_Align);
10521 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10522 FormatStyle::BAS_DontAlign);
10523 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10524 FormatStyle::BAS_AlwaysBreak);
10525 // For backward compatibility:
10526 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10527 FormatStyle::BAS_DontAlign);
10528 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10529 FormatStyle::BAS_Align);
10530
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +000010531 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10532 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
10533 FormatStyle::ENAS_DontAlign);
10534 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
10535 FormatStyle::ENAS_Left);
10536 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
10537 FormatStyle::ENAS_Right);
10538 // For backward compatibility:
10539 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
10540 FormatStyle::ENAS_Left);
10541 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
10542 FormatStyle::ENAS_Right);
10543
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010544 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010545 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10546 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10547 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010548 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10549 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010550 // For backward compatibility:
10551 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10552 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010553
Daniel Jasperd74cf402014-04-08 12:46:38 +000010554 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010555 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10556 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10557 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10558 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010559 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10560 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010561 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10562 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010563 // For backward compatibility:
10564 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10565 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10566 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10567 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010568
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010569 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10570 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10571 FormatStyle::SBPO_Never);
10572 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10573 FormatStyle::SBPO_Always);
10574 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10575 FormatStyle::SBPO_ControlStatements);
10576 // For backward compatibility:
10577 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10578 FormatStyle::SBPO_Never);
10579 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10580 FormatStyle::SBPO_ControlStatements);
10581
Alexander Kornienkod6538332013-05-07 15:32:14 +000010582 Style.ColumnLimit = 123;
10583 FormatStyle BaseStyle = getLLVMStyle();
10584 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10585 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10586
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010587 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10588 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10589 FormatStyle::BS_Attach);
10590 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10591 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010592 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10593 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010594 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10595 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010596 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10597 FormatStyle::BS_Allman);
10598 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010599 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10600 FormatStyle::BS_WebKit);
10601 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10602 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010603
Zachary Turner448592e2015-12-18 22:20:15 +000010604 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10605 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10606 FormatStyle::RTBS_None);
10607 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10608 FormatStyle::RTBS_All);
10609 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010610 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010611 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10612 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10613 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10614 AlwaysBreakAfterReturnType,
10615 FormatStyle::RTBS_TopLevelDefinitions);
10616
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010617 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10618 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10619 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10620 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10621 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10622 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10623 AlwaysBreakAfterDefinitionReturnType,
10624 FormatStyle::DRTBS_TopLevel);
10625
Daniel Jasper65ee3472013-07-31 23:16:02 +000010626 Style.NamespaceIndentation = FormatStyle::NI_All;
10627 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10628 FormatStyle::NI_None);
10629 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10630 FormatStyle::NI_Inner);
10631 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10632 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010633
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010634 // FIXME: This is required because parsing a configuration simply overwrites
10635 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010636 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010637 std::vector<std::string> BoostForeach;
10638 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010639 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010640 std::vector<std::string> BoostAndQForeach;
10641 BoostAndQForeach.push_back("BOOST_FOREACH");
10642 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010643 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10644 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010645
10646 Style.IncludeCategories.clear();
10647 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10648 {".*", 1}};
10649 CHECK_PARSE("IncludeCategories:\n"
10650 " - Regex: abc/.*\n"
10651 " Priority: 2\n"
10652 " - Regex: .*\n"
10653 " Priority: 1",
10654 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010655 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010656
10657 Style.RawStringFormats.clear();
10658 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010659 {
10660 FormatStyle::LK_TextProto,
10661 {"pb", "proto"},
10662 {"PARSE_TEXT_PROTO"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010663 /*CanonicalDelimiter=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010664 "llvm",
10665 },
10666 {
10667 FormatStyle::LK_Cpp,
10668 {"cc", "cpp"},
10669 {"C_CODEBLOCK", "CPPEVAL"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010670 /*CanonicalDelimiter=*/"cc",
10671 /*BasedOnStyle=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010672 },
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010673 };
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010674
10675 CHECK_PARSE("RawStringFormats:\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010676 " - Language: TextProto\n"
10677 " Delimiters:\n"
10678 " - 'pb'\n"
10679 " - 'proto'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010680 " EnclosingFunctions:\n"
10681 " - 'PARSE_TEXT_PROTO'\n"
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010682 " BasedOnStyle: llvm\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010683 " - Language: Cpp\n"
10684 " Delimiters:\n"
10685 " - 'cc'\n"
10686 " - 'cpp'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010687 " EnclosingFunctions:\n"
10688 " - 'C_CODEBLOCK'\n"
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010689 " - 'CPPEVAL'\n"
10690 " CanonicalDelimiter: 'cc'",
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010691 RawStringFormats, ExpectedRawStringFormats);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010692}
10693
10694TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10695 FormatStyle Style = {};
10696 Style.Language = FormatStyle::LK_Cpp;
10697 CHECK_PARSE("Language: Cpp\n"
10698 "IndentWidth: 12",
10699 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010700 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10701 "IndentWidth: 34",
10702 &Style),
10703 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010704 EXPECT_EQ(12u, Style.IndentWidth);
10705 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10706 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10707
10708 Style.Language = FormatStyle::LK_JavaScript;
10709 CHECK_PARSE("Language: JavaScript\n"
10710 "IndentWidth: 12",
10711 IndentWidth, 12u);
10712 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010713 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10714 "IndentWidth: 34",
10715 &Style),
10716 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010717 EXPECT_EQ(23u, Style.IndentWidth);
10718 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10719 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10720
10721 CHECK_PARSE("BasedOnStyle: LLVM\n"
10722 "IndentWidth: 67",
10723 IndentWidth, 67u);
10724
10725 CHECK_PARSE("---\n"
10726 "Language: JavaScript\n"
10727 "IndentWidth: 12\n"
10728 "---\n"
10729 "Language: Cpp\n"
10730 "IndentWidth: 34\n"
10731 "...\n",
10732 IndentWidth, 12u);
10733
10734 Style.Language = FormatStyle::LK_Cpp;
10735 CHECK_PARSE("---\n"
10736 "Language: JavaScript\n"
10737 "IndentWidth: 12\n"
10738 "---\n"
10739 "Language: Cpp\n"
10740 "IndentWidth: 34\n"
10741 "...\n",
10742 IndentWidth, 34u);
10743 CHECK_PARSE("---\n"
10744 "IndentWidth: 78\n"
10745 "---\n"
10746 "Language: JavaScript\n"
10747 "IndentWidth: 56\n"
10748 "...\n",
10749 IndentWidth, 78u);
10750
10751 Style.ColumnLimit = 123;
10752 Style.IndentWidth = 234;
10753 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10754 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010755 EXPECT_FALSE(parseConfiguration("---\n"
10756 "IndentWidth: 456\n"
10757 "BreakBeforeBraces: Allman\n"
10758 "---\n"
10759 "Language: JavaScript\n"
10760 "IndentWidth: 111\n"
10761 "TabWidth: 111\n"
10762 "---\n"
10763 "Language: Cpp\n"
10764 "BreakBeforeBraces: Stroustrup\n"
10765 "TabWidth: 789\n"
10766 "...\n",
10767 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010768 EXPECT_EQ(123u, Style.ColumnLimit);
10769 EXPECT_EQ(456u, Style.IndentWidth);
10770 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10771 EXPECT_EQ(789u, Style.TabWidth);
10772
Rafael Espindola1f243172014-06-12 11:35:17 +000010773 EXPECT_EQ(parseConfiguration("---\n"
10774 "Language: JavaScript\n"
10775 "IndentWidth: 56\n"
10776 "---\n"
10777 "IndentWidth: 78\n"
10778 "...\n",
10779 &Style),
10780 ParseError::Error);
10781 EXPECT_EQ(parseConfiguration("---\n"
10782 "Language: JavaScript\n"
10783 "IndentWidth: 56\n"
10784 "---\n"
10785 "Language: JavaScript\n"
10786 "IndentWidth: 78\n"
10787 "...\n",
10788 &Style),
10789 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010790
10791 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10792}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010793
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010794#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010795
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010796TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10797 FormatStyle Style = {};
10798 Style.Language = FormatStyle::LK_JavaScript;
10799 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010800 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010801 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010802
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010803 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010804 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010805 "BasedOnStyle: Google\n"
10806 "---\n"
10807 "Language: JavaScript\n"
10808 "IndentWidth: 76\n"
10809 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010810 &Style)
10811 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010812 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010813 EXPECT_EQ(76u, Style.IndentWidth);
10814 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10815}
10816
Alexander Kornienkod6538332013-05-07 15:32:14 +000010817TEST_F(FormatTest, ConfigurationRoundTripTest) {
10818 FormatStyle Style = getLLVMStyle();
10819 std::string YAML = configurationAsText(Style);
10820 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010821 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010822 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10823 EXPECT_EQ(Style, ParsedStyle);
10824}
10825
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010826TEST_F(FormatTest, WorksFor8bitEncodings) {
10827 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10828 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10829 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10830 "\"\xef\xee\xf0\xf3...\"",
10831 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10832 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10833 "\xef\xee\xf0\xf3...\"",
10834 getLLVMStyleWithColumns(12)));
10835}
10836
Alexander Kornienko393e3082013-11-13 14:04:17 +000010837TEST_F(FormatTest, HandlesUTF8BOM) {
10838 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10839 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10840 format("\xef\xbb\xbf#include <iostream>"));
10841 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10842 format("\xef\xbb\xbf\n#include <iostream>"));
10843}
10844
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010845// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10846#if !defined(_MSC_VER)
10847
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010848TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10849 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10850 getLLVMStyleWithColumns(35));
10851 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010852 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010853 verifyFormat("// Однажды в студёную зимнюю пору...",
10854 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010855 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010856 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10857 getLLVMStyleWithColumns(39));
10858 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010859 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010860}
10861
10862TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010863 // Non-printable characters' width is currently considered to be the length in
10864 // bytes in UTF8. The characters can be displayed in very different manner
10865 // (zero-width, single width with a substitution glyph, expanded to their code
10866 // (e.g. "<8d>"), so there's no single correct way to handle them.
10867 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010868 "\"\xc2\x8d\";",
10869 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010870 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010871 "\"\xc2\x8d\";",
10872 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010873 EXPECT_EQ("\"Однажды, в \"\n"
10874 "\"студёную \"\n"
10875 "\"зимнюю \"\n"
10876 "\"пору,\"",
10877 format("\"Однажды, в студёную зимнюю пору,\"",
10878 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010879 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010880 "\"一 二 三 \"\n"
10881 "\"四 五六 \"\n"
10882 "\"七 八 九 \"\n"
10883 "\"十\"",
10884 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Manuel Klimek93699f42017-11-29 14:29:43 +000010885 EXPECT_EQ("\"一\t\"\n"
10886 "\"二 \t\"\n"
10887 "\"三 四 \"\n"
10888 "\"五\t\"\n"
10889 "\"六 \t\"\n"
10890 "\"七 \"\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010891 "\"八九十\tqq\"",
10892 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10893 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010894
10895 // UTF8 character in an escape sequence.
10896 EXPECT_EQ("\"aaaaaa\"\n"
10897 "\"\\\xC2\x8D\"",
10898 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010899}
10900
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010901TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10902 EXPECT_EQ("const char *sssss =\n"
10903 " \"一二三四五六七八\\\n"
10904 " 九 十\";",
10905 format("const char *sssss = \"一二三四五六七八\\\n"
10906 " 九 十\";",
10907 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010908}
10909
10910TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010911 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10912 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010913 EXPECT_EQ("// Я из лесу\n"
10914 "// вышел; был\n"
10915 "// сильный\n"
10916 "// мороз.",
10917 format("// Я из лесу вышел; был сильный мороз.",
10918 getLLVMStyleWithColumns(13)));
10919 EXPECT_EQ("// 一二三\n"
10920 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010921 "// 八 九\n"
10922 "// 十",
10923 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010924}
10925
10926TEST_F(FormatTest, SplitsUTF8BlockComments) {
10927 EXPECT_EQ("/* Гляжу,\n"
10928 " * поднимается\n"
10929 " * медленно в\n"
10930 " * гору\n"
10931 " * Лошадка,\n"
10932 " * везущая\n"
10933 " * хворосту\n"
10934 " * воз. */",
10935 format("/* Гляжу, поднимается медленно в гору\n"
10936 " * Лошадка, везущая хворосту воз. */",
10937 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010938 EXPECT_EQ(
10939 "/* 一二三\n"
10940 " * 四五六七\n"
10941 " * 八 九\n"
10942 " * 十 */",
10943 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010944 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10945 " * 𝕓𝕪𝕥𝕖\n"
10946 " * 𝖀𝕿𝕱-𝟠 */",
10947 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010948}
10949
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010950#endif // _MSC_VER
10951
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010952TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10953 FormatStyle Style = getLLVMStyle();
10954
10955 Style.ConstructorInitializerIndentWidth = 4;
10956 verifyFormat(
10957 "SomeClass::Constructor()\n"
10958 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10959 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10960 Style);
10961
10962 Style.ConstructorInitializerIndentWidth = 2;
10963 verifyFormat(
10964 "SomeClass::Constructor()\n"
10965 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10966 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10967 Style);
10968
10969 Style.ConstructorInitializerIndentWidth = 0;
10970 verifyFormat(
10971 "SomeClass::Constructor()\n"
10972 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10973 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10974 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010975 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10976 verifyFormat(
10977 "SomeLongTemplateVariableName<\n"
10978 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10979 Style);
10980 verifyFormat(
10981 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10982 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10983 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010984}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010985
Daniel Jasper00853002014-09-16 16:22:30 +000010986TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10987 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000010988 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010989 Style.ConstructorInitializerIndentWidth = 4;
10990 verifyFormat("SomeClass::Constructor()\n"
10991 " : a(a)\n"
10992 " , b(b)\n"
10993 " , c(c) {}",
10994 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010995 verifyFormat("SomeClass::Constructor()\n"
10996 " : a(a) {}",
10997 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010998
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010999 Style.ColumnLimit = 0;
11000 verifyFormat("SomeClass::Constructor()\n"
11001 " : a(a) {}",
11002 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000011003 verifyFormat("SomeClass::Constructor() noexcept\n"
11004 " : a(a) {}",
11005 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011006 verifyFormat("SomeClass::Constructor()\n"
11007 " : a(a)\n"
11008 " , b(b)\n"
11009 " , c(c) {}",
11010 Style);
11011 verifyFormat("SomeClass::Constructor()\n"
11012 " : a(a) {\n"
11013 " foo();\n"
11014 " bar();\n"
11015 "}",
11016 Style);
11017
Daniel Jasperd74cf402014-04-08 12:46:38 +000011018 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011019 verifyFormat("SomeClass::Constructor()\n"
11020 " : a(a)\n"
11021 " , b(b)\n"
11022 " , c(c) {\n}",
11023 Style);
11024 verifyFormat("SomeClass::Constructor()\n"
11025 " : a(a) {\n}",
11026 Style);
11027
11028 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000011029 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011030 Style.ConstructorInitializerIndentWidth = 2;
11031 verifyFormat("SomeClass::Constructor()\n"
11032 " : a(a)\n"
11033 " , b(b)\n"
11034 " , c(c) {}",
11035 Style);
11036
11037 Style.ConstructorInitializerIndentWidth = 0;
11038 verifyFormat("SomeClass::Constructor()\n"
11039 ": a(a)\n"
11040 ", b(b)\n"
11041 ", c(c) {}",
11042 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011043
11044 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
11045 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011046 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
11047 verifyFormat(
11048 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
11049 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011050 verifyFormat(
11051 "SomeClass::Constructor()\n"
11052 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
11053 Style);
11054 Style.ConstructorInitializerIndentWidth = 4;
11055 Style.ColumnLimit = 60;
11056 verifyFormat("SomeClass::Constructor()\n"
11057 " : aaaaaaaa(aaaaaaaa)\n"
11058 " , aaaaaaaa(aaaaaaaa)\n"
11059 " , aaaaaaaa(aaaaaaaa) {}",
11060 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011061}
11062
Daniel Jasper38efc132014-10-21 07:51:54 +000011063TEST_F(FormatTest, Destructors) {
11064 verifyFormat("void F(int &i) { i.~int(); }");
11065 verifyFormat("void F(int &i) { i->~int(); }");
11066}
11067
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011068TEST_F(FormatTest, FormatsWithWebKitStyle) {
11069 FormatStyle Style = getWebKitStyle();
11070
11071 // Don't indent in outer namespaces.
11072 verifyFormat("namespace outer {\n"
11073 "int i;\n"
11074 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000011075 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011076 "} // namespace inner\n"
11077 "} // namespace outer\n"
11078 "namespace other_outer {\n"
11079 "int i;\n"
11080 "}",
11081 Style);
11082
11083 // Don't indent case labels.
11084 verifyFormat("switch (variable) {\n"
11085 "case 1:\n"
11086 "case 2:\n"
11087 " doSomething();\n"
11088 " break;\n"
11089 "default:\n"
11090 " ++variable;\n"
11091 "}",
11092 Style);
11093
11094 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000011095 EXPECT_EQ("void f()\n"
11096 "{\n"
11097 " if (aaaaaaaaaaaaaaaa\n"
11098 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
11099 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11100 " return;\n"
11101 "}",
11102 format("void f() {\n"
11103 "if (aaaaaaaaaaaaaaaa\n"
11104 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
11105 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11106 "return;\n"
11107 "}",
11108 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011109
Daniel Jasper35995672014-04-29 14:05:20 +000011110 // Allow functions on a single line.
11111 verifyFormat("void f() { return; }", Style);
11112
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011113 // Constructor initializers are formatted one per line with the "," on the
11114 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011115 verifyFormat("Constructor()\n"
11116 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
11117 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000011118 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011119 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
11120 "{\n"
11121 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011122 Style);
11123 verifyFormat("SomeClass::Constructor()\n"
11124 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011125 "{\n"
11126 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011127 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000011128 EXPECT_EQ("SomeClass::Constructor()\n"
11129 " : a(a)\n"
11130 "{\n"
11131 "}",
11132 format("SomeClass::Constructor():a(a){}", Style));
11133 verifyFormat("SomeClass::Constructor()\n"
11134 " : a(a)\n"
11135 " , b(b)\n"
11136 " , c(c)\n"
11137 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011138 "}",
11139 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011140 verifyFormat("SomeClass::Constructor()\n"
11141 " : a(a)\n"
11142 "{\n"
11143 " foo();\n"
11144 " bar();\n"
11145 "}",
11146 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011147
Daniel Jasper65ee3472013-07-31 23:16:02 +000011148 // Access specifiers should be aligned left.
11149 verifyFormat("class C {\n"
11150 "public:\n"
11151 " int i;\n"
11152 "};",
11153 Style);
11154
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011155 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000011156 verifyFormat("int a; // Do not\n"
11157 "double b; // align comments.",
11158 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011159
Daniel Jasper3219e432014-12-02 13:24:51 +000011160 // Do not align operands.
11161 EXPECT_EQ("ASSERT(aaaa\n"
11162 " || bbbb);",
11163 format("ASSERT ( aaaa\n||bbbb);", Style));
11164
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011165 // Accept input's line breaks.
11166 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
11167 " || bbbbbbbbbbbbbbb) {\n"
11168 " i++;\n"
11169 "}",
11170 format("if (aaaaaaaaaaaaaaa\n"
11171 "|| bbbbbbbbbbbbbbb) { i++; }",
11172 Style));
11173 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
11174 " i++;\n"
11175 "}",
11176 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000011177
11178 // Don't automatically break all macro definitions (llvm.org/PR17842).
11179 verifyFormat("#define aNumber 10", Style);
11180 // However, generally keep the line breaks that the user authored.
11181 EXPECT_EQ("#define aNumber \\\n"
11182 " 10",
11183 format("#define aNumber \\\n"
11184 " 10",
11185 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000011186
11187 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011188 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
11189 " copyItems:YES];",
11190 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
11191 "copyItems:YES];",
11192 Style));
11193 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
11194 " copyItems:YES];",
11195 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
11196 " copyItems:YES];",
11197 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000011198 // FIXME: This does not seem right, there should be more indentation before
11199 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011200 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000011201 " @\"a\",\n"
11202 " @\"a\"\n"
11203 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011204 " copyItems:YES];",
11205 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11206 " @\"a\",\n"
11207 " @\"a\"\n"
11208 " ]\n"
11209 " copyItems:YES];",
11210 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011211 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011212 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11213 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011214 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11215 " copyItems:YES];",
11216 Style));
11217
11218 verifyFormat("[self.a b:c c:d];", Style);
11219 EXPECT_EQ("[self.a b:c\n"
11220 " c:d];",
11221 format("[self.a b:c\n"
11222 "c:d];",
11223 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011224}
11225
Manuel Klimekffdeb592013-09-03 15:10:01 +000011226TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011227 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11228 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11229 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11230 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11231 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011232 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Manuel Klimek9f0a4e52017-09-19 09:59:30 +000011233 verifyFormat("auto c = [a = [b = 42] {}] {};\n");
11234 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011235 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011236 verifyFormat("void f() {\n"
11237 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11238 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011239 verifyFormat("void f() {\n"
11240 " other(x.begin(), //\n"
11241 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011242 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011243 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011244 verifyFormat("SomeFunction([]() { // A cool function...\n"
11245 " return 43;\n"
11246 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011247 EXPECT_EQ("SomeFunction([]() {\n"
11248 "#define A a\n"
11249 " return 43;\n"
11250 "});",
11251 format("SomeFunction([](){\n"
11252 "#define A a\n"
11253 "return 43;\n"
11254 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011255 verifyFormat("void f() {\n"
11256 " SomeFunction([](decltype(x), A *a) {});\n"
11257 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011258 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11259 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011260 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11261 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11262 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011263 verifyFormat("Constructor()\n"
11264 " : Field([] { // comment\n"
11265 " int i;\n"
11266 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011267 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11268 " return some_parameter.size();\n"
11269 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011270 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11271 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011272 verifyFormat("int i = aaaaaa ? 1 //\n"
11273 " : [] {\n"
11274 " return 2; //\n"
11275 " }();");
11276 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11277 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11278 " return x == 2; // force break\n"
11279 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011280 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11281 " [=](int iiiiiiiiiiii) {\n"
11282 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
11283 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
11284 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011285 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011286 verifyFormat("SomeFunction({[&] {\n"
11287 " // comment\n"
11288 " },\n"
11289 " [&] {\n"
11290 " // comment\n"
11291 " }});");
11292 verifyFormat("SomeFunction({[&] {\n"
11293 " // comment\n"
11294 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011295 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11296 " [&]() { return true; },\n"
11297 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011298
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011299 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011300 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011301 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011302 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11303 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011304 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011305 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011306 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11307 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011308 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011309 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11310 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011311 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011312 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011313 verifyFormat(
11314 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11315 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11316 " return aaaaaaaaaaaaaaaaa;\n"
11317 " });",
11318 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011319 verifyFormat("[]() //\n"
11320 " -> int {\n"
11321 " return 1; //\n"
11322 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011323
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011324 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011325 verifyFormat("SomeFunction(\n"
11326 " []() {\n"
11327 " int i = 42;\n"
11328 " return i;\n"
11329 " },\n"
11330 " []() {\n"
11331 " int j = 43;\n"
11332 " return j;\n"
11333 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011334
Daniel Jasperda18fd82014-06-10 06:39:03 +000011335 // More complex introducers.
11336 verifyFormat("return [i, args...] {};");
11337
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011338 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011339 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011340 verifyFormat("double &operator[](int i) { return 0; }\n"
11341 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011342 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011343 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011344 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011345
11346 // Other corner cases.
11347 verifyFormat("void f() {\n"
11348 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000011349 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000011350 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011351
11352 // Lambdas created through weird macros.
11353 verifyFormat("void f() {\n"
11354 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011355 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011356 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011357
11358 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11359 " doo_dah();\n"
11360 " doo_dah();\n"
11361 " })) {\n"
11362 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000011363 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
11364 " doo_dah();\n"
11365 " doo_dah();\n"
11366 " })) {\n"
11367 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011368 verifyFormat("auto lambda = []() {\n"
11369 " int a = 2\n"
11370 "#if A\n"
11371 " + 2\n"
11372 "#endif\n"
11373 " ;\n"
11374 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011375
11376 // Lambdas with complex multiline introducers.
11377 verifyFormat(
11378 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11379 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
11380 " -> ::std::unordered_set<\n"
11381 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
11382 " //\n"
11383 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011384}
11385
Martin Probsta004b3f2017-11-17 18:06:33 +000011386TEST_F(FormatTest, EmptyLinesInLambdas) {
11387 verifyFormat("auto lambda = []() {\n"
11388 " x(); //\n"
11389 "};",
11390 "auto lambda = []() {\n"
11391 "\n"
11392 " x(); //\n"
11393 "\n"
11394 "};");
11395}
11396
Manuel Klimek516e0542013-09-04 13:25:30 +000011397TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011398 FormatStyle ShortBlocks = getLLVMStyle();
11399 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11400 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11401 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11402 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11403 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11404 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11405 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011406
Daniel Jasper76284682014-10-22 09:12:44 +000011407 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11408 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11409 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011410
Daniel Jasper76284682014-10-22 09:12:44 +000011411 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011412 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011413 "}];");
11414 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011415 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011416 "}]};");
11417 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011418 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011419 "}];");
11420 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011421 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011422 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011423 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011424 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011425 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011426 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011427 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011428
11429 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011430 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011431 "}];",
11432 getLLVMStyleWithColumns(60));
11433 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011434 " NSString *path = [self sessionFilePath];\n"
11435 " if (path) {\n"
11436 " // ...\n"
11437 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011438 "});");
11439 verifyFormat("[[SessionService sharedService]\n"
11440 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011441 " if (window) {\n"
11442 " [self windowDidLoad:window];\n"
11443 " } else {\n"
11444 " [self errorLoadingWindow];\n"
11445 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011446 " }];");
11447 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011448 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011449 "};\n",
11450 getLLVMStyleWithColumns(40));
11451 verifyFormat("[[SessionService sharedService]\n"
11452 " loadWindowWithCompletionBlock: //\n"
11453 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011454 " if (window) {\n"
11455 " [self windowDidLoad:window];\n"
11456 " } else {\n"
11457 " [self errorLoadingWindow];\n"
11458 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011459 " }];",
11460 getLLVMStyleWithColumns(60));
11461 verifyFormat("[myObject doSomethingWith:arg1\n"
11462 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011463 " // ...\n"
11464 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011465 " }\n"
11466 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011467 " // ...\n"
11468 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011469 " }\n"
11470 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011471 " // ...\n"
11472 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011473 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011474 verifyFormat("[myObject doSomethingWith:arg1\n"
11475 " firstBlock:-1\n"
11476 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011477 " // ...\n"
11478 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011479 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011480
11481 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011482 " @autoreleasepool {\n"
11483 " if (a) {\n"
11484 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011485 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011486 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011487 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011488 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011489 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11490 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011491
11492 FormatStyle FourIndent = getLLVMStyle();
11493 FourIndent.ObjCBlockIndentWidth = 4;
11494 verifyFormat("[operation setCompletionBlock:^{\n"
11495 " [self onOperationDone];\n"
11496 "}];",
11497 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011498}
11499
Daniel Jasper289afc02015-04-23 09:23:17 +000011500TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11501 FormatStyle ZeroColumn = getLLVMStyle();
11502 ZeroColumn.ColumnLimit = 0;
11503
11504 verifyFormat("[[SessionService sharedService] "
11505 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11506 " if (window) {\n"
11507 " [self windowDidLoad:window];\n"
11508 " } else {\n"
11509 " [self errorLoadingWindow];\n"
11510 " }\n"
11511 "}];",
11512 ZeroColumn);
11513 EXPECT_EQ("[[SessionService sharedService]\n"
11514 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11515 " if (window) {\n"
11516 " [self windowDidLoad:window];\n"
11517 " } else {\n"
11518 " [self errorLoadingWindow];\n"
11519 " }\n"
11520 " }];",
11521 format("[[SessionService sharedService]\n"
11522 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11523 " if (window) {\n"
11524 " [self windowDidLoad:window];\n"
11525 " } else {\n"
11526 " [self errorLoadingWindow];\n"
11527 " }\n"
11528 "}];",
11529 ZeroColumn));
11530 verifyFormat("[myObject doSomethingWith:arg1\n"
11531 " firstBlock:^(Foo *a) {\n"
11532 " // ...\n"
11533 " int i;\n"
11534 " }\n"
11535 " secondBlock:^(Bar *b) {\n"
11536 " // ...\n"
11537 " int i;\n"
11538 " }\n"
11539 " thirdBlock:^Foo(Bar *b) {\n"
11540 " // ...\n"
11541 " int i;\n"
11542 " }];",
11543 ZeroColumn);
11544 verifyFormat("f(^{\n"
11545 " @autoreleasepool {\n"
11546 " if (a) {\n"
11547 " g();\n"
11548 " }\n"
11549 " }\n"
11550 "});",
11551 ZeroColumn);
11552 verifyFormat("void (^largeBlock)(void) = ^{\n"
11553 " // ...\n"
11554 "};",
11555 ZeroColumn);
11556
11557 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11558 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011559 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011560 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11561 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11562 " int i;\n"
11563 "};",
11564 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11565}
11566
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011567TEST_F(FormatTest, SupportsCRLF) {
11568 EXPECT_EQ("int a;\r\n"
11569 "int b;\r\n"
11570 "int c;\r\n",
11571 format("int a;\r\n"
11572 " int b;\r\n"
11573 " int c;\r\n",
11574 getLLVMStyle()));
11575 EXPECT_EQ("int a;\r\n"
11576 "int b;\r\n"
11577 "int c;\r\n",
11578 format("int a;\r\n"
11579 " int b;\n"
11580 " int c;\r\n",
11581 getLLVMStyle()));
11582 EXPECT_EQ("int a;\n"
11583 "int b;\n"
11584 "int c;\n",
11585 format("int a;\r\n"
11586 " int b;\n"
11587 " int c;\n",
11588 getLLVMStyle()));
11589 EXPECT_EQ("\"aaaaaaa \"\r\n"
11590 "\"bbbbbbb\";\r\n",
11591 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11592 EXPECT_EQ("#define A \\\r\n"
11593 " b; \\\r\n"
11594 " c; \\\r\n"
11595 " d;\r\n",
11596 format("#define A \\\r\n"
11597 " b; \\\r\n"
11598 " c; d; \r\n",
11599 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011600
11601 EXPECT_EQ("/*\r\n"
11602 "multi line block comments\r\n"
11603 "should not introduce\r\n"
11604 "an extra carriage return\r\n"
11605 "*/\r\n",
11606 format("/*\r\n"
11607 "multi line block comments\r\n"
11608 "should not introduce\r\n"
11609 "an extra carriage return\r\n"
11610 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011611}
11612
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011613TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11614 verifyFormat("MY_CLASS(C) {\n"
11615 " int i;\n"
11616 " int j;\n"
11617 "};");
11618}
11619
Daniel Jasper6633ab82013-10-18 10:38:14 +000011620TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11621 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11622 TwoIndent.ContinuationIndentWidth = 2;
11623
11624 EXPECT_EQ("int i =\n"
11625 " longFunction(\n"
11626 " arg);",
11627 format("int i = longFunction(arg);", TwoIndent));
11628
11629 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11630 SixIndent.ContinuationIndentWidth = 6;
11631
11632 EXPECT_EQ("int i =\n"
11633 " longFunction(\n"
11634 " arg);",
11635 format("int i = longFunction(arg);", SixIndent));
11636}
11637
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011638TEST_F(FormatTest, SpacesInAngles) {
11639 FormatStyle Spaces = getLLVMStyle();
11640 Spaces.SpacesInAngles = true;
11641
11642 verifyFormat("static_cast< int >(arg);", Spaces);
11643 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11644 verifyFormat("f< int, float >();", Spaces);
11645 verifyFormat("template <> g() {}", Spaces);
11646 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011647 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11648 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11649 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011650
11651 Spaces.Standard = FormatStyle::LS_Cpp03;
11652 Spaces.SpacesInAngles = true;
11653 verifyFormat("A< A< int > >();", Spaces);
11654
11655 Spaces.SpacesInAngles = false;
11656 verifyFormat("A<A<int> >();", Spaces);
11657
11658 Spaces.Standard = FormatStyle::LS_Cpp11;
11659 Spaces.SpacesInAngles = true;
11660 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011661
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011662 Spaces.SpacesInAngles = false;
11663 verifyFormat("A<A<int>>();", Spaces);
11664}
11665
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011666TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11667 FormatStyle Style = getLLVMStyle();
11668 Style.SpaceAfterTemplateKeyword = false;
11669 verifyFormat("template<int> void foo();", Style);
11670}
11671
Jacques Pienaarfc275112015-02-18 23:48:37 +000011672TEST_F(FormatTest, TripleAngleBrackets) {
11673 verifyFormat("f<<<1, 1>>>();");
11674 verifyFormat("f<<<1, 1, 1, s>>>();");
11675 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011676 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011677 verifyFormat("f<param><<<1, 1>>>();");
11678 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011679 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011680 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11681 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011682 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11683 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011684}
11685
11686TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011687 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011688 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011689 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11690 "aaallvm::outs() <<");
11691 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11692 "aaaallvm::outs()\n <<");
11693}
11694
Manuel Klimek819788d2014-03-18 11:22:45 +000011695TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11696 std::string code = "#if A\n"
11697 "#if B\n"
11698 "a.\n"
11699 "#endif\n"
11700 " a = 1;\n"
11701 "#else\n"
11702 "#endif\n"
11703 "#if C\n"
11704 "#else\n"
11705 "#endif\n";
11706 EXPECT_EQ(code, format(code));
11707}
11708
Manuel Klimek68b03042014-04-14 09:14:11 +000011709TEST_F(FormatTest, HandleConflictMarkers) {
11710 // Git/SVN conflict markers.
11711 EXPECT_EQ("int a;\n"
11712 "void f() {\n"
11713 " callme(some(parameter1,\n"
11714 "<<<<<<< text by the vcs\n"
11715 " parameter2),\n"
11716 "||||||| text by the vcs\n"
11717 " parameter2),\n"
11718 " parameter3,\n"
11719 "======= text by the vcs\n"
11720 " parameter2, parameter3),\n"
11721 ">>>>>>> text by the vcs\n"
11722 " otherparameter);\n",
11723 format("int a;\n"
11724 "void f() {\n"
11725 " callme(some(parameter1,\n"
11726 "<<<<<<< text by the vcs\n"
11727 " parameter2),\n"
11728 "||||||| text by the vcs\n"
11729 " parameter2),\n"
11730 " parameter3,\n"
11731 "======= text by the vcs\n"
11732 " parameter2,\n"
11733 " parameter3),\n"
11734 ">>>>>>> text by the vcs\n"
11735 " otherparameter);\n"));
11736
11737 // Perforce markers.
11738 EXPECT_EQ("void f() {\n"
11739 " function(\n"
11740 ">>>> text by the vcs\n"
11741 " parameter,\n"
11742 "==== text by the vcs\n"
11743 " parameter,\n"
11744 "==== text by the vcs\n"
11745 " parameter,\n"
11746 "<<<< text by the vcs\n"
11747 " parameter);\n",
11748 format("void f() {\n"
11749 " function(\n"
11750 ">>>> text by the vcs\n"
11751 " parameter,\n"
11752 "==== text by the vcs\n"
11753 " parameter,\n"
11754 "==== text by the vcs\n"
11755 " parameter,\n"
11756 "<<<< text by the vcs\n"
11757 " parameter);\n"));
11758
11759 EXPECT_EQ("<<<<<<<\n"
11760 "|||||||\n"
11761 "=======\n"
11762 ">>>>>>>",
11763 format("<<<<<<<\n"
11764 "|||||||\n"
11765 "=======\n"
11766 ">>>>>>>"));
11767
11768 EXPECT_EQ("<<<<<<<\n"
11769 "|||||||\n"
11770 "int i;\n"
11771 "=======\n"
11772 ">>>>>>>",
11773 format("<<<<<<<\n"
11774 "|||||||\n"
11775 "int i;\n"
11776 "=======\n"
11777 ">>>>>>>"));
11778
11779 // FIXME: Handle parsing of macros around conflict markers correctly:
11780 EXPECT_EQ("#define Macro \\\n"
11781 "<<<<<<<\n"
11782 "Something \\\n"
11783 "|||||||\n"
11784 "Else \\\n"
11785 "=======\n"
11786 "Other \\\n"
11787 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011788 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011789 format("#define Macro \\\n"
11790 "<<<<<<<\n"
11791 " Something \\\n"
11792 "|||||||\n"
11793 " Else \\\n"
11794 "=======\n"
11795 " Other \\\n"
11796 ">>>>>>>\n"
11797 " End\n"
11798 "int i;\n"));
11799}
11800
Daniel Jasper471894432014-08-06 13:40:26 +000011801TEST_F(FormatTest, DisableRegions) {
11802 EXPECT_EQ("int i;\n"
11803 "// clang-format off\n"
11804 " int j;\n"
11805 "// clang-format on\n"
11806 "int k;",
11807 format(" int i;\n"
11808 " // clang-format off\n"
11809 " int j;\n"
11810 " // clang-format on\n"
11811 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011812 EXPECT_EQ("int i;\n"
11813 "/* clang-format off */\n"
11814 " int j;\n"
11815 "/* clang-format on */\n"
11816 "int k;",
11817 format(" int i;\n"
11818 " /* clang-format off */\n"
11819 " int j;\n"
11820 " /* clang-format on */\n"
11821 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011822
11823 // Don't reflow comments within disabled regions.
11824 EXPECT_EQ(
11825 "// clang-format off\n"
11826 "// long long long long long long line\n"
11827 "/* clang-format on */\n"
11828 "/* long long long\n"
11829 " * long long long\n"
11830 " * line */\n"
11831 "int i;\n"
11832 "/* clang-format off */\n"
11833 "/* long long long long long long line */\n",
11834 format("// clang-format off\n"
11835 "// long long long long long long line\n"
11836 "/* clang-format on */\n"
11837 "/* long long long long long long line */\n"
11838 "int i;\n"
11839 "/* clang-format off */\n"
11840 "/* long long long long long long line */\n",
11841 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011842}
11843
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011844TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11845 format("? ) =");
11846 verifyNoCrash("#define a\\\n /**/}");
11847}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011848
Daniel Jasper498f5582015-12-25 08:53:31 +000011849TEST_F(FormatTest, FormatsTableGenCode) {
11850 FormatStyle Style = getLLVMStyle();
11851 Style.Language = FormatStyle::LK_TableGen;
11852 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11853}
11854
Nico Weberb2673a12016-11-10 21:49:25 +000011855TEST_F(FormatTest, ArrayOfTemplates) {
11856 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11857 format("auto a = new unique_ptr<int > [ 10];"));
11858
11859 FormatStyle Spaces = getLLVMStyle();
11860 Spaces.SpacesInSquareBrackets = true;
11861 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11862 format("auto a = new unique_ptr<int > [10];", Spaces));
11863}
11864
11865TEST_F(FormatTest, ArrayAsTemplateType) {
11866 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11867 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11868
11869 FormatStyle Spaces = getLLVMStyle();
11870 Spaces.SpacesInSquareBrackets = true;
11871 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11872 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11873}
11874
Martin Probstc9c51c42017-03-16 10:21:35 +000011875TEST_F(FormatTest, NoSpaceAfterSuper) {
11876 verifyFormat("__super::FooBar();");
11877}
11878
Ben Hamilton07e58362018-02-21 21:27:27 +000011879TEST(FormatStyle, GetStyleWithEmptyFileName) {
Bjorn Pettersson0b2f7742018-02-26 14:14:11 +000011880 vfs::InMemoryFileSystem FS;
11881 auto Style1 = getStyle("file", "", "Google", "", &FS);
Ben Hamilton07e58362018-02-21 21:27:27 +000011882 ASSERT_TRUE((bool)Style1);
11883 ASSERT_EQ(*Style1, getGoogleStyle());
11884}
11885
Eric Liu547d8792016-03-24 13:22:42 +000011886TEST(FormatStyle, GetStyleOfFile) {
11887 vfs::InMemoryFileSystem FS;
11888 // Test 1: format file in the same directory.
11889 ASSERT_TRUE(
11890 FS.addFile("/a/.clang-format", 0,
11891 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11892 ASSERT_TRUE(
11893 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011894 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011895 ASSERT_TRUE((bool)Style1);
11896 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011897
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011898 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011899 ASSERT_TRUE(
11900 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011901 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011902 ASSERT_TRUE((bool)Style2);
11903 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011904
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011905 // Test 2.2: no format on 'none' fallback style.
11906 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11907 ASSERT_TRUE((bool)Style2);
11908 ASSERT_EQ(*Style2, getNoStyle());
11909
11910 // Test 2.3: format if config is found with no based style while fallback is
11911 // 'none'.
11912 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11913 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11914 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11915 ASSERT_TRUE((bool)Style2);
11916 ASSERT_EQ(*Style2, getLLVMStyle());
11917
11918 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11919 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11920 ASSERT_TRUE((bool)Style2);
11921 ASSERT_EQ(*Style2, getLLVMStyle());
11922
Eric Liu547d8792016-03-24 13:22:42 +000011923 // Test 3: format file in parent directory.
11924 ASSERT_TRUE(
11925 FS.addFile("/c/.clang-format", 0,
11926 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11927 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11928 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011929 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011930 ASSERT_TRUE((bool)Style3);
11931 ASSERT_EQ(*Style3, getGoogleStyle());
11932
11933 // Test 4: error on invalid fallback style
11934 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11935 ASSERT_FALSE((bool)Style4);
11936 llvm::consumeError(Style4.takeError());
11937
11938 // Test 5: error on invalid yaml on command line
11939 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11940 ASSERT_FALSE((bool)Style5);
11941 llvm::consumeError(Style5.takeError());
11942
11943 // Test 6: error on invalid style
11944 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11945 ASSERT_FALSE((bool)Style6);
11946 llvm::consumeError(Style6.takeError());
11947
11948 // Test 7: found config file, error on parsing it
11949 ASSERT_TRUE(
11950 FS.addFile("/d/.clang-format", 0,
11951 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11952 "InvalidKey: InvalidValue")));
11953 ASSERT_TRUE(
11954 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11955 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11956 ASSERT_FALSE((bool)Style7);
11957 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011958}
11959
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011960TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11961 // Column limit is 20.
11962 std::string Code = "Type *a =\n"
11963 " new Type();\n"
11964 "g(iiiii, 0, jjjjj,\n"
11965 " 0, kkkkk, 0, mm);\n"
11966 "int bad = format ;";
11967 std::string Expected = "auto a = new Type();\n"
11968 "g(iiiii, nullptr,\n"
11969 " jjjjj, nullptr,\n"
11970 " kkkkk, nullptr,\n"
11971 " mm);\n"
11972 "int bad = format ;";
11973 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011974 tooling::Replacements Replaces = toReplacements(
11975 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11976 "auto "),
11977 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11978 "nullptr"),
11979 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11980 "nullptr"),
11981 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11982 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011983
11984 format::FormatStyle Style = format::getLLVMStyle();
11985 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011986 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11987 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11988 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11989 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11990 EXPECT_TRUE(static_cast<bool>(Result));
11991 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011992}
11993
Eric Liubaf58c22016-05-18 13:43:48 +000011994TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11995 std::string Code = "#include \"a.h\"\n"
11996 "#include \"c.h\"\n"
11997 "\n"
11998 "int main() {\n"
11999 " return 0;\n"
12000 "}";
12001 std::string Expected = "#include \"a.h\"\n"
12002 "#include \"b.h\"\n"
12003 "#include \"c.h\"\n"
12004 "\n"
12005 "int main() {\n"
12006 " return 0;\n"
12007 "}";
12008 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000012009 tooling::Replacements Replaces = toReplacements(
12010 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
12011 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000012012
12013 format::FormatStyle Style = format::getLLVMStyle();
12014 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000012015 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
12016 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
12017 << llvm::toString(FormattedReplaces.takeError()) << "\n";
12018 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12019 EXPECT_TRUE(static_cast<bool>(Result));
12020 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000012021}
12022
Krasimir Georgievac16a202017-06-23 11:46:03 +000012023TEST_F(FormatTest, FormatSortsUsingDeclarations) {
12024 EXPECT_EQ("using std::cin;\n"
12025 "using std::cout;",
12026 format("using std::cout;\n"
12027 "using std::cin;", getGoogleStyle()));
12028}
12029
Nico Weberdc065182017-04-05 18:10:42 +000012030TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
12031 format::FormatStyle Style = format::getLLVMStyle();
12032 Style.Standard = FormatStyle::LS_Cpp03;
12033 // cpp03 recognize this string as identifier u8 and literal character 'a'
12034 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
12035}
12036
12037TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
12038 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
12039 // all modes, including C++11, C++14 and C++17
12040 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
12041}
12042
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000012043TEST_F(FormatTest, DoNotFormatLikelyXml) {
12044 EXPECT_EQ("<!-- ;> -->",
12045 format("<!-- ;> -->", getGoogleStyle()));
12046 EXPECT_EQ(" <!-- >; -->",
12047 format(" <!-- >; -->", getGoogleStyle()));
12048}
12049
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012050TEST_F(FormatTest, StructuredBindings) {
12051 // Structured bindings is a C++17 feature.
12052 // all modes, including C++11, C++14 and C++17
12053 verifyFormat("auto [a, b] = f();");
12054 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
12055 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();"));
12056 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();"));
12057 EXPECT_EQ("auto const volatile [a, b] = f();",
12058 format("auto const volatile[a, b] = f();"));
12059 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012060 EXPECT_EQ("auto &[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012061 format("auto &[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012062 EXPECT_EQ("auto &&[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012063 format("auto &&[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012064 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();"));
12065 EXPECT_EQ("auto const volatile &&[a, b] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012066 format("auto const volatile &&[a, b] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012067 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();"));
12068 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();"));
12069 EXPECT_EQ("const auto volatile &&[a, b] = f();",
12070 format("const auto volatile &&[a, b] = f();"));
12071 EXPECT_EQ("volatile const auto &&[a, b] = f();",
12072 format("volatile const auto &&[a, b] = f();"));
12073 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();"));
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012074
Manuel Klimeke411aa82017-09-20 09:29:37 +000012075 // Make sure we don't mistake structured bindings for lambdas.
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012076 FormatStyle PointerMiddle = getLLVMStyle();
12077 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
12078 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
12079 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
12080 verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
12081 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
12082 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
12083 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
12084 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
12085 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
12086 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
12087 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
12088 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
12089 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
12090
12091 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
12092 format("for (const auto && [a, b] : some_range) {\n}"));
12093 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
12094 format("for (const auto & [a, b] : some_range) {\n}"));
12095 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
12096 format("for (const auto[a, b] : some_range) {\n}"));
12097 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);"));
12098 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);"));
12099 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);"));
12100 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);"));
12101 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);"));
12102 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};"));
12103 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};"));
12104 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};"));
Manuel Klimeke411aa82017-09-20 09:29:37 +000012105
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012106 format::FormatStyle Spaces = format::getLLVMStyle();
12107 Spaces.SpacesInSquareBrackets = true;
12108 verifyFormat("auto [ a, b ] = f();", Spaces);
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012109 verifyFormat("auto &&[ a, b ] = f();", Spaces);
12110 verifyFormat("auto &[ a, b ] = f();", Spaces);
12111 verifyFormat("auto const &&[ a, b ] = f();", Spaces);
12112 verifyFormat("auto const &[ a, b ] = f();", Spaces);
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012113}
12114
Ben Hamilton6e066352018-02-27 15:56:40 +000012115TEST_F(FormatTest, FileAndCode) {
12116 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
12117 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
12118 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
12119 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
12120 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
Ben Hamiltonb1a79192018-04-12 15:11:53 +000012121 EXPECT_EQ(
12122 FormatStyle::LK_ObjC,
12123 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
12124 EXPECT_EQ(FormatStyle::LK_ObjC,
12125 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
12126 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
Ben Hamilton6e066352018-02-27 15:56:40 +000012127 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
12128 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
Ben Hamilton19c782d2018-03-22 03:25:22 +000012129 EXPECT_EQ(FormatStyle::LK_ObjC,
12130 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
12131 EXPECT_EQ(
12132 FormatStyle::LK_ObjC,
12133 guessLanguage("foo.h",
12134 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
Ben Hamilton9dc78162018-04-03 14:07:11 +000012135 EXPECT_EQ(
12136 FormatStyle::LK_Cpp,
12137 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
Ben Hamilton3b345c32018-02-21 15:54:31 +000012138}
12139
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012140TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
12141 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
12142 EXPECT_EQ(FormatStyle::LK_ObjC,
12143 guessLanguage("foo.h", "array[[calculator getIndex]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012144 EXPECT_EQ(FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012145 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012146 EXPECT_EQ(
12147 FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012148 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
12149 EXPECT_EQ(FormatStyle::LK_ObjC,
12150 guessLanguage("foo.h", "[[noreturn foo] bar];"));
12151 EXPECT_EQ(FormatStyle::LK_Cpp,
12152 guessLanguage("foo.h", "[[clang::fallthrough]];"));
12153 EXPECT_EQ(FormatStyle::LK_ObjC,
12154 guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
12155 EXPECT_EQ(FormatStyle::LK_Cpp,
12156 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
12157 EXPECT_EQ(FormatStyle::LK_Cpp,
12158 guessLanguage("foo.h", "[[using clang: fallthrough]];"));
12159 EXPECT_EQ(FormatStyle::LK_ObjC,
12160 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
12161 EXPECT_EQ(FormatStyle::LK_Cpp,
12162 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
12163 EXPECT_EQ(
12164 FormatStyle::LK_Cpp,
12165 guessLanguage("foo.h",
12166 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
12167 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012168}
12169
Ben Hamilton788a2222018-03-12 15:42:40 +000012170TEST_F(FormatTest, GuessLanguageWithCaret) {
12171 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
12172 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
12173 EXPECT_EQ(FormatStyle::LK_ObjC,
12174 guessLanguage("foo.h", "int(^)(char, float);"));
12175 EXPECT_EQ(FormatStyle::LK_ObjC,
12176 guessLanguage("foo.h", "int(^foo)(char, float);"));
12177 EXPECT_EQ(FormatStyle::LK_ObjC,
12178 guessLanguage("foo.h", "int(^foo[10])(char, float);"));
12179 EXPECT_EQ(FormatStyle::LK_ObjC,
12180 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
12181 EXPECT_EQ(
12182 FormatStyle::LK_ObjC,
12183 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
12184}
12185
Ben Hamilton6432afe2018-03-22 17:37:19 +000012186TEST_F(FormatTest, GuessLanguageWithChildLines) {
12187 EXPECT_EQ(FormatStyle::LK_Cpp,
12188 guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
12189 EXPECT_EQ(FormatStyle::LK_ObjC,
12190 guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
Ben Hamiltonea7a27b2018-03-27 15:01:21 +000012191 EXPECT_EQ(
12192 FormatStyle::LK_Cpp,
12193 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
12194 EXPECT_EQ(
12195 FormatStyle::LK_ObjC,
12196 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
Ben Hamilton6432afe2018-03-22 17:37:19 +000012197}
12198
Daniel Jasperd246a5a2015-06-15 15:25:11 +000012199} // end namespace
12200} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000012201} // end namespace clang