blob: 3dd9fc00f68f42b174088ba68829077fefd5c61a [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) {
Nicola Zaghen3538b392018-05-15 13:30:56 +000042 LLVM_DEBUG(llvm::errs() << "---\n");
43 LLVM_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));
Nicola Zaghen3538b392018-05-15 13:30:56 +000056 LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
Eric Liu4f8d9942016-07-11 13:53:12 +000057 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 Georgiev62103052018-04-19 13:02:15 +0000281 // Don't remove empty lines before namespace endings.
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"
Krasimir Georgiev62103052018-04-19 13:02:15 +0000286 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000287 "}",
288 format("namespace {\n"
289 "int i;\n"
290 "\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000291 "}", LLVMWithNoNamespaceFix));
292 EXPECT_EQ("namespace {\n"
293 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000294 "}",
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000295 format("namespace {\n"
296 "int i;\n"
Krasimir Georgiev62103052018-04-19 13:02:15 +0000297 "}", LLVMWithNoNamespaceFix));
298 EXPECT_EQ("namespace {\n"
299 "int i;\n"
300 "\n"
301 "};",
302 format("namespace {\n"
303 "int i;\n"
304 "\n"
305 "};", LLVMWithNoNamespaceFix));
306 EXPECT_EQ("namespace {\n"
307 "int i;\n"
308 "};",
309 format("namespace {\n"
310 "int i;\n"
311 "};", LLVMWithNoNamespaceFix));
312 EXPECT_EQ("namespace {\n"
313 "int i;\n"
314 "\n"
315 "}",
316 format("namespace {\n"
317 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000318 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000319 "}"));
320 EXPECT_EQ("namespace {\n"
321 "int i;\n"
Krasimir Georgiev03e69f52018-03-27 13:14:29 +0000322 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000323 "} // namespace",
324 format("namespace {\n"
325 "int i;\n"
326 "\n"
327 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000328
329 FormatStyle Style = getLLVMStyle();
330 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
331 Style.MaxEmptyLinesToKeep = 2;
332 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
333 Style.BraceWrapping.AfterClass = true;
334 Style.BraceWrapping.AfterFunction = true;
335 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
336
337 EXPECT_EQ("class Foo\n"
338 "{\n"
339 " Foo() {}\n"
340 "\n"
341 " void funk() {}\n"
342 "};",
343 format("class Foo\n"
344 "{\n"
345 " Foo()\n"
346 " {\n"
347 " }\n"
348 "\n"
349 " void funk() {}\n"
350 "};",
351 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000352}
353
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000354TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000355 verifyFormat("x = (a) and (b);");
356 verifyFormat("x = (a) or (b);");
357 verifyFormat("x = (a) bitand (b);");
358 verifyFormat("x = (a) bitor (b);");
359 verifyFormat("x = (a) not_eq (b);");
360 verifyFormat("x = (a) and_eq (b);");
361 verifyFormat("x = (a) or_eq (b);");
362 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000363}
364
Olivier Goffart90f981b2017-07-14 09:23:40 +0000365TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) {
366 verifyFormat("x = compl(a);");
367 verifyFormat("x = not(a);");
368 verifyFormat("x = bitand(a);");
369 // Unary operator must not be merged with the next identifier
370 verifyFormat("x = compl a;");
371 verifyFormat("x = not a;");
372 verifyFormat("x = bitand a;");
373}
374
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000375//===----------------------------------------------------------------------===//
376// Tests for control statements.
377//===----------------------------------------------------------------------===//
378
Daniel Jaspercdd06622013-05-14 10:31:09 +0000379TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000380 verifyFormat("if (true)\n f();\ng();");
381 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000382 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000383 verifyFormat("if constexpr (true)\n"
384 " f();\ng();");
385 verifyFormat("if constexpr (a)\n"
386 " if constexpr (b)\n"
387 " if constexpr (c)\n"
388 " g();\n"
389 "h();");
390 verifyFormat("if constexpr (a)\n"
391 " if constexpr (b) {\n"
392 " f();\n"
393 " }\n"
394 "g();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000395
Daniel Jasper3a685df2013-05-16 12:12:21 +0000396 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +0000397 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jasperced17f82013-01-16 15:44:34 +0000398 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
399 verifyFormat("if (a)\n"
400 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000401 " f();",
402 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000403 verifyFormat("{\n"
404 " if (a)\n"
405 " label:\n"
406 " f();\n"
407 "}",
408 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000409 verifyFormat("#define A \\\n"
410 " if (a) \\\n"
411 " label: \\\n"
412 " f()",
413 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000414 verifyFormat("if (a)\n"
415 " ;",
416 AllowsMergedIf);
417 verifyFormat("if (a)\n"
418 " if (b) return;",
419 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000420
Daniel Jasper3a685df2013-05-16 12:12:21 +0000421 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000422 " f();\n",
423 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000424 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000425 " f();",
426 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000427 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000428 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000429 "}",
430 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000431 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000432 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000433 "}",
434 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000435
436 AllowsMergedIf.ColumnLimit = 14;
437 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000438 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000439 " return;",
440 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000441
442 AllowsMergedIf.ColumnLimit = 13;
443 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000444}
445
Daniel Jasper3a685df2013-05-16 12:12:21 +0000446TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
447 FormatStyle AllowsMergedLoops = getLLVMStyle();
448 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
449 verifyFormat("while (true) continue;", AllowsMergedLoops);
450 verifyFormat("for (;;) continue;", AllowsMergedLoops);
451 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
452 verifyFormat("while (true)\n"
453 " ;",
454 AllowsMergedLoops);
455 verifyFormat("for (;;)\n"
456 " ;",
457 AllowsMergedLoops);
458 verifyFormat("for (;;)\n"
459 " for (;;) continue;",
460 AllowsMergedLoops);
461 verifyFormat("for (;;) // Can't merge this\n"
462 " continue;",
463 AllowsMergedLoops);
464 verifyFormat("for (;;) /* still don't merge */\n"
465 " continue;",
466 AllowsMergedLoops);
467}
468
Daniel Jasper17605d32014-05-14 09:33:35 +0000469TEST_F(FormatTest, FormatShortBracedStatements) {
470 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000471 AllowSimpleBracedStatements.ColumnLimit = 40;
Daniel Jasper17605d32014-05-14 09:33:35 +0000472 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
473
474 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
475 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
476
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000477 AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom;
478 AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true;
479 AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false;
480
Daniel Jasper17605d32014-05-14 09:33:35 +0000481 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000482 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000483 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
484 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
485 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000486 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000487 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
488 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000489 verifyFormat("if (true) {\n"
490 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
491 "}",
492 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000493 verifyFormat("if (true) { //\n"
494 " f();\n"
495 "}",
496 AllowSimpleBracedStatements);
497 verifyFormat("if (true) {\n"
498 " f();\n"
499 " f();\n"
500 "}",
501 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000502 verifyFormat("if (true) {\n"
503 " f();\n"
504 "} else {\n"
505 " f();\n"
506 "}",
507 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000508
Daniel Jasperf92659e2017-06-19 07:45:41 +0000509 verifyFormat("struct A2 {\n"
510 " int X;\n"
511 "};",
512 AllowSimpleBracedStatements);
513 verifyFormat("typedef struct A2 {\n"
514 " int X;\n"
515 "} A2_t;",
516 AllowSimpleBracedStatements);
Daniel Jasperbd630732014-05-22 13:25:26 +0000517 verifyFormat("template <int> struct A2 {\n"
518 " struct B {};\n"
519 "};",
520 AllowSimpleBracedStatements);
521
Daniel Jasper17605d32014-05-14 09:33:35 +0000522 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000523 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000524 verifyFormat("if (true) {\n"
525 " f();\n"
526 "}",
527 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000528 verifyFormat("if (true) {\n"
529 " f();\n"
530 "} else {\n"
531 " f();\n"
532 "}",
533 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000534
535 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000536 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000537 verifyFormat("while (true) {\n"
538 " f();\n"
539 "}",
540 AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000541 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000542 verifyFormat("for (;;) {\n"
543 " f();\n"
544 "}",
545 AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000546
547 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
548 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
549 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = true;
550
551 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
552 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
553 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
554 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
555 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
556 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
557 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
558 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
559 verifyFormat("if (true)\n"
560 "{\n"
561 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
562 "}",
563 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 " f();\n"
573 "}",
574 AllowSimpleBracedStatements);
575 verifyFormat("if (true)\n"
576 "{\n"
577 " f();\n"
578 "} else\n"
579 "{\n"
580 " f();\n"
581 "}",
582 AllowSimpleBracedStatements);
583
584 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
585 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
586 verifyFormat("if (true)\n"
587 "{\n"
588 " f();\n"
589 "}",
590 AllowSimpleBracedStatements);
591 verifyFormat("if (true)\n"
592 "{\n"
593 " f();\n"
594 "} else\n"
595 "{\n"
596 " f();\n"
597 "}",
598 AllowSimpleBracedStatements);
599
600 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
601 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
602 verifyFormat("while (true)\n"
603 "{\n"
604 " f();\n"
605 "}",
606 AllowSimpleBracedStatements);
607 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
608 verifyFormat("for (;;)\n"
609 "{\n"
610 " f();\n"
611 "}",
612 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000613}
614
Krasimir Georgievbf4cdda2018-01-19 16:12:37 +0000615TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) {
616 FormatStyle Style = getLLVMStyleWithColumns(60);
617 Style.AllowShortBlocksOnASingleLine = true;
618 Style.AllowShortIfStatementsOnASingleLine = true;
619 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
620 EXPECT_EQ("#define A \\\n"
621 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n"
622 " { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n"
623 "X;",
624 format("#define A \\\n"
625 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n"
626 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n"
627 " }\n"
628 "X;",
629 Style));
630}
631
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000632TEST_F(FormatTest, ParseIfElse) {
633 verifyFormat("if (true)\n"
634 " if (true)\n"
635 " if (true)\n"
636 " f();\n"
637 " else\n"
638 " g();\n"
639 " else\n"
640 " h();\n"
641 "else\n"
642 " i();");
643 verifyFormat("if (true)\n"
644 " if (true)\n"
645 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000646 " if (true)\n"
647 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000648 " } else {\n"
649 " g();\n"
650 " }\n"
651 " else\n"
652 " h();\n"
653 "else {\n"
654 " i();\n"
655 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000656 verifyFormat("if (true)\n"
657 " if constexpr (true)\n"
658 " if (true) {\n"
659 " if constexpr (true)\n"
660 " f();\n"
661 " } else {\n"
662 " g();\n"
663 " }\n"
664 " else\n"
665 " h();\n"
666 "else {\n"
667 " i();\n"
668 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000669 verifyFormat("void f() {\n"
670 " if (a) {\n"
671 " } else {\n"
672 " }\n"
673 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000674}
675
676TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000677 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000678 verifyFormat("if (a)\n"
679 " f();\n"
680 "else if (b)\n"
681 " g();\n"
682 "else\n"
683 " h();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000684 verifyFormat("if constexpr (a)\n"
685 " f();\n"
686 "else if constexpr (b)\n"
687 " g();\n"
688 "else\n"
689 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000690 verifyFormat("if (a) {\n"
691 " f();\n"
692 "}\n"
693 "// or else ..\n"
694 "else {\n"
695 " g()\n"
696 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000697
698 verifyFormat("if (a) {\n"
699 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
700 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
701 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000702 verifyFormat("if (a) {\n"
703 "} else if (\n"
704 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
705 "}",
706 getLLVMStyleWithColumns(62));
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000707 verifyFormat("if (a) {\n"
708 "} else if constexpr (\n"
709 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
710 "}",
711 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000712}
713
Daniel Jasperf7935112012-12-03 18:12:45 +0000714TEST_F(FormatTest, FormatsForLoop) {
715 verifyFormat(
716 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000717 " ++VeryVeryLongLoopVariable)\n"
718 " ;");
719 verifyFormat("for (;;)\n"
720 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000721 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000722 verifyFormat("for (;;) {\n"
723 " f();\n"
724 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000725 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000726
727 verifyFormat(
728 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
729 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000730 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000731
732 verifyFormat(
733 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000734 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000735 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
736 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000737 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000738 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
739 " I = FD->getDeclsInPrototypeScope().begin(),\n"
740 " E = FD->getDeclsInPrototypeScope().end();\n"
741 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000742 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
743 " I = Container.begin(),\n"
744 " E = Container.end();\n"
745 " I != E; ++I) {\n}",
746 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000747
Daniel Jasper48c62f92013-01-28 17:30:17 +0000748 verifyFormat(
749 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
750 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
752 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000753 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000754 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
755 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
756 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000757 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
758 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
759 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000760 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
761 " aaaaaaaaaa);\n"
762 " iter; ++iter) {\n"
763 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000764 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
765 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
766 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
767 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000768
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +0000769 // These should not be formatted as Objective-C for-in loops.
770 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}");
771 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}");
772 verifyFormat("Foo *x;\nfor (x in y) {\n}");
773 verifyFormat("for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}");
774
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000775 FormatStyle NoBinPacking = getLLVMStyle();
776 NoBinPacking.BinPackParameters = false;
777 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
778 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
779 " aaaaaaaaaaaaaaaa,\n"
780 " aaaaaaaaaaaaaaaa,\n"
781 " aaaaaaaaaaaaaaaa);\n"
782 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
783 "}",
784 NoBinPacking);
785 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000786 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
787 " E = UnwrappedLines.end();\n"
788 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000789 " ++I) {\n}",
790 NoBinPacking);
Daniel Jasper7b85a192017-09-03 08:56:24 +0000791
792 FormatStyle AlignLeft = getLLVMStyle();
793 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
794 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
Daniel Jasperf7935112012-12-03 18:12:45 +0000795}
796
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000797TEST_F(FormatTest, RangeBasedForLoops) {
798 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
799 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
800 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
801 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000802 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
803 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000804 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
805 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000806}
807
Daniel Jaspere1e43192014-04-01 12:55:11 +0000808TEST_F(FormatTest, ForEachLoops) {
809 verifyFormat("void f() {\n"
810 " foreach (Item *item, itemlist) {}\n"
811 " Q_FOREACH (Item *item, itemlist) {}\n"
812 " BOOST_FOREACH (Item *item, itemlist) {}\n"
813 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
814 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000815
816 // As function-like macros.
817 verifyFormat("#define foreach(x, y)\n"
818 "#define Q_FOREACH(x, y)\n"
819 "#define BOOST_FOREACH(x, y)\n"
820 "#define UNKNOWN_FOREACH(x, y)\n");
821
822 // Not as function-like macros.
823 verifyFormat("#define foreach (x, y)\n"
824 "#define Q_FOREACH (x, y)\n"
825 "#define BOOST_FOREACH (x, y)\n"
826 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000827}
828
Daniel Jasperf7935112012-12-03 18:12:45 +0000829TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000830 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000831 verifyFormat("while (true)\n"
832 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000833 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000834 verifyFormat("while () {\n"
835 " f();\n"
836 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000837}
838
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000839TEST_F(FormatTest, FormatsDoWhile) {
840 verifyFormat("do {\n"
841 " do_something();\n"
842 "} while (something());");
843 verifyFormat("do\n"
844 " do_something();\n"
845 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000846}
847
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000848TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000849 verifyFormat("switch (x) {\n"
850 "case 1:\n"
851 " f();\n"
852 " break;\n"
853 "case kFoo:\n"
854 "case ns::kBar:\n"
855 "case kBaz:\n"
856 " break;\n"
857 "default:\n"
858 " g();\n"
859 " break;\n"
860 "}");
861 verifyFormat("switch (x) {\n"
862 "case 1: {\n"
863 " f();\n"
864 " break;\n"
865 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000866 "case 2: {\n"
867 " break;\n"
868 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000869 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000870 verifyFormat("switch (x) {\n"
871 "case 1: {\n"
872 " f();\n"
873 " {\n"
874 " g();\n"
875 " h();\n"
876 " }\n"
877 " break;\n"
878 "}\n"
879 "}");
880 verifyFormat("switch (x) {\n"
881 "case 1: {\n"
882 " f();\n"
883 " if (foo) {\n"
884 " g();\n"
885 " h();\n"
886 " }\n"
887 " break;\n"
888 "}\n"
889 "}");
890 verifyFormat("switch (x) {\n"
891 "case 1: {\n"
892 " f();\n"
893 " g();\n"
894 "} break;\n"
895 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000896 verifyFormat("switch (test)\n"
897 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000898 verifyFormat("switch (x) {\n"
899 "default: {\n"
900 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000901 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000902 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000903 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000904 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000905 "// if 1, do f()\n"
906 "case 1:\n"
907 " f();\n"
908 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000909 verifyFormat("switch (x) {\n"
910 "case 1:\n"
911 " // Do amazing stuff\n"
912 " {\n"
913 " f();\n"
914 " g();\n"
915 " }\n"
916 " break;\n"
917 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000918 verifyFormat("#define A \\\n"
919 " switch (x) { \\\n"
920 " case a: \\\n"
921 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000922 " }",
923 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000924 verifyFormat("#define OPERATION_CASE(name) \\\n"
925 " case OP_name: \\\n"
926 " return operations::Operation##name\n",
927 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000928 verifyFormat("switch (x) {\n"
929 "case 1:;\n"
930 "default:;\n"
931 " int i;\n"
932 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000933
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000934 verifyGoogleFormat("switch (x) {\n"
935 " case 1:\n"
936 " f();\n"
937 " break;\n"
938 " case kFoo:\n"
939 " case ns::kBar:\n"
940 " case kBaz:\n"
941 " break;\n"
942 " default:\n"
943 " g();\n"
944 " break;\n"
945 "}");
946 verifyGoogleFormat("switch (x) {\n"
947 " case 1: {\n"
948 " f();\n"
949 " break;\n"
950 " }\n"
951 "}");
952 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000953 " ;");
954
955 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
956 " case OP_name: \\\n"
957 " return operations::Operation##name\n");
958 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
959 " // Get the correction operation class.\n"
960 " switch (OpCode) {\n"
961 " CASE(Add);\n"
962 " CASE(Subtract);\n"
963 " default:\n"
964 " return operations::Unknown;\n"
965 " }\n"
966 "#undef OPERATION_CASE\n"
967 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000968 verifyFormat("DEBUG({\n"
969 " switch (x) {\n"
970 " case A:\n"
971 " f();\n"
972 " break;\n"
Krasimir Georgieve0926342017-07-12 15:21:43 +0000973 " // fallthrough\n"
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000974 " case B:\n"
975 " g();\n"
976 " break;\n"
977 " }\n"
978 "});");
Krasimir Georgieve0926342017-07-12 15:21:43 +0000979 EXPECT_EQ("DEBUG({\n"
980 " switch (x) {\n"
981 " case A:\n"
982 " f();\n"
983 " break;\n"
984 " // On B:\n"
985 " case B:\n"
986 " g();\n"
987 " break;\n"
988 " }\n"
989 "});",
990 format("DEBUG({\n"
991 " switch (x) {\n"
992 " case A:\n"
993 " f();\n"
994 " break;\n"
995 " // On B:\n"
996 " case B:\n"
997 " g();\n"
998 " break;\n"
999 " }\n"
1000 "});",
1001 getLLVMStyle()));
Jonas Toth81b61a82018-09-02 09:04:51 +00001002 EXPECT_EQ("switch (n) {\n"
1003 "case 0: {\n"
1004 " return false;\n"
1005 "}\n"
1006 "default: {\n"
1007 " return true;\n"
1008 "}\n"
1009 "}",
1010 format("switch (n)\n"
1011 "{\n"
1012 "case 0: {\n"
1013 " return false;\n"
1014 "}\n"
1015 "default: {\n"
1016 " return true;\n"
1017 "}\n"
1018 "}",
1019 getLLVMStyle()));
Daniel Jasper031e2402014-04-28 07:48:36 +00001020 verifyFormat("switch (a) {\n"
1021 "case (b):\n"
1022 " return;\n"
1023 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +00001024
1025 verifyFormat("switch (a) {\n"
1026 "case some_namespace::\n"
1027 " some_constant:\n"
1028 " return;\n"
1029 "}",
1030 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +00001031}
1032
Daniel Jasper2d0cd492013-10-20 16:56:16 +00001033TEST_F(FormatTest, CaseRanges) {
1034 verifyFormat("switch (x) {\n"
1035 "case 'A' ... 'Z':\n"
1036 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +00001037 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +00001038 " break;\n"
1039 "}");
1040}
1041
Daniel Jasperb87899b2014-09-10 13:11:45 +00001042TEST_F(FormatTest, ShortCaseLabels) {
1043 FormatStyle Style = getLLVMStyle();
1044 Style.AllowShortCaseLabelsOnASingleLine = true;
1045 verifyFormat("switch (a) {\n"
1046 "case 1: x = 1; break;\n"
1047 "case 2: return;\n"
1048 "case 3:\n"
1049 "case 4:\n"
1050 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +00001051 "case 6: // comment\n"
1052 " return;\n"
1053 "case 7:\n"
1054 " // comment\n"
1055 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +00001056 "case 8:\n"
1057 " x = 8; // comment\n"
1058 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001059 "default: y = 1; break;\n"
1060 "}",
1061 Style);
1062 verifyFormat("switch (a) {\n"
Francois Ferranda64ba702017-07-28 07:56:18 +00001063 "case 0: return; // comment\n"
1064 "case 1: break; // comment\n"
1065 "case 2: return;\n"
1066 "// comment\n"
1067 "case 3: return;\n"
1068 "// comment 1\n"
1069 "// comment 2\n"
1070 "// comment 3\n"
1071 "case 4: break; /* comment */\n"
1072 "case 5:\n"
1073 " // comment\n"
1074 " break;\n"
1075 "case 6: /* comment */ x = 1; break;\n"
1076 "case 7: x = /* comment */ 1; break;\n"
1077 "case 8:\n"
1078 " x = 1; /* comment */\n"
1079 " break;\n"
1080 "case 9:\n"
1081 " break; // comment line 1\n"
1082 " // comment line 2\n"
1083 "}",
1084 Style);
1085 EXPECT_EQ("switch (a) {\n"
1086 "case 1:\n"
1087 " x = 8;\n"
1088 " // fall through\n"
1089 "case 2: x = 8;\n"
1090 "// comment\n"
1091 "case 3:\n"
1092 " return; /* comment line 1\n"
1093 " * comment line 2 */\n"
1094 "case 4: i = 8;\n"
1095 "// something else\n"
1096 "#if FOO\n"
1097 "case 5: break;\n"
1098 "#endif\n"
1099 "}",
1100 format("switch (a) {\n"
1101 "case 1: x = 8;\n"
1102 " // fall through\n"
1103 "case 2:\n"
1104 " x = 8;\n"
1105 "// comment\n"
1106 "case 3:\n"
1107 " return; /* comment line 1\n"
1108 " * comment line 2 */\n"
1109 "case 4:\n"
1110 " i = 8;\n"
1111 "// something else\n"
1112 "#if FOO\n"
1113 "case 5: break;\n"
1114 "#endif\n"
1115 "}",
1116 Style));
1117 EXPECT_EQ("switch (a) {\n" "case 0:\n"
1118 " return; // long long long long long long long long long long long long comment\n"
1119 " // line\n" "}",
1120 format("switch (a) {\n"
1121 "case 0: return; // long long long long long long long long long long long long comment line\n"
1122 "}",
1123 Style));
1124 EXPECT_EQ("switch (a) {\n"
1125 "case 0:\n"
1126 " return; /* long long long long long long long long long long long long comment\n"
1127 " line */\n"
1128 "}",
1129 format("switch (a) {\n"
1130 "case 0: return; /* long long long long long long long long long long long long comment line */\n"
1131 "}",
1132 Style));
1133 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +00001134 "#if FOO\n"
1135 "case 0: return 0;\n"
1136 "#endif\n"
1137 "}",
1138 Style);
1139 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001140 "case 1: {\n"
1141 "}\n"
1142 "case 2: {\n"
1143 " return;\n"
1144 "}\n"
1145 "case 3: {\n"
1146 " x = 1;\n"
1147 " return;\n"
1148 "}\n"
1149 "case 4:\n"
1150 " if (x)\n"
1151 " return;\n"
1152 "}",
1153 Style);
1154 Style.ColumnLimit = 21;
1155 verifyFormat("switch (a) {\n"
1156 "case 1: x = 1; break;\n"
1157 "case 2: return;\n"
1158 "case 3:\n"
1159 "case 4:\n"
1160 "case 5: return;\n"
1161 "default:\n"
1162 " y = 1;\n"
1163 " break;\n"
1164 "}",
1165 Style);
Jonas Toth90d2aa22018-08-24 17:25:06 +00001166 Style.ColumnLimit = 80;
1167 Style.AllowShortCaseLabelsOnASingleLine = false;
1168 Style.IndentCaseLabels = true;
1169 EXPECT_EQ("switch (n) {\n"
1170 " default /*comments*/:\n"
1171 " return true;\n"
1172 " case 0:\n"
1173 " return false;\n"
1174 "}",
1175 format("switch (n) {\n"
1176 "default/*comments*/:\n"
1177 " return true;\n"
1178 "case 0:\n"
1179 " return false;\n"
1180 "}",
1181 Style));
Daniel Jasperb87899b2014-09-10 13:11:45 +00001182}
1183
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001184TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +00001185 verifyFormat("void f() {\n"
1186 " some_code();\n"
1187 "test_label:\n"
1188 " some_other_code();\n"
1189 " {\n"
1190 " some_more_code();\n"
1191 " another_label:\n"
1192 " some_more_code();\n"
1193 " }\n"
1194 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +00001195 verifyFormat("{\n"
1196 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00001197 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +00001198 " some_other_code();\n"
1199 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +00001200 verifyFormat("{\n"
1201 " some_code();\n"
1202 "test_label:;\n"
1203 " int i = 0;\n"
1204 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00001205}
1206
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001207//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001208// Tests for classes, namespaces, etc.
1209//===----------------------------------------------------------------------===//
1210
1211TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001212 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001213}
1214
1215TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1216 verifyFormat("class A {\n"
1217 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001218 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001219 "protected:\n"
1220 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001221 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001222 "};");
1223 verifyGoogleFormat("class A {\n"
1224 " public:\n"
1225 " protected:\n"
1226 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001227 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001228 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001229 verifyFormat("class A {\n"
1230 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001231 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001232 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001233 " void f2() {}\n"
1234 "protected slots:\n"
1235 " void f3() {}\n"
1236 "protected Q_SLOTS:\n"
1237 " void f4() {}\n"
1238 "private slots:\n"
1239 " void f5() {}\n"
1240 "private Q_SLOTS:\n"
1241 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001242 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001243 " void g1();\n"
1244 "Q_SIGNALS:\n"
1245 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001246 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001247
1248 // Don't interpret 'signals' the wrong way.
1249 verifyFormat("signals.set();");
1250 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001251 verifyFormat("{\n"
1252 " signals.set(); // This needs indentation.\n"
1253 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001254 verifyFormat("void f() {\n"
1255 "label:\n"
1256 " signals.baz();\n"
1257 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001258}
1259
Alexander Kornienkofd433362013-03-27 17:08:02 +00001260TEST_F(FormatTest, SeparatesLogicalBlocks) {
1261 EXPECT_EQ("class A {\n"
1262 "public:\n"
1263 " void f();\n"
1264 "\n"
1265 "private:\n"
1266 " void g() {}\n"
1267 " // test\n"
1268 "protected:\n"
1269 " int h;\n"
1270 "};",
1271 format("class A {\n"
1272 "public:\n"
1273 "void f();\n"
1274 "private:\n"
1275 "void g() {}\n"
1276 "// test\n"
1277 "protected:\n"
1278 "int h;\n"
1279 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001280 EXPECT_EQ("class A {\n"
1281 "protected:\n"
1282 "public:\n"
1283 " void f();\n"
1284 "};",
1285 format("class A {\n"
1286 "protected:\n"
1287 "\n"
1288 "public:\n"
1289 "\n"
1290 " void f();\n"
1291 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00001292
1293 // Even ensure proper spacing inside macros.
1294 EXPECT_EQ("#define B \\\n"
1295 " class A { \\\n"
1296 " protected: \\\n"
1297 " public: \\\n"
1298 " void f(); \\\n"
1299 " };",
1300 format("#define B \\\n"
1301 " class A { \\\n"
1302 " protected: \\\n"
1303 " \\\n"
1304 " public: \\\n"
1305 " \\\n"
1306 " void f(); \\\n"
1307 " };",
1308 getGoogleStyle()));
1309 // But don't remove empty lines after macros ending in access specifiers.
1310 EXPECT_EQ("#define A private:\n"
1311 "\n"
1312 "int i;",
1313 format("#define A private:\n"
1314 "\n"
1315 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00001316}
1317
Daniel Jasper83193602013-04-05 17:22:09 +00001318TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001319 verifyFormat("class A : public B {};");
1320 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001321
1322 verifyFormat(
1323 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001324 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001325 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1326 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001327 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001328 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001329 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001330 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1331 " public C,\n"
1332 " public D,\n"
1333 " public E,\n"
1334 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001335 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001336
1337 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001338 " ReallyReallyLongClassName {\n"
1339 " int i;\n"
1340 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001341 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001342 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1343 " aaaaaaaaaaaaaaaa> {};");
1344 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1345 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1346 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001347 verifyFormat("template <class R, class C>\n"
1348 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1349 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001350 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001351}
1352
Francois Ferrand6bb103f2018-06-11 14:41:26 +00001353TEST_F(FormatTest, BreakInheritanceStyle) {
1354 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle();
1355 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList =
1356 FormatStyle::BILS_BeforeComma;
1357 verifyFormat("class MyClass : public X {};",
1358 StyleWithInheritanceBreakBeforeComma);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001359 verifyFormat("class MyClass\n"
1360 " : public X\n"
1361 " , public Y {};",
Francois Ferrand6bb103f2018-06-11 14:41:26 +00001362 StyleWithInheritanceBreakBeforeComma);
1363 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n"
1364 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n"
1365 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1366 StyleWithInheritanceBreakBeforeComma);
1367 verifyFormat("struct aaaaaaaaaaaaa\n"
1368 " : public aaaaaaaaaaaaaaaaaaa< // break\n"
1369 " aaaaaaaaaaaaaaaa> {};",
1370 StyleWithInheritanceBreakBeforeComma);
1371
1372 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle();
1373 StyleWithInheritanceBreakAfterColon.BreakInheritanceList =
1374 FormatStyle::BILS_AfterColon;
1375 verifyFormat("class MyClass : public X {};",
1376 StyleWithInheritanceBreakAfterColon);
1377 verifyFormat("class MyClass : public X, public Y {};",
1378 StyleWithInheritanceBreakAfterColon);
1379 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n"
1380 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1381 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1382 StyleWithInheritanceBreakAfterColon);
1383 verifyFormat("struct aaaaaaaaaaaaa :\n"
1384 " public aaaaaaaaaaaaaaaaaaa< // break\n"
1385 " aaaaaaaaaaaaaaaa> {};",
1386 StyleWithInheritanceBreakAfterColon);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001387}
1388
Manuel Klimek28cacc72013-01-07 18:10:23 +00001389TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001390 verifyFormat("class A {\n} a, b;");
1391 verifyFormat("struct A {\n} a, b;");
1392 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001393}
1394
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001395TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001396 verifyFormat("enum {\n"
1397 " Zero,\n"
1398 " One = 1,\n"
1399 " Two = One + 1,\n"
1400 " Three = (One + Two),\n"
1401 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1402 " Five = (One, Two, Three, Four, 5)\n"
1403 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001404 verifyGoogleFormat("enum {\n"
1405 " Zero,\n"
1406 " One = 1,\n"
1407 " Two = One + 1,\n"
1408 " Three = (One + Two),\n"
1409 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1410 " Five = (One, Two, Three, Four, 5)\n"
1411 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001412 verifyFormat("enum Enum {};");
1413 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001414 verifyFormat("enum X E {} d;");
1415 verifyFormat("enum __attribute__((...)) E {} d;");
1416 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001417 verifyFormat("enum {\n"
1418 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001419 "};",
1420 getLLVMStyleWithColumns(30));
1421
1422 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001423 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001424
1425 EXPECT_EQ("enum KeepEmptyLines {\n"
1426 " ONE,\n"
1427 "\n"
1428 " TWO,\n"
1429 "\n"
1430 " THREE\n"
1431 "}",
1432 format("enum KeepEmptyLines {\n"
1433 " ONE,\n"
1434 "\n"
1435 " TWO,\n"
1436 "\n"
1437 "\n"
1438 " THREE\n"
1439 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001440 verifyFormat("enum E { // comment\n"
1441 " ONE,\n"
1442 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001443 "};\n"
1444 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001445 // Not enums.
1446 verifyFormat("enum X f() {\n"
1447 " a();\n"
1448 " return 42;\n"
1449 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001450 verifyFormat("enum X Type::f() {\n"
1451 " a();\n"
1452 " return 42;\n"
1453 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001454 verifyFormat("enum ::X f() {\n"
1455 " a();\n"
1456 " return 42;\n"
1457 "}");
1458 verifyFormat("enum ns::X f() {\n"
1459 " a();\n"
1460 " return 42;\n"
1461 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001462}
1463
Daniel Jasperb7150872013-08-30 10:10:19 +00001464TEST_F(FormatTest, FormatsEnumsWithErrors) {
1465 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001466 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001467 " Two = 1;\n"
1468 "};");
1469 verifyFormat("namespace n {\n"
1470 "enum Type {\n"
1471 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001472 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001473 " int i;\n"
1474 "}\n"
1475 "void g() {}");
1476}
1477
Daniel Jasper2b41a822013-08-20 12:42:50 +00001478TEST_F(FormatTest, FormatsEnumStruct) {
1479 verifyFormat("enum struct {\n"
1480 " Zero,\n"
1481 " One = 1,\n"
1482 " Two = One + 1,\n"
1483 " Three = (One + Two),\n"
1484 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1485 " Five = (One, Two, Three, Four, 5)\n"
1486 "};");
1487 verifyFormat("enum struct Enum {};");
1488 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001489 verifyFormat("enum struct X E {} d;");
1490 verifyFormat("enum struct __attribute__((...)) E {} d;");
1491 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001492 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1493}
1494
1495TEST_F(FormatTest, FormatsEnumClass) {
1496 verifyFormat("enum class {\n"
1497 " Zero,\n"
1498 " One = 1,\n"
1499 " Two = One + 1,\n"
1500 " Three = (One + Two),\n"
1501 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1502 " Five = (One, Two, Three, Four, 5)\n"
1503 "};");
1504 verifyFormat("enum class Enum {};");
1505 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001506 verifyFormat("enum class X E {} d;");
1507 verifyFormat("enum class __attribute__((...)) E {} d;");
1508 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001509 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1510}
1511
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001512TEST_F(FormatTest, FormatsEnumTypes) {
1513 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001514 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001515 " B\n"
1516 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001517 verifyFormat("enum X : int { A, B };");
1518 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001519}
1520
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001521TEST_F(FormatTest, FormatsTypedefEnum) {
1522 FormatStyle Style = getLLVMStyle();
1523 Style.ColumnLimit = 40;
1524 verifyFormat("typedef enum {} EmptyEnum;");
1525 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1526 verifyFormat("typedef enum {\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001527 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001528 " ONE = 1,\n"
1529 " TWO = 2,\n"
1530 " THREE = 3\n"
1531 "} LongEnum;",
1532 Style);
1533 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1534 Style.BraceWrapping.AfterEnum = true;
1535 verifyFormat("typedef enum {} EmptyEnum;");
1536 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1537 verifyFormat("typedef enum\n"
1538 "{\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001539 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001540 " ONE = 1,\n"
1541 " TWO = 2,\n"
1542 " THREE = 3\n"
1543 "} LongEnum;",
1544 Style);
1545}
1546
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001547TEST_F(FormatTest, FormatsNSEnums) {
1548 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1549 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1550 " // Information about someDecentlyLongValue.\n"
1551 " someDecentlyLongValue,\n"
1552 " // Information about anotherDecentlyLongValue.\n"
1553 " anotherDecentlyLongValue,\n"
1554 " // Information about aThirdDecentlyLongValue.\n"
1555 " aThirdDecentlyLongValue\n"
1556 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001557 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1558 " a = 1,\n"
1559 " b = 2,\n"
1560 " c = 3,\n"
1561 "};");
1562 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1563 " a = 1,\n"
1564 " b = 2,\n"
1565 " c = 3,\n"
1566 "};");
1567 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1568 " a = 1,\n"
1569 " b = 2,\n"
1570 " c = 3,\n"
1571 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001572}
1573
Nico Weber7769a902013-01-14 05:49:49 +00001574TEST_F(FormatTest, FormatsBitfields) {
1575 verifyFormat("struct Bitfields {\n"
1576 " unsigned sClass : 8;\n"
1577 " unsigned ValueKind : 2;\n"
1578 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001579 verifyFormat("struct A {\n"
1580 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1581 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1582 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001583 verifyFormat("struct MyStruct {\n"
1584 " uchar data;\n"
1585 " uchar : 8;\n"
1586 " uchar : 8;\n"
1587 " uchar other;\n"
1588 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001589}
1590
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001591TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001592 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1593 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1594
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001595 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001596 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001597 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001598 "}",
1599 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001600 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001601 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001602 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001603 "}",
1604 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001605 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001606 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001607 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001608 "}",
1609 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001610 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001611 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001612 "void f() { f(); }",
1613 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001614
1615 // This code is more common than we thought; if we
1616 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001617 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001618 verifyFormat("namespace {};",
1619 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001620 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001621 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001622 "};",
1623 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001624
1625 verifyFormat("namespace {\n"
1626 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001627 "} // namespace",
1628 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001629 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1630 "#define HEADER_GUARD\n"
1631 "namespace my_namespace {\n"
1632 "int i;\n"
1633 "} // my_namespace\n"
1634 "#endif // HEADER_GUARD",
1635 format("#ifndef HEADER_GUARD\n"
1636 " #define HEADER_GUARD\n"
1637 " namespace my_namespace {\n"
1638 "int i;\n"
1639 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001640 "#endif // HEADER_GUARD",
1641 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001642
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001643 EXPECT_EQ("namespace A::B {\n"
1644 "class C {};\n"
1645 "}",
1646 format("namespace A::B {\n"
1647 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001648 "}",
1649 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001650
Daniel Jasper65ee3472013-07-31 23:16:02 +00001651 FormatStyle Style = getLLVMStyle();
1652 Style.NamespaceIndentation = FormatStyle::NI_All;
1653 EXPECT_EQ("namespace out {\n"
1654 " int i;\n"
1655 " namespace in {\n"
1656 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001657 " } // namespace in\n"
1658 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001659 format("namespace out {\n"
1660 "int i;\n"
1661 "namespace in {\n"
1662 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001663 "} // namespace in\n"
1664 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001665 Style));
1666
1667 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1668 EXPECT_EQ("namespace out {\n"
1669 "int i;\n"
1670 "namespace in {\n"
1671 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001672 "} // namespace in\n"
1673 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001674 format("namespace out {\n"
1675 "int i;\n"
1676 "namespace in {\n"
1677 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001678 "} // namespace in\n"
1679 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001680 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001681}
1682
Francois Ferrande56a8292017-06-14 12:29:47 +00001683TEST_F(FormatTest, FormatsCompactNamespaces) {
1684 FormatStyle Style = getLLVMStyle();
1685 Style.CompactNamespaces = true;
1686
1687 verifyFormat("namespace A { namespace B {\n"
1688 "}} // namespace A::B",
1689 Style);
1690
1691 EXPECT_EQ("namespace out { namespace in {\n"
1692 "}} // namespace out::in",
1693 format("namespace out {\n"
1694 "namespace in {\n"
1695 "} // namespace in\n"
1696 "} // namespace out",
1697 Style));
1698
1699 // Only namespaces which have both consecutive opening and end get compacted
1700 EXPECT_EQ("namespace out {\n"
1701 "namespace in1 {\n"
1702 "} // namespace in1\n"
1703 "namespace in2 {\n"
1704 "} // namespace in2\n"
1705 "} // namespace out",
1706 format("namespace out {\n"
1707 "namespace in1 {\n"
1708 "} // namespace in1\n"
1709 "namespace in2 {\n"
1710 "} // namespace in2\n"
1711 "} // namespace out",
1712 Style));
1713
1714 EXPECT_EQ("namespace out {\n"
1715 "int i;\n"
1716 "namespace in {\n"
1717 "int j;\n"
1718 "} // namespace in\n"
1719 "int k;\n"
1720 "} // namespace out",
1721 format("namespace out { int i;\n"
1722 "namespace in { int j; } // namespace in\n"
1723 "int k; } // namespace out",
1724 Style));
1725
1726 EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1727 "}}} // namespace A::B::C\n",
1728 format("namespace A { namespace B {\n"
1729 "namespace C {\n"
1730 "}} // namespace B::C\n"
1731 "} // namespace A\n",
1732 Style));
1733
1734 Style.ColumnLimit = 40;
1735 EXPECT_EQ("namespace aaaaaaaaaa {\n"
1736 "namespace bbbbbbbbbb {\n"
1737 "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1738 format("namespace aaaaaaaaaa {\n"
1739 "namespace bbbbbbbbbb {\n"
1740 "} // namespace bbbbbbbbbb\n"
1741 "} // namespace aaaaaaaaaa",
1742 Style));
1743
1744 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1745 "namespace cccccc {\n"
1746 "}}} // namespace aaaaaa::bbbbbb::cccccc",
1747 format("namespace aaaaaa {\n"
1748 "namespace bbbbbb {\n"
1749 "namespace cccccc {\n"
1750 "} // namespace cccccc\n"
1751 "} // namespace bbbbbb\n"
1752 "} // namespace aaaaaa",
1753 Style));
1754 Style.ColumnLimit = 80;
1755
1756 // Extra semicolon after 'inner' closing brace prevents merging
1757 EXPECT_EQ("namespace out { namespace in {\n"
1758 "}; } // namespace out::in",
1759 format("namespace out {\n"
1760 "namespace in {\n"
1761 "}; // namespace in\n"
1762 "} // namespace out",
1763 Style));
1764
1765 // Extra semicolon after 'outer' closing brace is conserved
1766 EXPECT_EQ("namespace out { namespace in {\n"
1767 "}}; // namespace out::in",
1768 format("namespace out {\n"
1769 "namespace in {\n"
1770 "} // namespace in\n"
1771 "}; // namespace out",
1772 Style));
1773
1774 Style.NamespaceIndentation = FormatStyle::NI_All;
1775 EXPECT_EQ("namespace out { namespace in {\n"
1776 " int i;\n"
1777 "}} // namespace out::in",
1778 format("namespace out {\n"
1779 "namespace in {\n"
1780 "int i;\n"
1781 "} // namespace in\n"
1782 "} // namespace out",
1783 Style));
1784 EXPECT_EQ("namespace out { namespace mid {\n"
1785 " namespace in {\n"
1786 " int j;\n"
1787 " } // namespace in\n"
1788 " int k;\n"
1789 "}} // namespace out::mid",
1790 format("namespace out { namespace mid {\n"
1791 "namespace in { int j; } // namespace in\n"
1792 "int k; }} // namespace out::mid",
1793 Style));
1794
1795 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1796 EXPECT_EQ("namespace out { namespace in {\n"
1797 " int i;\n"
1798 "}} // namespace out::in",
1799 format("namespace out {\n"
1800 "namespace in {\n"
1801 "int i;\n"
1802 "} // namespace in\n"
1803 "} // namespace out",
1804 Style));
1805 EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1806 " int i;\n"
1807 "}}} // namespace out::mid::in",
1808 format("namespace out {\n"
1809 "namespace mid {\n"
1810 "namespace in {\n"
1811 "int i;\n"
1812 "} // namespace in\n"
1813 "} // namespace mid\n"
1814 "} // namespace out",
1815 Style));
1816}
1817
Krasimir Georgievd6ce9372017-09-15 11:23:50 +00001818TEST_F(FormatTest, FormatsExternC) {
1819 verifyFormat("extern \"C\" {\nint a;");
1820 verifyFormat("extern \"C\" {}");
1821 verifyFormat("extern \"C\" {\n"
1822 "int foo();\n"
1823 "}");
1824 verifyFormat("extern \"C\" int foo() {}");
1825 verifyFormat("extern \"C\" int foo();");
1826 verifyFormat("extern \"C\" int foo() {\n"
1827 " int i = 42;\n"
1828 " return i;\n"
1829 "}");
1830
1831 FormatStyle Style = getLLVMStyle();
1832 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1833 Style.BraceWrapping.AfterFunction = true;
1834 verifyFormat("extern \"C\" int foo() {}", Style);
1835 verifyFormat("extern \"C\" int foo();", Style);
1836 verifyFormat("extern \"C\" int foo()\n"
1837 "{\n"
1838 " int i = 42;\n"
1839 " return i;\n"
1840 "}",
1841 Style);
1842
1843 Style.BraceWrapping.AfterExternBlock = true;
1844 Style.BraceWrapping.SplitEmptyRecord = false;
1845 verifyFormat("extern \"C\"\n"
1846 "{}",
1847 Style);
1848 verifyFormat("extern \"C\"\n"
1849 "{\n"
1850 " int foo();\n"
1851 "}",
1852 Style);
1853}
Manuel Klimekae610d12013-01-21 14:32:05 +00001854
Daniel Jasper40aacf42013-03-14 13:45:21 +00001855TEST_F(FormatTest, FormatsInlineASM) {
1856 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001857 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001858 verifyFormat(
1859 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1860 " \"cpuid\\n\\t\"\n"
1861 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001862 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001863 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001864 EXPECT_EQ(
1865 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001866 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001867 " mov edx,[that] // vtable in edx\n"
1868 " mov eax,methodIndex\n"
1869 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001870 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001871 "}",
1872 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1873 " __asm {\n"
1874 " mov edx,[that] // vtable in edx\n"
1875 " mov eax,methodIndex\n"
1876 " call [edx][eax*4] // stdcall\n"
1877 " }\n"
1878 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001879 EXPECT_EQ("_asm {\n"
1880 " xor eax, eax;\n"
1881 " cpuid;\n"
1882 "}",
1883 format("_asm {\n"
1884 " xor eax, eax;\n"
1885 " cpuid;\n"
1886 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001887 verifyFormat("void function() {\n"
1888 " // comment\n"
1889 " asm(\"\");\n"
1890 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001891 EXPECT_EQ("__asm {\n"
1892 "}\n"
1893 "int i;",
1894 format("__asm {\n"
1895 "}\n"
1896 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001897}
1898
Nico Weberd5650bd2013-01-07 16:36:17 +00001899TEST_F(FormatTest, FormatTryCatch) {
1900 verifyFormat("try {\n"
1901 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001902 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001903 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001904 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001905 " exit(42);\n"
1906 "}");
1907
1908 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001909 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001910 " return 5;\n"
1911 "}");
1912 verifyFormat("class A {\n"
1913 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001914 " A() try : a(0) {\n"
1915 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001916 " throw;\n"
1917 " }\n"
1918 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001919
1920 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001921 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001922}
1923
Nico Weberfac23712015-02-04 15:26:27 +00001924TEST_F(FormatTest, FormatSEHTryCatch) {
1925 verifyFormat("__try {\n"
1926 " int a = b * c;\n"
1927 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1928 " // Do nothing.\n"
1929 "}");
1930
1931 verifyFormat("__try {\n"
1932 " int a = b * c;\n"
1933 "} __finally {\n"
1934 " // Do nothing.\n"
1935 "}");
1936
1937 verifyFormat("DEBUG({\n"
1938 " __try {\n"
1939 " } __finally {\n"
1940 " }\n"
1941 "});\n");
1942}
1943
Daniel Jasper04a71a42014-05-08 11:58:24 +00001944TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1945 verifyFormat("try {\n"
1946 " f();\n"
1947 "} catch {\n"
1948 " g();\n"
1949 "}");
1950 verifyFormat("try {\n"
1951 " f();\n"
1952 "} catch (A a) MACRO(x) {\n"
1953 " g();\n"
1954 "} catch (B b) MACRO(x) {\n"
1955 " g();\n"
1956 "}");
1957}
1958
1959TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1960 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001961 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1962 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001963 Style.BreakBeforeBraces = BraceStyle;
1964 verifyFormat("try {\n"
1965 " // something\n"
1966 "} catch (...) {\n"
1967 " // something\n"
1968 "}",
1969 Style);
1970 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001971 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1972 verifyFormat("try {\n"
1973 " // something\n"
1974 "}\n"
1975 "catch (...) {\n"
1976 " // something\n"
1977 "}",
1978 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001979 verifyFormat("__try {\n"
1980 " // something\n"
1981 "}\n"
1982 "__finally {\n"
1983 " // something\n"
1984 "}",
1985 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001986 verifyFormat("@try {\n"
1987 " // something\n"
1988 "}\n"
1989 "@finally {\n"
1990 " // something\n"
1991 "}",
1992 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001993 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1994 verifyFormat("try\n"
1995 "{\n"
1996 " // something\n"
1997 "}\n"
1998 "catch (...)\n"
1999 "{\n"
2000 " // something\n"
2001 "}",
2002 Style);
2003 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2004 verifyFormat("try\n"
2005 " {\n"
2006 " // something\n"
2007 " }\n"
2008 "catch (...)\n"
2009 " {\n"
2010 " // something\n"
2011 " }",
2012 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00002013 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2014 Style.BraceWrapping.BeforeCatch = true;
2015 verifyFormat("try {\n"
2016 " // something\n"
2017 "}\n"
2018 "catch (...) {\n"
2019 " // something\n"
2020 "}",
2021 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002022}
2023
Daniel Jaspere25509f2012-12-17 11:29:41 +00002024TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002025 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00002026
Daniel Jaspera44991332015-04-29 13:06:49 +00002027 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2028 " 100000000, "
2029 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00002030
Daniel Jasper473c62c2013-05-17 09:35:01 +00002031 // Here, everything other than the "}" would fit on a line.
2032 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002033 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002034 EXPECT_EQ("S s = {a,\n"
2035 "\n"
2036 " b};",
2037 format("S s = {\n"
2038 " a,\n"
2039 "\n"
2040 " b\n"
2041 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00002042
2043 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2044 // line. However, the formatting looks a bit off and this probably doesn't
2045 // happen often in practice.
2046 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002047 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00002048 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00002049}
2050
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002051TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002052 verifyFormat("const struct A a = {.a = 1, .b = 2};");
2053 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2054 " .bbbbbbbbbb = 2,\n"
2055 " .cccccccccc = 3,\n"
2056 " .dddddddddd = 4,\n"
2057 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002058 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002059 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2060 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2061 " .ccccccccccccccccccccccccccc = 3,\n"
2062 " .ddddddddddddddddddddddddddd = 4,\n"
2063 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002064
2065 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00002066
2067 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
2068 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
2069 " [2] = bbbbbbbbbb,\n"
2070 " [3] = cccccccccc,\n"
2071 " [4] = dddddddddd,\n"
2072 " [5] = eeeeeeeeee};");
2073 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2074 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2075 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2076 " [3] = cccccccccccccccccccccccccccccccccccccc,\n"
2077 " [4] = dddddddddddddddddddddddddddddddddddddd,\n"
2078 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002079}
2080
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002081TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002082 verifyFormat("static A x = {{{}}};\n");
2083 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2084 " {init1, init2, init3, init4}}};",
2085 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00002086
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002087 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002088 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2089 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2090 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2091 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00002092 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002093 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2094 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2095 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00002096 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2097 " {rect.fRight - rect.fLeft, rect.fBottom - "
2098 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002099
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002100 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00002101 "SomeArrayOfSomeType a = {\n"
2102 " {{1, 2, 3},\n"
2103 " {1, 2, 3},\n"
2104 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
2105 " 333333333333333333333333333333},\n"
2106 " {1, 2, 3},\n"
2107 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00002108 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00002109 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002110 " {{1, 2, 3}},\n"
2111 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002112 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2113 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002114 " {{1, 2, 3}},\n"
2115 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002116
Daniel Jaspera44991332015-04-29 13:06:49 +00002117 verifyFormat("struct {\n"
2118 " unsigned bit;\n"
2119 " const char *const name;\n"
2120 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2121 " {kOsWin, \"Windows\"},\n"
2122 " {kOsLinux, \"Linux\"},\n"
2123 " {kOsCrOS, \"Chrome OS\"}};");
2124 verifyFormat("struct {\n"
2125 " unsigned bit;\n"
2126 " const char *const name;\n"
2127 "} kBitsToOs[] = {\n"
2128 " {kOsMac, \"Mac\"},\n"
2129 " {kOsWin, \"Windows\"},\n"
2130 " {kOsLinux, \"Linux\"},\n"
2131 " {kOsCrOS, \"Chrome OS\"},\n"
2132 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002133}
2134
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002135TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2136 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2137 " \\\n"
2138 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2139}
2140
Daniel Jasperda16db32013-01-07 10:48:50 +00002141TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002142 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2143 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00002144
2145 // Do break defaulted and deleted functions.
2146 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2147 " default;",
2148 getLLVMStyleWithColumns(40));
2149 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2150 " delete;",
2151 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002152}
2153
2154TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2155 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2156 getLLVMStyleWithColumns(40));
2157 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2158 getLLVMStyleWithColumns(40));
2159 EXPECT_EQ("#define Q \\\n"
2160 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
2161 " \"aaaaaaaa.cpp\"",
2162 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2163 getLLVMStyleWithColumns(40)));
2164}
2165
2166TEST_F(FormatTest, UnderstandsLinePPDirective) {
2167 EXPECT_EQ("# 123 \"A string literal\"",
2168 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00002169}
2170
Manuel Klimek591b5802013-01-31 15:58:48 +00002171TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00002172 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00002173 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002174}
2175
2176TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2177 EXPECT_EQ("#line 42 \"test\"\n",
2178 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002179 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
2180 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002181}
2182
2183TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2184 EXPECT_EQ("#line 42 \"test\"",
2185 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002186 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002187}
2188
Daniel Jasper877615c2013-10-11 19:45:02 +00002189TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2190 verifyFormat("#define A \\x20");
2191 verifyFormat("#define A \\ x20");
2192 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
2193 verifyFormat("#define A ''");
2194 verifyFormat("#define A ''qqq");
2195 verifyFormat("#define A `qqq");
2196 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00002197 EXPECT_EQ("const char *c = STRINGIFY(\n"
2198 "\\na : b);",
2199 format("const char * c = STRINGIFY(\n"
2200 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00002201
2202 verifyFormat("a\r\\");
2203 verifyFormat("a\v\\");
2204 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00002205}
2206
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002207TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002208 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2209 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002210 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002211 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00002212 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00002213
2214 verifyFormat("#define A A\n#define A A");
2215 verifyFormat("#define A(X) A\n#define A A");
2216
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002217 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2218 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002219}
2220
2221TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002222 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002223 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002224 "#define A( \\\n"
2225 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002226 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002227 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002228 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002229 " #include \"a.h\"\n"
2230 "#define A(A,\\\n"
2231 " B)\n"
2232 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002233 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002234 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002235}
2236
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002237TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002238
2239TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2240 EXPECT_EQ("#define A \\\n"
2241 " c; \\\n"
2242 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002243 "f;",
2244 format("#define A c; e;\n"
2245 "f;",
2246 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002247}
2248
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002249TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002250
Manuel Klimek1abf7892013-01-04 23:34:14 +00002251TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002252 EXPECT_EQ("int x,\n"
2253 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002254 " y;",
2255 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002256}
2257
Manuel Klimek09e07972013-01-05 21:34:55 +00002258TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002259 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002260 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002261 verifyFormat("#define A \\\n"
2262 " { \\\n"
2263 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002264 " }",
2265 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002266
2267 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002268 " void function##X()",
2269 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002270
2271 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002272 " void a##b##c()",
2273 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002274
Daniel Jasper39825ea2013-01-14 15:40:57 +00002275 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002276}
2277
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002278TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002279 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2280 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002281}
2282
Manuel Klimek0c137952013-02-11 12:33:24 +00002283TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2284 EXPECT_EQ("#define A b;", format("#define A \\\n"
2285 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002286 " b;",
2287 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002288 EXPECT_EQ("#define A \\\n"
2289 " \\\n"
2290 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002291 " b;",
2292 format("#define A \\\n"
2293 " \\\n"
2294 " a; \\\n"
2295 " b;",
2296 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002297 EXPECT_EQ("#define A \\\n"
2298 " a; \\\n"
2299 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002300 " b;",
2301 format("#define A \\\n"
2302 " a; \\\n"
2303 " \\\n"
2304 " b;",
2305 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002306}
2307
Daniel Jasper00475962013-02-19 17:14:38 +00002308TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002309 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002310 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002311 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002312 " case 2\n",
2313 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002314 verifyFormat("#define MACRO(a) \\\n"
2315 " if (a) \\\n"
2316 " f(); \\\n"
2317 " else \\\n"
2318 " g()",
2319 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002320 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002321 verifyIncompleteFormat("#define STR(x) #x\n"
2322 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002323 verifyFormat("#pragma omp threadprivate( \\\n"
2324 " y)), // expected-warning",
2325 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002326 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002327 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002328 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002329 "#define b \\\n"
2330 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002331 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002332 "a",
2333 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002334 verifyFormat("#define A \\\n"
2335 " { \\\n"
2336 " {\n"
2337 "#define B \\\n"
2338 " } \\\n"
2339 " }",
2340 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002341 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002342 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002343 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002344 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002345}
2346
Daniel Jasper40e19212013-05-29 13:16:10 +00002347TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2348 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2349 EXPECT_EQ("class A : public QObject {\n"
2350 " Q_OBJECT\n"
2351 "\n"
2352 " A() {}\n"
2353 "};",
2354 format("class A : public QObject {\n"
2355 " Q_OBJECT\n"
2356 "\n"
2357 " A() {\n}\n"
2358 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002359 EXPECT_EQ("MACRO\n"
2360 "/*static*/ int i;",
2361 format("MACRO\n"
2362 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002363 EXPECT_EQ("SOME_MACRO\n"
2364 "namespace {\n"
2365 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002366 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00002367 format("SOME_MACRO\n"
2368 " namespace {\n"
2369 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002370 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002371 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002372 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2373 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002374 // Only if everything is upper case.
2375 EXPECT_EQ("class A : public QObject {\n"
2376 " Q_Object A() {}\n"
2377 "};",
2378 format("class A : public QObject {\n"
2379 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002380 " A() {\n}\n"
2381 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002382
2383 // Only if the next line can actually start an unwrapped line.
2384 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2385 format("SOME_WEIRD_LOG_MACRO\n"
2386 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002387
2388 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002389 "(n, buffers))\n",
2390 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002391}
2392
Alexander Kornienkode644272013-04-08 22:16:06 +00002393TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2394 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2395 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2396 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002397 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002398 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2399 "int *createScopDetectionPass() { return 0; }",
2400 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2401 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2402 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2403 " class X {};\n"
2404 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2405 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002406 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2407 // braces, so that inner block is indented one level more.
2408 EXPECT_EQ("int q() {\n"
2409 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2410 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2411 " IPC_END_MESSAGE_MAP()\n"
2412 "}",
2413 format("int q() {\n"
2414 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2415 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2416 " IPC_END_MESSAGE_MAP()\n"
2417 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002418
Daniel Jasper352dae12014-01-03 11:50:46 +00002419 // Same inside macros.
2420 EXPECT_EQ("#define LIST(L) \\\n"
2421 " L(A) \\\n"
2422 " L(B) \\\n"
2423 " L(C)",
2424 format("#define LIST(L) \\\n"
2425 " L(A) \\\n"
2426 " L(B) \\\n"
2427 " L(C)",
2428 getGoogleStyle()));
2429
Daniel Jasper545c6522013-09-17 09:26:07 +00002430 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002431 EXPECT_EQ("int q() {\n"
2432 " f(x);\n"
2433 " f(x) {}\n"
2434 " f(x)->g();\n"
2435 " f(x)->*g();\n"
2436 " f(x).g();\n"
2437 " f(x) = x;\n"
2438 " f(x) += x;\n"
2439 " f(x) -= x;\n"
2440 " f(x) *= x;\n"
2441 " f(x) /= x;\n"
2442 " f(x) %= x;\n"
2443 " f(x) &= x;\n"
2444 " f(x) |= x;\n"
2445 " f(x) ^= x;\n"
2446 " f(x) >>= x;\n"
2447 " f(x) <<= x;\n"
2448 " f(x)[y].z();\n"
2449 " LOG(INFO) << x;\n"
2450 " ifstream(x) >> x;\n"
2451 "}\n",
2452 format("int q() {\n"
2453 " f(x)\n;\n"
2454 " f(x)\n {}\n"
2455 " f(x)\n->g();\n"
2456 " f(x)\n->*g();\n"
2457 " f(x)\n.g();\n"
2458 " f(x)\n = x;\n"
2459 " f(x)\n += x;\n"
2460 " f(x)\n -= x;\n"
2461 " f(x)\n *= x;\n"
2462 " f(x)\n /= x;\n"
2463 " f(x)\n %= x;\n"
2464 " f(x)\n &= x;\n"
2465 " f(x)\n |= x;\n"
2466 " f(x)\n ^= x;\n"
2467 " f(x)\n >>= x;\n"
2468 " f(x)\n <<= x;\n"
2469 " f(x)\n[y].z();\n"
2470 " LOG(INFO)\n << x;\n"
2471 " ifstream(x)\n >> x;\n"
2472 "}\n"));
2473 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002474 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002475 " if (1) {\n"
2476 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002477 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002478 " while (1) {\n"
2479 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002480 " F(x)\n"
2481 " G(x);\n"
2482 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002483 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002484 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002485 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002486 " }\n"
2487 "}\n",
2488 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002489 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002490 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002491 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002492 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002493 "F(x)\n"
2494 "G(x);\n"
2495 "F(x)\n"
2496 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002497 "}\n"));
2498 EXPECT_EQ("class A {\n"
2499 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002500 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002501 " A(X x)\n" // FIXME: function-level try blocks are broken.
2502 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002503 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002504 " }\n"
2505 "};",
2506 format("class A {\n"
2507 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002508 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002509 " A(X x)\n"
2510 " try : t(0) {} catch (...) {}\n"
2511 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002512 EXPECT_EQ("class SomeClass {\n"
2513 "public:\n"
2514 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2515 "};",
2516 format("class SomeClass {\n"
2517 "public:\n"
2518 " SomeClass()\n"
2519 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2520 "};"));
2521 EXPECT_EQ("class SomeClass {\n"
2522 "public:\n"
2523 " SomeClass()\n"
2524 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2525 "};",
2526 format("class SomeClass {\n"
2527 "public:\n"
2528 " SomeClass()\n"
2529 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2530 "};",
2531 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002532
2533 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002534}
2535
Manuel Klimek4fe43002013-05-22 12:51:29 +00002536TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2537 verifyFormat("#define A \\\n"
2538 " f({ \\\n"
2539 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002540 " });",
2541 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002542}
2543
Krasimir Georgievad47c902017-08-30 14:34:57 +00002544TEST_F(FormatTest, IndentPreprocessorDirectives) {
2545 FormatStyle Style = getLLVMStyle();
2546 Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2547 Style.ColumnLimit = 40;
2548 verifyFormat("#ifdef _WIN32\n"
2549 "#define A 0\n"
2550 "#ifdef VAR2\n"
2551 "#define B 1\n"
2552 "#include <someheader.h>\n"
2553 "#define MACRO \\\n"
2554 " some_very_long_func_aaaaaaaaaa();\n"
2555 "#endif\n"
2556 "#else\n"
2557 "#define A 1\n"
2558 "#endif",
2559 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002560 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2561 verifyFormat("#ifdef _WIN32\n"
2562 "# define A 0\n"
2563 "# ifdef VAR2\n"
2564 "# define B 1\n"
2565 "# include <someheader.h>\n"
2566 "# define MACRO \\\n"
2567 " some_very_long_func_aaaaaaaaaa();\n"
2568 "# endif\n"
2569 "#else\n"
2570 "# define A 1\n"
2571 "#endif",
2572 Style);
2573 verifyFormat("#if A\n"
2574 "# define MACRO \\\n"
2575 " void a(int x) { \\\n"
2576 " b(); \\\n"
2577 " c(); \\\n"
2578 " d(); \\\n"
2579 " e(); \\\n"
2580 " f(); \\\n"
2581 " }\n"
2582 "#endif",
2583 Style);
2584 // Comments before include guard.
2585 verifyFormat("// file comment\n"
2586 "// file comment\n"
2587 "#ifndef HEADER_H\n"
2588 "#define HEADER_H\n"
2589 "code();\n"
2590 "#endif",
2591 Style);
2592 // Test with include guards.
Krasimir Georgievad47c902017-08-30 14:34:57 +00002593 verifyFormat("#ifndef HEADER_H\n"
2594 "#define HEADER_H\n"
2595 "code();\n"
2596 "#endif",
2597 Style);
2598 // Include guards must have a #define with the same variable immediately
2599 // after #ifndef.
2600 verifyFormat("#ifndef NOT_GUARD\n"
2601 "# define FOO\n"
2602 "code();\n"
2603 "#endif",
2604 Style);
2605
2606 // Include guards must cover the entire file.
2607 verifyFormat("code();\n"
2608 "code();\n"
2609 "#ifndef NOT_GUARD\n"
2610 "# define NOT_GUARD\n"
2611 "code();\n"
2612 "#endif",
2613 Style);
2614 verifyFormat("#ifndef NOT_GUARD\n"
2615 "# define NOT_GUARD\n"
2616 "code();\n"
2617 "#endif\n"
2618 "code();",
2619 Style);
2620 // Test with trailing blank lines.
2621 verifyFormat("#ifndef HEADER_H\n"
2622 "#define HEADER_H\n"
2623 "code();\n"
2624 "#endif\n",
2625 Style);
2626 // Include guards don't have #else.
2627 verifyFormat("#ifndef NOT_GUARD\n"
2628 "# define NOT_GUARD\n"
2629 "code();\n"
2630 "#else\n"
2631 "#endif",
2632 Style);
2633 verifyFormat("#ifndef NOT_GUARD\n"
2634 "# define NOT_GUARD\n"
2635 "code();\n"
2636 "#elif FOO\n"
2637 "#endif",
2638 Style);
Mark Zeren1c3afaf2018-02-05 15:59:00 +00002639 // Non-identifier #define after potential include guard.
2640 verifyFormat("#ifndef FOO\n"
2641 "# define 1\n"
2642 "#endif\n",
2643 Style);
2644 // #if closes past last non-preprocessor line.
2645 verifyFormat("#ifndef FOO\n"
2646 "#define FOO\n"
2647 "#if 1\n"
2648 "int i;\n"
2649 "# define A 0\n"
2650 "#endif\n"
2651 "#endif\n",
2652 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002653 // FIXME: This doesn't handle the case where there's code between the
2654 // #ifndef and #define but all other conditions hold. This is because when
2655 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2656 // previous code line yet, so we can't detect it.
2657 EXPECT_EQ("#ifndef NOT_GUARD\n"
2658 "code();\n"
2659 "#define NOT_GUARD\n"
2660 "code();\n"
2661 "#endif",
2662 format("#ifndef NOT_GUARD\n"
2663 "code();\n"
2664 "# define NOT_GUARD\n"
2665 "code();\n"
2666 "#endif",
2667 Style));
2668 // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2669 // be outside an include guard. Examples are #pragma once and
2670 // #pragma GCC diagnostic, or anything else that does not change the meaning
2671 // of the file if it's included multiple times.
2672 EXPECT_EQ("#ifdef WIN32\n"
2673 "# pragma once\n"
2674 "#endif\n"
2675 "#ifndef HEADER_H\n"
2676 "# define HEADER_H\n"
2677 "code();\n"
2678 "#endif",
2679 format("#ifdef WIN32\n"
2680 "# pragma once\n"
2681 "#endif\n"
2682 "#ifndef HEADER_H\n"
2683 "#define HEADER_H\n"
2684 "code();\n"
2685 "#endif",
2686 Style));
2687 // FIXME: This does not detect when there is a single non-preprocessor line
2688 // in front of an include-guard-like structure where other conditions hold
2689 // because ScopedLineState hides the line.
2690 EXPECT_EQ("code();\n"
2691 "#ifndef HEADER_H\n"
2692 "#define HEADER_H\n"
2693 "code();\n"
2694 "#endif",
2695 format("code();\n"
2696 "#ifndef HEADER_H\n"
2697 "# define HEADER_H\n"
2698 "code();\n"
2699 "#endif",
2700 Style));
Mark Zerend2b2ac62018-01-31 20:05:50 +00002701 // Keep comments aligned with #, otherwise indent comments normally. These
2702 // tests cannot use verifyFormat because messUp manipulates leading
2703 // whitespace.
2704 {
2705 const char *Expected = ""
2706 "void f() {\n"
2707 "#if 1\n"
2708 "// Preprocessor aligned.\n"
2709 "# define A 0\n"
2710 " // Code. Separated by blank line.\n"
2711 "\n"
2712 "# define B 0\n"
2713 " // Code. Not aligned with #\n"
2714 "# define C 0\n"
2715 "#endif";
2716 const char *ToFormat = ""
2717 "void f() {\n"
2718 "#if 1\n"
2719 "// Preprocessor aligned.\n"
2720 "# define A 0\n"
2721 "// Code. Separated by blank line.\n"
2722 "\n"
2723 "# define B 0\n"
2724 " // Code. Not aligned with #\n"
2725 "# define C 0\n"
2726 "#endif";
2727 EXPECT_EQ(Expected, format(ToFormat, Style));
2728 EXPECT_EQ(Expected, format(Expected, Style));
2729 }
2730 // Keep block quotes aligned.
2731 {
2732 const char *Expected = ""
2733 "void f() {\n"
2734 "#if 1\n"
2735 "/* Preprocessor aligned. */\n"
2736 "# define A 0\n"
2737 " /* Code. Separated by blank line. */\n"
2738 "\n"
2739 "# define B 0\n"
2740 " /* Code. Not aligned with # */\n"
2741 "# define C 0\n"
2742 "#endif";
2743 const char *ToFormat = ""
2744 "void f() {\n"
2745 "#if 1\n"
2746 "/* Preprocessor aligned. */\n"
2747 "# define A 0\n"
2748 "/* Code. Separated by blank line. */\n"
2749 "\n"
2750 "# define B 0\n"
2751 " /* Code. Not aligned with # */\n"
2752 "# define C 0\n"
2753 "#endif";
2754 EXPECT_EQ(Expected, format(ToFormat, Style));
2755 EXPECT_EQ(Expected, format(Expected, Style));
2756 }
2757 // Keep comments aligned with un-indented directives.
2758 {
2759 const char *Expected = ""
2760 "void f() {\n"
2761 "// Preprocessor aligned.\n"
2762 "#define A 0\n"
2763 " // Code. Separated by blank line.\n"
2764 "\n"
2765 "#define B 0\n"
2766 " // Code. Not aligned with #\n"
2767 "#define C 0\n";
2768 const char *ToFormat = ""
2769 "void f() {\n"
2770 "// Preprocessor aligned.\n"
2771 "#define A 0\n"
2772 "// Code. Separated by blank line.\n"
2773 "\n"
2774 "#define B 0\n"
2775 " // Code. Not aligned with #\n"
2776 "#define C 0\n";
2777 EXPECT_EQ(Expected, format(ToFormat, Style));
2778 EXPECT_EQ(Expected, format(Expected, Style));
2779 }
Krasimir Georgievad47c902017-08-30 14:34:57 +00002780 // Test with tabs.
2781 Style.UseTab = FormatStyle::UT_Always;
2782 Style.IndentWidth = 8;
2783 Style.TabWidth = 8;
2784 verifyFormat("#ifdef _WIN32\n"
2785 "#\tdefine A 0\n"
2786 "#\tifdef VAR2\n"
2787 "#\t\tdefine B 1\n"
2788 "#\t\tinclude <someheader.h>\n"
2789 "#\t\tdefine MACRO \\\n"
2790 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
2791 "#\tendif\n"
2792 "#else\n"
2793 "#\tdefine A 1\n"
2794 "#endif",
2795 Style);
Daniel Jasper4df130f2017-09-04 13:33:52 +00002796
2797 // Regression test: Multiline-macro inside include guards.
2798 verifyFormat("#ifndef HEADER_H\n"
2799 "#define HEADER_H\n"
2800 "#define A() \\\n"
2801 " int i; \\\n"
2802 " int j;\n"
2803 "#endif // HEADER_H",
2804 getLLVMStyleWithColumns(20));
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002805}
2806
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002807TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002808 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002809}
2810
Manuel Klimek1058d982013-01-06 20:07:31 +00002811TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2812 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2813 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2814 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2815 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2816}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002817
Daniel Jaspere2408e32015-05-06 11:16:43 +00002818TEST_F(FormatTest, EscapedNewlines) {
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002819 FormatStyle Narrow = getLLVMStyleWithColumns(11);
2820 EXPECT_EQ("#define A \\\n int i; \\\n int j;",
2821 format("#define A \\\nint i;\\\n int j;", Narrow));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002822 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002823 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002824 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002825 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002826
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002827 FormatStyle AlignLeft = getLLVMStyle();
2828 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
2829 EXPECT_EQ("#define MACRO(x) \\\n"
2830 "private: \\\n"
2831 " int x(int a);\n",
2832 format("#define MACRO(x) \\\n"
2833 "private: \\\n"
2834 " int x(int a);\n",
2835 AlignLeft));
2836
2837 // CRLF line endings
2838 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;",
2839 format("#define A \\\r\nint i;\\\r\n int j;", Narrow));
2840 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
2841 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
2842 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */"));
2843 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
2844 EXPECT_EQ("#define MACRO(x) \\\r\n"
2845 "private: \\\r\n"
2846 " int x(int a);\r\n",
2847 format("#define MACRO(x) \\\r\n"
2848 "private: \\\r\n"
2849 " int x(int a);\r\n",
2850 AlignLeft));
2851
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002852 FormatStyle DontAlign = getLLVMStyle();
2853 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
2854 DontAlign.MaxEmptyLinesToKeep = 3;
2855 // FIXME: can't use verifyFormat here because the newline before
2856 // "public:" is not inserted the first time it's reformatted
2857 EXPECT_EQ("#define A \\\n"
2858 " class Foo { \\\n"
2859 " void bar(); \\\n"
2860 "\\\n"
2861 "\\\n"
2862 "\\\n"
2863 " public: \\\n"
2864 " void baz(); \\\n"
2865 " };",
2866 format("#define A \\\n"
2867 " class Foo { \\\n"
2868 " void bar(); \\\n"
2869 "\\\n"
2870 "\\\n"
2871 "\\\n"
2872 " public: \\\n"
2873 " void baz(); \\\n"
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002874 " };",
2875 DontAlign));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002876}
2877
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002878TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2879 verifyFormat("#define A \\\n"
2880 " int v( \\\n"
2881 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002882 " int i;",
2883 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002884}
2885
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002886TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002887 EXPECT_EQ(
2888 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2889 " \\\n"
2890 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2891 "\n"
2892 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2893 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2894 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2895 "\\\n"
2896 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2897 " \n"
2898 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2899 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002900}
2901
Manuel Klimek52b15152013-01-09 15:25:02 +00002902TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2903 EXPECT_EQ("int\n"
2904 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002905 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002906 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002907 verifyFormat("functionCallTo(\n"
2908 " someOtherFunction(\n"
2909 " withSomeParameters, whichInSequence,\n"
2910 " areLongerThanALine(andAnotherCall,\n"
2911 "#define A B\n"
2912 " withMoreParamters,\n"
2913 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002914 " andMoreParameters),\n"
2915 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002916 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002917 verifyFormat("Foo::Foo()\n"
2918 "#ifdef BAR\n"
2919 " : baz(0)\n"
2920 "#endif\n"
2921 "{\n"
2922 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002923 verifyFormat("void f() {\n"
2924 " if (true)\n"
2925 "#ifdef A\n"
2926 " f(42);\n"
2927 " x();\n"
2928 "#else\n"
2929 " g();\n"
2930 " x();\n"
2931 "#endif\n"
2932 "}");
2933 verifyFormat("void f(param1, param2,\n"
2934 " param3,\n"
2935 "#ifdef A\n"
2936 " param4(param5,\n"
2937 "#ifdef A1\n"
2938 " param6,\n"
2939 "#ifdef A2\n"
2940 " param7),\n"
2941 "#else\n"
2942 " param8),\n"
2943 " param9,\n"
2944 "#endif\n"
2945 " param10,\n"
2946 "#endif\n"
2947 " param11)\n"
2948 "#else\n"
2949 " param12)\n"
2950 "#endif\n"
2951 "{\n"
2952 " x();\n"
2953 "}",
2954 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002955 verifyFormat("#if 1\n"
2956 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002957 verifyFormat("#if 1\n"
2958 "#endif\n"
2959 "#if 1\n"
2960 "#else\n"
2961 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002962 verifyFormat("DEBUG({\n"
2963 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2964 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2965 "});\n"
2966 "#if a\n"
2967 "#else\n"
2968 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002969
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002970 verifyIncompleteFormat("void f(\n"
2971 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00002972 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002973 "#else\n"
2974 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002975}
2976
Manuel Klimek14bd9172014-01-29 08:49:02 +00002977TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2978 verifyFormat("#endif\n"
2979 "#if B");
2980}
2981
Manuel Klimek88033d72013-10-21 08:11:15 +00002982TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2983 FormatStyle SingleLine = getLLVMStyle();
2984 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002985 verifyFormat("#if 0\n"
2986 "#elif 1\n"
2987 "#endif\n"
2988 "void foo() {\n"
2989 " if (test) foo2();\n"
2990 "}",
2991 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002992}
2993
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002994TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002995 verifyFormat("functionCall({ int i; });");
2996 verifyFormat("functionCall({\n"
2997 " int i;\n"
2998 " int j;\n"
2999 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003000 verifyFormat("functionCall(\n"
3001 " {\n"
3002 " int i;\n"
3003 " int j;\n"
3004 " },\n"
3005 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003006 verifyFormat("functionA(functionB({\n"
3007 " int i;\n"
3008 " int j;\n"
3009 " }),\n"
3010 " aaaa, bbbb, cccc);");
3011 verifyFormat("functionCall(\n"
3012 " {\n"
3013 " int i;\n"
3014 " int j;\n"
3015 " },\n"
3016 " aaaa, bbbb, // comment\n"
3017 " cccc);");
3018 verifyFormat("functionA(functionB({\n"
3019 " int i;\n"
3020 " int j;\n"
3021 " }),\n"
3022 " aaaa, bbbb, // comment\n"
3023 " cccc);");
3024 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3025 verifyFormat("functionCall(aaaa, bbbb, {\n"
3026 " int i;\n"
3027 " int j;\n"
3028 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003029 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003030 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003031 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003032 " int i; // break\n"
3033 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003034 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3035 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003036 verifyFormat("DEBUG({\n"
3037 " if (a)\n"
3038 " f();\n"
3039 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003040}
3041
3042TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003043 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003044 "int i;",
3045 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003046}
3047
3048TEST_F(FormatTest, LayoutNestedBlocks) {
3049 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3050 " struct s {\n"
3051 " int i;\n"
3052 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003053 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003054 " for (int i = 0; i < 10; ++i)\n"
3055 " return;\n"
3056 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003057 verifyFormat("call(parameter, {\n"
3058 " something();\n"
3059 " // Comment using all columns.\n"
3060 " somethingelse();\n"
3061 "});",
3062 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003063 verifyFormat("DEBUG( //\n"
3064 " { f(); }, a);");
3065 verifyFormat("DEBUG( //\n"
3066 " {\n"
3067 " f(); //\n"
3068 " },\n"
3069 " a);");
3070
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003071 EXPECT_EQ("call(parameter, {\n"
3072 " something();\n"
3073 " // Comment too\n"
3074 " // looooooooooong.\n"
3075 " somethingElse();\n"
3076 "});",
3077 format("call(parameter, {\n"
3078 " something();\n"
3079 " // Comment too looooooooooong.\n"
3080 " somethingElse();\n"
3081 "});",
3082 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003083 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003084 EXPECT_EQ("DEBUG({ // comment\n"
3085 " int i;\n"
3086 "});",
3087 format("DEBUG({ // comment\n"
3088 "int i;\n"
3089 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003090 EXPECT_EQ("DEBUG({\n"
3091 " int i;\n"
3092 "\n"
3093 " // comment\n"
3094 " int j;\n"
3095 "});",
3096 format("DEBUG({\n"
3097 " int i;\n"
3098 "\n"
3099 " // comment\n"
3100 " int j;\n"
3101 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003102
3103 verifyFormat("DEBUG({\n"
3104 " if (a)\n"
3105 " return;\n"
3106 "});");
3107 verifyGoogleFormat("DEBUG({\n"
3108 " if (a) return;\n"
3109 "});");
3110 FormatStyle Style = getGoogleStyle();
3111 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003112 verifyFormat("Debug(aaaaa,\n"
3113 " {\n"
3114 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3115 " },\n"
3116 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003117 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003118
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003119 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3120
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003121 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003122}
3123
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003124TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3125 EXPECT_EQ("#define MACRO() \\\n"
3126 " Debug(aaa, /* force line break */ \\\n"
3127 " { \\\n"
3128 " int i; \\\n"
3129 " int j; \\\n"
3130 " })",
3131 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3132 " { int i; int j; })",
3133 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003134
3135 EXPECT_EQ("#define A \\\n"
3136 " [] { \\\n"
3137 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3138 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3139 " }",
3140 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3141 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3142 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003143}
3144
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003145TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3146 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003147 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003148 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003149}
3150
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003151TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3152 FormatStyle Style = getLLVMStyle();
3153 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3154 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3155 verifyFormat("FOO_BEGIN\n"
3156 " FOO_ENTRY\n"
3157 "FOO_END", Style);
3158 verifyFormat("FOO_BEGIN\n"
3159 " NESTED_FOO_BEGIN\n"
3160 " NESTED_FOO_ENTRY\n"
3161 " NESTED_FOO_END\n"
3162 "FOO_END", Style);
3163 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3164 " int x;\n"
3165 " x = 1;\n"
3166 "FOO_END(Baz)", Style);
3167}
3168
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003169//===----------------------------------------------------------------------===//
3170// Line break tests.
3171//===----------------------------------------------------------------------===//
3172
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003173TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003174 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003175 "void f() {\n"
3176 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3177 " parameter, parameter, parameter)),\n"
3178 " SecondLongCall(parameter));\n"
3179 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003180 verifyFormat(
3181 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3182 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3183 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3184 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3185 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003186 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3187 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3188 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3189 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003190 verifyFormat(
3191 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3192 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3193 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3194 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003195 verifyFormat("int a = bbbb && ccc &&\n"
3196 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003197 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003198 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003199}
3200
Daniel Jasperd69fc772013-05-08 14:12:04 +00003201TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3202 verifyFormat(
3203 "bool aaaaaaa =\n"
3204 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3205 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003206 verifyFormat(
3207 "bool aaaaaaa =\n"
3208 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3209 " bbbbbbbb();");
3210
Daniel Jasperd69fc772013-05-08 14:12:04 +00003211 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3212 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3213 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003214 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3215 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3216 " ccccccccc == ddddddddddd;");
3217 verifyFormat(
3218 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3219 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3220 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003221
3222 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3223 " aaaaaa) &&\n"
3224 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003225 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3226 " aaaaaa) >>\n"
3227 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003228 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003229 " SourceMgr.getSpellingColumnNumber(\n"
3230 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3231 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003232
Daniel Jasper68d888c2013-06-03 08:42:05 +00003233 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3234 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3235 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00003236 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3237 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3238 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003239 verifyFormat("b = a &&\n"
3240 " // Comment\n"
3241 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003242
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003243 // If the LHS of a comparison is not a binary expression itself, the
3244 // additional linebreak confuses many people.
3245 verifyFormat(
3246 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3247 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3248 "}");
3249 verifyFormat(
3250 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3251 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3252 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003253 verifyFormat(
3254 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3255 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3256 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003257 verifyFormat(
3258 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3259 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3260 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003261 // Even explicit parentheses stress the precedence enough to make the
3262 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003263 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3264 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3265 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003266 // This cases is borderline, but with the indentation it is still readable.
3267 verifyFormat(
3268 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3269 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3270 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3271 "}",
3272 getLLVMStyleWithColumns(75));
3273
3274 // If the LHS is a binary expression, we should still use the additional break
3275 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003276 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3277 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3278 " 5) {\n"
3279 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003280 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3281 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3282 " 5) {\n"
3283 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003284
Daniel Jasper571f1af2013-05-14 20:39:56 +00003285 FormatStyle OnePerLine = getLLVMStyle();
3286 OnePerLine.BinPackParameters = false;
3287 verifyFormat(
3288 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3289 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3290 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3291 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003292
3293 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3294 " .aaa(aaaaaaaaaaaaa) *\n"
3295 " aaaaaaa +\n"
3296 " aaaaaaa;",
3297 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003298}
3299
Daniel Jasper6bee6822013-04-08 20:33:42 +00003300TEST_F(FormatTest, ExpressionIndentation) {
3301 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3302 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3303 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3304 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3305 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3306 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3307 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3308 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3309 " ccccccccccccccccccccccccccccccccccccccccc;");
3310 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3311 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3312 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3313 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3314 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3315 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3316 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3317 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3318 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3319 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3320 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3321 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003322 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003323 "} else if (aaaaa && bbbbb > // break\n"
3324 " ccccc) {\n"
3325 "}");
3326 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003327 "} else if (aaaaa &&\n"
3328 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003329 " ccccc &&\n"
3330 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003331 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003332
3333 // Presence of a trailing comment used to change indentation of b.
3334 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3335 " b;\n"
3336 "return aaaaaaaaaaaaaaaaaaa +\n"
3337 " b; //",
3338 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003339}
3340
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003341TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3342 // Not sure what the best system is here. Like this, the LHS can be found
3343 // immediately above an operator (everything with the same or a higher
3344 // indent). The RHS is aligned right of the operator and so compasses
3345 // everything until something with the same indent as the operator is found.
3346 // FIXME: Is this a good system?
3347 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003348 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003349 verifyFormat(
3350 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003351 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3352 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3353 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3354 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3355 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003356 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003357 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3358 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003359 Style);
3360 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003361 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3362 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003363 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3364 Style);
3365 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003366 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3367 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003368 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3369 Style);
3370 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3371 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003372 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3373 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003374 Style);
3375 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003376 "} else if (aaaaa\n"
3377 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003378 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003379 "}",
3380 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003381 verifyFormat("return (a)\n"
3382 " // comment\n"
3383 " + b;",
3384 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003385 verifyFormat(
3386 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3387 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3388 " + cc;",
3389 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003390
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003391 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3392 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3393 Style);
3394
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003395 // Forced by comments.
3396 verifyFormat(
3397 "unsigned ContentSize =\n"
3398 " sizeof(int16_t) // DWARF ARange version number\n"
3399 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3400 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3401 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003402
3403 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3404 " == boost::fusion::at_c<1>(iiii).second;",
3405 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003406
3407 Style.ColumnLimit = 60;
3408 verifyFormat("zzzzzzzzzz\n"
3409 " = bbbbbbbbbbbbbbbbb\n"
3410 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3411 Style);
Jonas Toth4636deb2018-08-24 17:14:31 +00003412
3413 Style.ColumnLimit = 80;
3414 Style.IndentWidth = 4;
3415 Style.TabWidth = 4;
3416 Style.UseTab = FormatStyle::UT_Always;
3417 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3418 Style.AlignOperands = false;
3419 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n"
3420 "\t&& (someOtherLongishConditionPart1\n"
3421 "\t\t|| someOtherEvenLongerNestedConditionPart2);",
3422 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && (someOtherLongishConditionPart1 || someOtherEvenLongerNestedConditionPart2);",
3423 Style));
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003424}
3425
Daniel Jasperb1270392017-02-01 23:27:37 +00003426TEST_F(FormatTest, EnforcedOperatorWraps) {
3427 // Here we'd like to wrap after the || operators, but a comment is forcing an
3428 // earlier wrap.
3429 verifyFormat("bool x = aaaaa //\n"
3430 " || bbbbb\n"
3431 " //\n"
3432 " || cccc;");
3433}
3434
Daniel Jasper3219e432014-12-02 13:24:51 +00003435TEST_F(FormatTest, NoOperandAlignment) {
3436 FormatStyle Style = getLLVMStyle();
3437 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00003438 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3439 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3440 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3441 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003442 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003443 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3444 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3445 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3446 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3447 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3448 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3449 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3450 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3451 " > ccccccccccccccccccccccccccccccccccccccccc;",
3452 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003453
3454 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3455 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3456 " + cc;",
3457 Style);
3458 verifyFormat("int a = aa\n"
3459 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003460 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00003461 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003462
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003463 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003464 verifyFormat("return (a > b\n"
3465 " // comment1\n"
3466 " // comment2\n"
3467 " || c);",
3468 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003469}
3470
Daniel Jasperac043c92014-09-15 11:11:00 +00003471TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3472 FormatStyle Style = getLLVMStyle();
3473 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3474 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3475 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003476 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3477 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003478}
3479
Daniel Jasper988e7e42017-05-08 15:07:52 +00003480TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3481 FormatStyle Style = getLLVMStyle();
3482 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3483 Style.BinPackArguments = false;
3484 Style.ColumnLimit = 40;
3485 verifyFormat("void test() {\n"
3486 " someFunction(\n"
3487 " this + argument + is + quite\n"
3488 " + long + so + it + gets + wrapped\n"
3489 " + but + remains + bin - packed);\n"
3490 "}",
3491 Style);
3492 verifyFormat("void test() {\n"
3493 " someFunction(arg1,\n"
3494 " this + argument + is\n"
3495 " + quite + long + so\n"
3496 " + it + gets + wrapped\n"
3497 " + but + remains + bin\n"
3498 " - packed,\n"
3499 " arg3);\n"
3500 "}",
3501 Style);
3502 verifyFormat("void test() {\n"
3503 " someFunction(\n"
3504 " arg1,\n"
3505 " this + argument + has\n"
3506 " + anotherFunc(nested,\n"
3507 " calls + whose\n"
3508 " + arguments\n"
3509 " + are + also\n"
3510 " + wrapped,\n"
3511 " in + addition)\n"
3512 " + to + being + bin - packed,\n"
3513 " arg3);\n"
3514 "}",
3515 Style);
3516
3517 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3518 verifyFormat("void test() {\n"
3519 " someFunction(\n"
3520 " arg1,\n"
3521 " this + argument + has +\n"
3522 " anotherFunc(nested,\n"
3523 " calls + whose +\n"
3524 " arguments +\n"
3525 " are + also +\n"
3526 " wrapped,\n"
3527 " in + addition) +\n"
3528 " to + being + bin - packed,\n"
3529 " arg3);\n"
3530 "}",
3531 Style);
3532}
3533
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003534TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003535 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003536 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3537 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003538 verifyFormat("Constructor()\n"
3539 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003540 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003541 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003542 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003543 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003544
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003545 verifyFormat("template <typename T>\n"
3546 "Constructor() : Initializer(FitsOnTheLine) {}",
3547 getLLVMStyleWithColumns(45));
3548
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003549 verifyFormat(
3550 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003551 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003552
3553 verifyFormat(
3554 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003555 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003556 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003557 verifyFormat(
3558 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003559 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003560 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003561 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3562 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3563 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003564
3565 verifyFormat("Constructor()\n"
3566 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3567 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3568 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003569 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003570
Daniel Jasper65585ed2013-01-28 13:31:35 +00003571 verifyFormat("Constructor()\n"
3572 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003573 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003574
Daniel Jasper62e68172013-02-25 15:59:54 +00003575 verifyFormat("Constructor(int Parameter = 0)\n"
3576 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3577 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003578 verifyFormat("Constructor()\n"
3579 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3580 "}",
3581 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003582 verifyFormat("Constructor()\n"
3583 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3584 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003585
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003586 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003587 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003588 verifyFormat("Constructor()\n"
3589 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3590 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3591 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003592
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003593 FormatStyle OnePerLine = getLLVMStyle();
3594 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003595 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003596 verifyFormat("SomeClass::Constructor()\n"
3597 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3598 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003599 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003600 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003601 verifyFormat("SomeClass::Constructor()\n"
3602 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3603 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003604 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003605 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003606 verifyFormat("MyClass::MyClass(int var)\n"
3607 " : some_var_(var), // 4 space indent\n"
3608 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003609 "}",
3610 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003611 verifyFormat("Constructor()\n"
3612 " : aaaaa(aaaaaa),\n"
3613 " aaaaa(aaaaaa),\n"
3614 " aaaaa(aaaaaa),\n"
3615 " aaaaa(aaaaaa),\n"
3616 " aaaaa(aaaaaa) {}",
3617 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003618 verifyFormat("Constructor()\n"
3619 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3620 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3621 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003622 OnePerLine.BinPackParameters = false;
3623 verifyFormat(
3624 "Constructor()\n"
3625 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3626 " aaaaaaaaaaa().aaa(),\n"
3627 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3628 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003629 OnePerLine.ColumnLimit = 60;
3630 verifyFormat("Constructor()\n"
3631 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3632 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3633 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003634
3635 EXPECT_EQ("Constructor()\n"
3636 " : // Comment forcing unwanted break.\n"
3637 " aaaa(aaaa) {}",
3638 format("Constructor() :\n"
3639 " // Comment forcing unwanted break.\n"
3640 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003641}
3642
Francois Ferranda6b6d512017-05-24 11:36:58 +00003643TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3644 FormatStyle Style = getLLVMStyle();
3645 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3646
3647 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3648 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3649 getStyleWithColumns(Style, 45));
3650 verifyFormat("Constructor() :\n"
3651 " Initializer(FitsOnTheLine) {}",
3652 getStyleWithColumns(Style, 44));
3653 verifyFormat("Constructor() :\n"
3654 " Initializer(FitsOnTheLine) {}",
3655 getStyleWithColumns(Style, 43));
3656
3657 verifyFormat("template <typename T>\n"
3658 "Constructor() : Initializer(FitsOnTheLine) {}",
3659 getStyleWithColumns(Style, 50));
3660
3661 verifyFormat(
3662 "SomeClass::Constructor() :\n"
3663 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3664 Style);
3665
3666 verifyFormat(
3667 "SomeClass::Constructor() :\n"
3668 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3669 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3670 Style);
3671 verifyFormat(
3672 "SomeClass::Constructor() :\n"
3673 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3674 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3675 Style);
3676 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3677 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3678 " aaaaaaaaaa(aaaaaa) {}",
3679 Style);
3680
3681 verifyFormat("Constructor() :\n"
3682 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3683 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3684 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3685 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3686 Style);
3687
3688 verifyFormat("Constructor() :\n"
3689 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3690 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3691 Style);
3692
3693 verifyFormat("Constructor(int Parameter = 0) :\n"
3694 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3695 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3696 Style);
3697 verifyFormat("Constructor() :\n"
3698 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3699 "}",
3700 getStyleWithColumns(Style, 60));
3701 verifyFormat("Constructor() :\n"
3702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3703 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3704 Style);
3705
3706 // Here a line could be saved by splitting the second initializer onto two
3707 // lines, but that is not desirable.
3708 verifyFormat("Constructor() :\n"
3709 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3710 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3711 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3712 Style);
3713
3714 FormatStyle OnePerLine = Style;
3715 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3716 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3717 verifyFormat("SomeClass::Constructor() :\n"
3718 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3719 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3720 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3721 OnePerLine);
3722 verifyFormat("SomeClass::Constructor() :\n"
3723 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3724 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3725 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3726 OnePerLine);
3727 verifyFormat("MyClass::MyClass(int var) :\n"
3728 " some_var_(var), // 4 space indent\n"
3729 " some_other_var_(var + 1) { // lined up\n"
3730 "}",
3731 OnePerLine);
3732 verifyFormat("Constructor() :\n"
3733 " aaaaa(aaaaaa),\n"
3734 " aaaaa(aaaaaa),\n"
3735 " aaaaa(aaaaaa),\n"
3736 " aaaaa(aaaaaa),\n"
3737 " aaaaa(aaaaaa) {}",
3738 OnePerLine);
3739 verifyFormat("Constructor() :\n"
3740 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3741 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3742 OnePerLine);
3743 OnePerLine.BinPackParameters = false;
3744 verifyFormat(
3745 "Constructor() :\n"
3746 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3747 " aaaaaaaaaaa().aaa(),\n"
3748 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3749 OnePerLine);
3750 OnePerLine.ColumnLimit = 60;
3751 verifyFormat("Constructor() :\n"
3752 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3753 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3754 OnePerLine);
3755
3756 EXPECT_EQ("Constructor() :\n"
3757 " // Comment forcing unwanted break.\n"
3758 " aaaa(aaaa) {}",
3759 format("Constructor() :\n"
3760 " // Comment forcing unwanted break.\n"
3761 " aaaa(aaaa) {}",
3762 Style));
3763
3764 Style.ColumnLimit = 0;
3765 verifyFormat("SomeClass::Constructor() :\n"
3766 " a(a) {}",
3767 Style);
3768 verifyFormat("SomeClass::Constructor() noexcept :\n"
3769 " a(a) {}",
3770 Style);
3771 verifyFormat("SomeClass::Constructor() :\n"
3772 " a(a), b(b), c(c) {}",
3773 Style);
3774 verifyFormat("SomeClass::Constructor() :\n"
3775 " a(a) {\n"
3776 " foo();\n"
3777 " bar();\n"
3778 "}",
3779 Style);
3780
3781 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3782 verifyFormat("SomeClass::Constructor() :\n"
3783 " a(a), b(b), c(c) {\n"
3784 "}",
3785 Style);
3786 verifyFormat("SomeClass::Constructor() :\n"
3787 " a(a) {\n"
3788 "}",
3789 Style);
3790
3791 Style.ColumnLimit = 80;
3792 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3793 Style.ConstructorInitializerIndentWidth = 2;
3794 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3795 Style);
3796 verifyFormat("SomeClass::Constructor() :\n"
3797 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3798 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3799 Style);
Francois Ferrand6bb103f2018-06-11 14:41:26 +00003800
3801 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as well
3802 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
3803 verifyFormat("class SomeClass\n"
3804 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3805 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
3806 Style);
3807 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
3808 verifyFormat("class SomeClass\n"
3809 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3810 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
3811 Style);
3812 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon;
3813 verifyFormat("class SomeClass :\n"
3814 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3815 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
3816 Style);
Francois Ferranda6b6d512017-05-24 11:36:58 +00003817}
3818
David Blaikieea95dd72017-08-31 18:49:34 +00003819#ifndef EXPENSIVE_CHECKS
3820// Expensive checks enables libstdc++ checking which includes validating the
3821// state of ranges used in std::priority_queue - this blows out the
3822// runtime/scalability of the function and makes this test unacceptably slow.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003823TEST_F(FormatTest, MemoizationTests) {
3824 // This breaks if the memoization lookup does not take \c Indent and
3825 // \c LastSpace into account.
3826 verifyFormat(
3827 "extern CFRunLoopTimerRef\n"
3828 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3829 " CFTimeInterval interval, CFOptionFlags flags,\n"
3830 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003831 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003832
3833 // Deep nesting somewhat works around our memoization.
3834 verifyFormat(
3835 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3836 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3837 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3838 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3839 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3840 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003841 verifyFormat(
3842 "aaaaa(\n"
3843 " aaaaa,\n"
3844 " aaaaa(\n"
3845 " aaaaa,\n"
3846 " aaaaa(\n"
3847 " aaaaa,\n"
3848 " aaaaa(\n"
3849 " aaaaa,\n"
3850 " aaaaa(\n"
3851 " aaaaa,\n"
3852 " aaaaa(\n"
3853 " aaaaa,\n"
3854 " aaaaa(\n"
3855 " aaaaa,\n"
3856 " aaaaa(\n"
3857 " aaaaa,\n"
3858 " aaaaa(\n"
3859 " aaaaa,\n"
3860 " aaaaa(\n"
3861 " aaaaa,\n"
3862 " aaaaa(\n"
3863 " aaaaa,\n"
3864 " aaaaa(\n"
3865 " aaaaa,\n"
3866 " aaaaa))))))))))));",
3867 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003868 verifyFormat(
3869 "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"
3870 " a),\n"
3871 " a),\n"
3872 " a),\n"
3873 " a),\n"
3874 " a),\n"
3875 " a),\n"
3876 " a),\n"
3877 " a),\n"
3878 " a),\n"
3879 " a),\n"
3880 " a),\n"
3881 " a),\n"
3882 " a),\n"
3883 " a),\n"
3884 " a),\n"
3885 " a),\n"
3886 " a)",
3887 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003888
3889 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003890 FormatStyle OnePerLine = getLLVMStyle();
3891 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003892 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003893 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003894 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003895 for (unsigned i = 0, e = 80; i != e; ++i) {
3896 input += " a,\n";
3897 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003898 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003899 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003900}
David Blaikieea95dd72017-08-31 18:49:34 +00003901#endif
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003902
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003903TEST_F(FormatTest, BreaksAsHighAsPossible) {
3904 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003905 "void f() {\n"
3906 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3907 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3908 " f();\n"
3909 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003910 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003911 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003912}
3913
Daniel Jasper6728fc12013-04-11 14:29:13 +00003914TEST_F(FormatTest, BreaksFunctionDeclarations) {
3915 // Principially, we break function declarations in a certain order:
3916 // 1) break amongst arguments.
3917 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3918 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003919 verifyFormat("template <class TemplateIt>\n"
3920 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3921 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003922
3923 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003924 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003925 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003926 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003927 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003928
3929 // 3) break after (.
3930 verifyFormat(
3931 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003932 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3933 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003934
3935 // 4) break before after nested name specifiers.
3936 verifyFormat(
3937 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003938 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3939 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003940 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003941
3942 // However, there are exceptions, if a sufficient amount of lines can be
3943 // saved.
3944 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3945 // more adjusting.
3946 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3947 " Cccccccccccccc cccccccccc,\n"
3948 " Cccccccccccccc cccccccccc,\n"
3949 " Cccccccccccccc cccccccccc,\n"
3950 " Cccccccccccccc cccccccccc);");
3951 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003952 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003953 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3954 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3955 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003956 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003957 verifyFormat(
3958 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3959 " Cccccccccccccc cccccccccc,\n"
3960 " Cccccccccccccc cccccccccc,\n"
3961 " Cccccccccccccc cccccccccc,\n"
3962 " Cccccccccccccc cccccccccc,\n"
3963 " Cccccccccccccc cccccccccc,\n"
3964 " Cccccccccccccc cccccccccc);");
3965 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3966 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3967 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3968 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3969 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003970
3971 // Break after multi-line parameters.
3972 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3973 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3974 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3975 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003976 verifyFormat("void SomeLoooooooooooongFunction(\n"
3977 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3978 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3979 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003980
3981 // Treat overloaded operators like other functions.
3982 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3983 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003984 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3985 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003986 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3987 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3988 verifyGoogleFormat(
3989 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3990 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003991 verifyGoogleFormat(
3992 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3993 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003994 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3995 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3996 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3997 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003998 verifyGoogleFormat(
3999 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4000 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4001 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00004002 verifyGoogleFormat(
4003 "template <typename T>\n"
4004 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4005 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4006 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00004007
4008 FormatStyle Style = getLLVMStyle();
4009 Style.PointerAlignment = FormatStyle::PAS_Left;
4010 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4011 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4012 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004013 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4014 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4015 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00004016}
4017
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004018TEST_F(FormatTest, TrailingReturnType) {
4019 verifyFormat("auto foo() -> int;\n");
4020 verifyFormat("struct S {\n"
4021 " auto bar() const -> int;\n"
4022 "};");
4023 verifyFormat("template <size_t Order, typename T>\n"
4024 "auto load_img(const std::string &filename)\n"
4025 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00004026 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4027 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00004028 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00004029 verifyFormat("template <typename T>\n"
4030 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4031 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00004032
4033 // Not trailing return types.
4034 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004035}
4036
Daniel Jasper5be31f72013-05-21 09:16:31 +00004037TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004038 // Avoid breaking before trailing 'const' or other trailing annotations, if
4039 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00004040 FormatStyle Style = getGoogleStyle();
4041 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00004042 verifyFormat("void someLongFunction(\n"
4043 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00004044 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00004045 verifyFormat("LoooooongReturnType\n"
4046 "someLoooooooongFunction() const {}",
4047 getLLVMStyleWithColumns(47));
4048 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4049 " const {}",
4050 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004051 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4052 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4053 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4054 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4055 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4056 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00004057 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4058 " aaaaaaaaaaa aaaaa) const override;");
4059 verifyGoogleFormat(
4060 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4061 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004062
Daniel Jasper5550de62014-02-17 07:57:46 +00004063 // Even if the first parameter has to be wrapped.
4064 verifyFormat("void someLongFunction(\n"
4065 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004066 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00004067 verifyFormat("void someLongFunction(\n"
4068 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004069 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00004070 verifyFormat("void someLongFunction(\n"
4071 " int someLongParameter) override {}",
4072 Style);
4073 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004074 " int someLongParameter) OVERRIDE {}",
4075 Style);
4076 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004077 " int someLongParameter) final {}",
4078 Style);
4079 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004080 " int someLongParameter) FINAL {}",
4081 Style);
4082 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004083 " int parameter) const override {}",
4084 Style);
4085
Daniel Jaspere3f907f2014-06-02 09:52:08 +00004086 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4087 verifyFormat("void someLongFunction(\n"
4088 " int someLongParameter) const\n"
4089 "{\n"
4090 "}",
4091 Style);
4092
Daniel Jasper5550de62014-02-17 07:57:46 +00004093 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004094 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4095 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4096 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00004097
4098 // Breaking before function-like trailing annotations is fine to keep them
4099 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004100 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4101 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4102 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4103 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4104 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4105 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004106 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4107 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004108 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004109
4110 verifyFormat(
4111 "void aaaaaaaaaaaaaaaaaa()\n"
4112 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4113 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4114 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4115 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004116 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004117 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004118 " GUARDED_BY(aaaaaaaaaaaa);");
4119 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004120 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004121 " GUARDED_BY(aaaaaaaaaaaa);");
4122 verifyGoogleFormat(
4123 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4124 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004125 verifyGoogleFormat(
4126 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4127 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004128}
4129
Daniel Jasperf090f032015-05-18 09:47:22 +00004130TEST_F(FormatTest, FunctionAnnotations) {
4131 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004132 "int OldFunction(const string &parameter) {}");
4133 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004134 "string OldFunction(const string &parameter) {}");
4135 verifyFormat("template <typename T>\n"
4136 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4137 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004138
4139 // Not function annotations.
4140 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4141 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004142 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4143 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004144 verifyFormat("MACRO(abc).function() // wrap\n"
4145 " << abc;");
4146 verifyFormat("MACRO(abc)->function() // wrap\n"
4147 " << abc;");
4148 verifyFormat("MACRO(abc)::function() // wrap\n"
4149 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004150}
4151
Daniel Jasperf7935112012-12-03 18:12:45 +00004152TEST_F(FormatTest, BreaksDesireably) {
4153 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4154 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004155 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004156 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4157 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4158 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004159
4160 verifyFormat(
4161 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004162 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004163
4164 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4165 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4166 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004167
4168 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004169 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4170 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4171 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004172 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4173 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004174
4175 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4176 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4177
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004178 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004179 "void f() {\n"
4180 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4181 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4182 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004183 verifyFormat(
4184 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4185 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4186 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004187 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4188 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4189 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004190 "aaaaaa(aaa,\n"
4191 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004192 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4193 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004194 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4195 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4196 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004197
Daniel Jasper739b85f2015-06-29 10:42:59 +00004198 // Indent consistently independent of call expression and unary operator.
4199 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4200 " dddddddddddddddddddddddddddddd));");
4201 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4202 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004203 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004204 " dddddddddddddddddddddddddddddd));");
4205
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004206 // This test case breaks on an incorrect memoization, i.e. an optimization not
4207 // taking into account the StopAt value.
4208 verifyFormat(
4209 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004210 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4211 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4212 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004213
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004214 verifyFormat("{\n {\n {\n"
4215 " Annotation.SpaceRequiredBefore =\n"
4216 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4217 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4218 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004219
4220 // Break on an outer level if there was a break on an inner level.
4221 EXPECT_EQ("f(g(h(a, // comment\n"
4222 " b, c),\n"
4223 " d, e),\n"
4224 " x, y);",
4225 format("f(g(h(a, // comment\n"
4226 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004227
4228 // Prefer breaking similar line breaks.
4229 verifyFormat(
4230 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4231 " NSTrackingMouseEnteredAndExited |\n"
4232 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004233}
4234
Daniel Jasper18210d72014-10-09 09:52:05 +00004235TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4236 FormatStyle NoBinPacking = getGoogleStyle();
4237 NoBinPacking.BinPackParameters = false;
4238 NoBinPacking.BinPackArguments = true;
4239 verifyFormat("void f() {\n"
4240 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4241 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4242 "}",
4243 NoBinPacking);
4244 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4245 " int aaaaaaaaaaaaaaaaaaaa,\n"
4246 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4247 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004248
Daniel Jasper00693b082016-01-09 15:56:47 +00004249 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4250 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4251 " vector<int> bbbbbbbbbbbbbbb);",
4252 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004253 // FIXME: This behavior difference is probably not wanted. However, currently
4254 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4255 // template arguments from BreakBeforeParameter being set because of the
4256 // one-per-line formatting.
4257 verifyFormat(
4258 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4259 " aaaaaaaaaa> aaaaaaaaaa);",
4260 NoBinPacking);
4261 verifyFormat(
4262 "void fffffffffff(\n"
4263 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4264 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004265}
4266
Daniel Jasper9278eb92013-01-16 14:59:02 +00004267TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004268 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004269 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004270 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004271 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4272 " aaaaaaaaaaaaaaaaaaaa,\n"
4273 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4274 NoBinPacking);
4275 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4276 " aaaaaaaaaaaaa,\n"
4277 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4278 NoBinPacking);
4279 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004280 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4281 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4282 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4283 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004284 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4285 NoBinPacking);
4286 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4287 " .aaaaaaaaaaaaaaaaaa();",
4288 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004289 verifyFormat("void f() {\n"
4290 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4291 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4292 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004293 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004294
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004295 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004296 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4297 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004298 " aaaaaaaaaaaa);",
4299 NoBinPacking);
4300 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004301 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4302 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004303 " test);",
4304 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004305
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004306 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4307 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004308 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4309 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004310 NoBinPacking);
4311 verifyFormat("a(\"a\"\n"
4312 " \"a\",\n"
4313 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004314
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004315 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004316 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004317 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004318 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004319 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004320 verifyFormat(
4321 "void f() {\n"
4322 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4323 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004324 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004325 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004326 verifyFormat(
4327 "template <class SomeType, class SomeOtherType>\n"
4328 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4329 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004330}
4331
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004332TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4333 FormatStyle Style = getLLVMStyleWithColumns(15);
4334 Style.ExperimentalAutoDetectBinPacking = true;
4335 EXPECT_EQ("aaa(aaaa,\n"
4336 " aaaa,\n"
4337 " aaaa);\n"
4338 "aaa(aaaa,\n"
4339 " aaaa,\n"
4340 " aaaa);",
4341 format("aaa(aaaa,\n" // one-per-line
4342 " aaaa,\n"
4343 " aaaa );\n"
4344 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4345 Style));
4346 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4347 " aaaa);\n"
4348 "aaa(aaaa, aaaa,\n"
4349 " aaaa);",
4350 format("aaa(aaaa, aaaa,\n" // bin-packed
4351 " aaaa );\n"
4352 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4353 Style));
4354}
4355
Daniel Jasper04468962013-01-18 10:56:38 +00004356TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004357 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4358 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4359 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4360 " .StartsWith(\".init\", ORDER_INIT)\n"
4361 " .StartsWith(\".fini\", ORDER_FINI)\n"
4362 " .StartsWith(\".hash\", ORDER_HASH)\n"
4363 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004364
Daniel Jaspereb50c672013-02-15 20:33:06 +00004365 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004366 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004367 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004368 "aaaaaaa->aaaaaaa\n"
4369 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4370 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004371 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004372 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004373 "aaaaaaa->aaaaaaa\n"
4374 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4375 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4376 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004377 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004378 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004379 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004380 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4381 " aaaaaa->aaaaaaaaaaaa()\n"
4382 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004383 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004384 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004385 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004386 "void f() {\n"
4387 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004388 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004389 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004390 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004391 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004392 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004393 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004394 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004395 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004396 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004397 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004398 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004399
4400 verifyFormat(
4401 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4402 verifyFormat("aaaaaaaaaaaaaaa()\n"
4403 " .aaaaaaaaaaaaaaa()\n"
4404 " .aaaaaaaaaaaaaaa()\n"
4405 " .aaaaaaaaaaaaaaa()\n"
4406 " .aaaaaaaaaaaaaaa();");
4407 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4408 " .aaaaaaaaaaaaaaa()\n"
4409 " .aaaaaaaaaaaaaaa()\n"
4410 " .aaaaaaaaaaaaaaa();");
4411 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4412 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4413 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004414 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4415 " ->aaaaaaaaaaaaaae(0)\n"
4416 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004417
Daniel Jasper775954b2015-04-24 10:08:09 +00004418 // Don't linewrap after very short segments.
4419 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4420 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4421 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4422 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4423 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4424 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4425 verifyFormat("aaa()\n"
4426 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4427 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4428 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4429
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004430 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4431 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4432 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4433 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4434 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004435 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004436
Daniel Jaspera41aa532014-09-19 08:01:25 +00004437 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004438 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4439 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004440
4441 // Prefer not to create "hanging" indents.
4442 verifyFormat(
4443 "return !soooooooooooooome_map\n"
4444 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4445 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004446 verifyFormat(
4447 "return aaaaaaaaaaaaaaaa\n"
4448 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4449 " .aaaa(aaaaaaaaaaaaaa);");
4450 // No hanging indent here.
4451 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4452 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4453 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4454 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004455 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4456 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4457 getLLVMStyleWithColumns(60));
4458 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4459 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4460 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4461 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004462 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4463 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4464 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004465}
4466
Daniel Jasperde5c2072012-12-24 00:13:23 +00004467TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4468 verifyFormat(
4469 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004470 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004471 verifyFormat(
4472 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4473 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4474
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004475 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004476 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004477 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4478 " ccccccccccccccccccccccccc) {\n}");
4479
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004480 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004481 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004482 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4483 " ccccccccccccccccccccccccc) {\n}");
4484
Daniel Jasperde5c2072012-12-24 00:13:23 +00004485 verifyFormat(
4486 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004487 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004488 verifyFormat(
4489 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4490 " ccccccccccccccccccccccccc) {\n}");
4491
Daniel Jasper400adc62013-02-08 15:28:42 +00004492 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4493 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4494 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4495 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004496 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4497 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4498 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4499 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4500
Daniel Jasper400adc62013-02-08 15:28:42 +00004501 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4502 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4503 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004504 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4505 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4506 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004507}
4508
Daniel Jasper43b65482013-01-23 12:27:43 +00004509TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004510 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004511 "unsigned Cost =\n"
4512 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4513 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004514 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004515 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4516 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004517
4518 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004519 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4520 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004521 verifyFormat("unsigned OriginalStartColumn =\n"
4522 " SourceMgr.getSpellingColumnNumber(\n"
4523 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4524 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004525}
4526
Francois Ferrand9976efa2017-05-22 08:28:17 +00004527TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4528 FormatStyle Style = getLLVMStyle();
4529 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4530 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4531 Style);
4532
4533 Style.PenaltyBreakAssignment = 20;
4534 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4535 " cccccccccccccccccccccccccc;",
4536 Style);
4537}
4538
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004539TEST_F(FormatTest, AlignsAfterAssignments) {
4540 verifyFormat(
4541 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004542 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004543 verifyFormat(
4544 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004545 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004546 verifyFormat(
4547 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004548 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004549 verifyFormat(
4550 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004551 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004552 verifyFormat(
4553 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4554 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4555 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004556}
4557
4558TEST_F(FormatTest, AlignsAfterReturn) {
4559 verifyFormat(
4560 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4561 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4562 verifyFormat(
4563 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4564 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004565 verifyFormat(
4566 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004567 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004568 verifyFormat(
4569 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004570 " aaaaaaaaaaaaaaaaaaaaaa());");
4571 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4572 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4573 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4574 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4575 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004576 verifyFormat("return\n"
4577 " // true if code is one of a or b.\n"
4578 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004579}
4580
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004581TEST_F(FormatTest, AlignsAfterOpenBracket) {
4582 verifyFormat(
4583 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4584 " aaaaaaaaa aaaaaaa) {}");
4585 verifyFormat(
4586 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4587 " aaaaaaaaaaa aaaaaaaaa);");
4588 verifyFormat(
4589 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4590 " aaaaaaaaaaaaaaaaaaaaa));");
4591 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004592 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004593 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4594 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4595 Style);
4596 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4597 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4598 Style);
4599 verifyFormat("SomeLongVariableName->someFunction(\n"
4600 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4601 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004602 verifyFormat(
4603 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4604 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4605 Style);
4606 verifyFormat(
4607 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4608 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4609 Style);
4610 verifyFormat(
4611 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4612 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4613 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004614
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004615 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4616 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4617 " b));",
4618 Style);
4619
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004620 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4621 Style.BinPackArguments = false;
4622 Style.BinPackParameters = false;
4623 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4624 " aaaaaaaaaaa aaaaaaaa,\n"
4625 " aaaaaaaaa aaaaaaa,\n"
4626 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4627 Style);
4628 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4629 " aaaaaaaaaaa aaaaaaaaa,\n"
4630 " aaaaaaaaaaa aaaaaaaaa,\n"
4631 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4632 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004633 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4634 " aaaaaaaaaaaaaaa,\n"
4635 " aaaaaaaaaaaaaaaaaaaaa,\n"
4636 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004637 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004638 verifyFormat(
4639 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4640 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4641 Style);
4642 verifyFormat(
4643 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4644 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4645 Style);
4646 verifyFormat(
4647 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4648 " aaaaaaaaaaaaaaaaaaaaa(\n"
4649 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4650 " aaaaaaaaaaaaaaaa);",
4651 Style);
4652 verifyFormat(
4653 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4654 " aaaaaaaaaaaaaaaaaaaaa(\n"
4655 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4656 " aaaaaaaaaaaaaaaa);",
4657 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004658}
4659
Daniel Jasper3219e432014-12-02 13:24:51 +00004660TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4661 FormatStyle Style = getLLVMStyleWithColumns(40);
4662 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4663 " bbbbbbbbbbbbbbbbbbbbbb);",
4664 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004665 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004666 Style.AlignOperands = false;
4667 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4668 " bbbbbbbbbbbbbbbbbbbbbb);",
4669 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004670 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004671 Style.AlignOperands = true;
4672 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4673 " bbbbbbbbbbbbbbbbbbbbbb);",
4674 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004675 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004676 Style.AlignOperands = false;
4677 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4678 " bbbbbbbbbbbbbbbbbbbbbb);",
4679 Style);
4680}
4681
Daniel Jasper399d24b2013-01-09 07:06:56 +00004682TEST_F(FormatTest, BreaksConditionalExpressions) {
4683 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004684 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4685 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4686 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4687 verifyFormat(
4688 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004689 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4690 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004691 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004692 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4693 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4694 verifyFormat(
4695 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004696 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4697 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004698 verifyFormat(
4699 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4700 " : aaaaaaaaaaaaa);");
4701 verifyFormat(
4702 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004703 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004704 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4705 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004706 verifyFormat(
4707 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4708 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4709 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004710 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4711 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4712 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4713 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4714 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4715 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4716 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4717 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4718 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4719 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4720 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4721 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004722 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4723 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4724 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4725 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4726 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004727 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4728 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4729 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004730 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4731 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4732 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4733 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004734 verifyFormat(
4735 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4736 " ? aaaaaaaaaaaaaaa\n"
4737 " : aaaaaaaaaaaaaaa;");
4738 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004739 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004740 " ? b\n"
4741 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004742 verifyFormat("return aaaa == bbbb\n"
4743 " // comment\n"
4744 " ? aaaa\n"
4745 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004746 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004747 " format(TheLine.First,\n"
4748 " IndentForLevel[TheLine.Level] >= 0\n"
4749 " ? IndentForLevel[TheLine.Level]\n"
4750 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004751 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004752 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004753 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4754 " ? aaaaaaaaaaaaaaa\n"
4755 " : bbbbbbbbbbbbbbb //\n"
4756 " ? ccccccccccccccc\n"
4757 " : ddddddddddddddd;");
4758 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4759 " ? aaaaaaaaaaaaaaa\n"
4760 " : (bbbbbbbbbbbbbbb //\n"
4761 " ? ccccccccccccccc\n"
4762 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004763 verifyFormat(
4764 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4765 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4766 " aaaaaaaaaaaaaaaaaaaaa +\n"
4767 " aaaaaaaaaaaaaaaaaaaaa\n"
4768 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004769 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004770 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4771 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4772 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004773
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004774 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004775 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004776 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004777 "void f() {\n"
4778 " g(aaa,\n"
4779 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4780 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4781 " ? aaaaaaaaaaaaaaa\n"
4782 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004783 "}",
4784 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004785 verifyFormat(
4786 "void f() {\n"
4787 " g(aaa,\n"
4788 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4789 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4790 " ?: aaaaaaaaaaaaaaa);\n"
4791 "}",
4792 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004793
4794 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4795 " // comment.\n"
4796 " ccccccccccccccccccccccccccccccccccccccc\n"
4797 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4798 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004799
4800 // Assignments in conditional expressions. Apparently not uncommon :-(.
4801 verifyFormat("return a != b\n"
4802 " // comment\n"
4803 " ? a = b\n"
4804 " : a = b;");
4805 verifyFormat("return a != b\n"
4806 " // comment\n"
4807 " ? a = a != b\n"
4808 " // comment\n"
4809 " ? a = b\n"
4810 " : a\n"
4811 " : a;\n");
4812 verifyFormat("return a != b\n"
4813 " // comment\n"
4814 " ? a\n"
4815 " : a = a != b\n"
4816 " // comment\n"
4817 " ? a = b\n"
4818 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004819}
4820
Daniel Jasper165b29e2013-11-08 00:57:11 +00004821TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4822 FormatStyle Style = getLLVMStyle();
4823 Style.BreakBeforeTernaryOperators = false;
4824 Style.ColumnLimit = 70;
4825 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004826 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4827 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4828 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4829 Style);
4830 verifyFormat(
4831 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004832 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4833 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004834 Style);
4835 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004836 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4837 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4838 Style);
4839 verifyFormat(
4840 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004841 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4842 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004843 Style);
4844 verifyFormat(
4845 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4846 " aaaaaaaaaaaaa);",
4847 Style);
4848 verifyFormat(
4849 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4850 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4851 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4852 " aaaaaaaaaaaaa);",
4853 Style);
4854 verifyFormat(
4855 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4856 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4857 " aaaaaaaaaaaaa);",
4858 Style);
4859 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4860 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4861 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4862 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4863 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4864 Style);
4865 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4866 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4867 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4868 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4869 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4870 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4871 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4872 Style);
4873 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4874 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4875 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4876 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4877 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4878 Style);
4879 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4880 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4881 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4882 Style);
4883 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004884 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004885 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4886 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4887 Style);
4888 verifyFormat(
4889 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4890 " aaaaaaaaaaaaaaa :\n"
4891 " aaaaaaaaaaaaaaa;",
4892 Style);
4893 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4894 " aaaaaaaaa ?\n"
4895 " b :\n"
4896 " c);",
4897 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004898 verifyFormat("unsigned Indent =\n"
4899 " format(TheLine.First,\n"
4900 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4901 " IndentForLevel[TheLine.Level] :\n"
4902 " TheLine * 2,\n"
4903 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4904 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004905 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4906 " aaaaaaaaaaaaaaa :\n"
4907 " bbbbbbbbbbbbbbb ? //\n"
4908 " ccccccccccccccc :\n"
4909 " ddddddddddddddd;",
4910 Style);
4911 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4912 " aaaaaaaaaaaaaaa :\n"
4913 " (bbbbbbbbbbbbbbb ? //\n"
4914 " ccccccccccccccc :\n"
4915 " ddddddddddddddd);",
4916 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004917 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4918 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4919 " ccccccccccccccccccccccccccc;",
4920 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004921 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4922 " aaaaa :\n"
4923 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4924 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004925}
4926
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004927TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4928 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4929 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4930 verifyFormat("bool a = true, b = false;");
4931
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004932 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004933 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004934 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004935 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004936 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004937 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004938 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004939 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004940 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4941 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4942 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4943 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4944 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4945 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004946
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004947 FormatStyle Style = getGoogleStyle();
4948 Style.PointerAlignment = FormatStyle::PAS_Left;
4949 Style.DerivePointerAlignment = false;
4950 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4951 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4952 " *b = bbbbbbbbbbbbbbbbbbb;",
4953 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004954 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4955 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4956 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004957 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004958 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004959}
4960
Nico Weber4a5030c2013-01-12 01:28:06 +00004961TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4962 verifyFormat("arr[foo ? bar : baz];");
4963 verifyFormat("f()[foo ? bar : baz];");
4964 verifyFormat("(a + b)[foo ? bar : baz];");
4965 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4966}
4967
Daniel Jasperf7935112012-12-03 18:12:45 +00004968TEST_F(FormatTest, AlignsStringLiterals) {
4969 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4970 " \"short literal\");");
4971 verifyFormat(
4972 "looooooooooooooooooooooooongFunction(\n"
4973 " \"short literal\"\n"
4974 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004975 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4976 " \" string literals\",\n"
4977 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004978 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4979 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004980 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004981 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004982 getLLVMStyleWithColumns(28)));
4983 EXPECT_EQ(
4984 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4985 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4986 " \"aaaaaaaaaaaaaaaa\";",
4987 format("aaaaaa ="
4988 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4989 "aaaaaaaaaaaaaaaaaaaaa\" "
4990 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004991 verifyFormat("a = a + \"a\"\n"
4992 " \"a\"\n"
4993 " \"a\";");
4994 verifyFormat("f(\"a\", \"b\"\n"
4995 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004996
4997 verifyFormat(
4998 "#define LL_FORMAT \"ll\"\n"
4999 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5000 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00005001
5002 verifyFormat("#define A(X) \\\n"
5003 " \"aaaaa\" #X \"bbbbbb\" \\\n"
5004 " \"ccccc\"",
5005 getLLVMStyleWithColumns(23));
5006 verifyFormat("#define A \"def\"\n"
5007 "f(\"abc\" A \"ghi\"\n"
5008 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005009
5010 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005011 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005012 verifyFormat("#define A(X) \\\n"
5013 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5014 " L\"ccccc\"",
5015 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00005016
5017 verifyFormat("f(@\"a\"\n"
5018 " @\"b\");");
5019 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00005020 " @\"b\"\n"
5021 " @\"c\";");
5022 verifyFormat("NSString s = @\"a\"\n"
5023 " \"b\"\n"
5024 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00005025}
5026
Zachary Turner448592e2015-12-18 22:20:15 +00005027TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005028 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005029 // No declarations or definitions should be moved to own line.
5030 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5031 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005032 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005033 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005034 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005035 "int f() { return 1; }\n"
5036 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005037 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00005038
5039 // All declarations and definitions should have the return type moved to its
5040 // own
5041 // line.
5042 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5043 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005044 " int\n"
5045 " f() {\n"
5046 " return 1;\n"
5047 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005048 " int\n"
5049 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005050 "};\n"
5051 "int\n"
5052 "f() {\n"
5053 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005054 "}\n"
5055 "int\n"
5056 "g();\n",
5057 Style);
5058
5059 // Top-level definitions, and no kinds of declarations should have the
5060 // return type moved to its own line.
5061 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5062 verifyFormat("class B {\n"
5063 " int f() { return 1; }\n"
5064 " int g();\n"
5065 "};\n"
5066 "int\n"
5067 "f() {\n"
5068 " return 1;\n"
5069 "}\n"
5070 "int g();\n",
5071 Style);
5072
5073 // Top-level definitions and declarations should have the return type moved
5074 // to its own line.
5075 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5076 verifyFormat("class C {\n"
5077 " int f() { return 1; }\n"
5078 " int g();\n"
5079 "};\n"
5080 "int\n"
5081 "f() {\n"
5082 " return 1;\n"
5083 "}\n"
5084 "int\n"
5085 "g();\n",
5086 Style);
5087
5088 // All definitions should have the return type moved to its own line, but no
5089 // kinds of declarations.
5090 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5091 verifyFormat("class D {\n"
5092 " int\n"
5093 " f() {\n"
5094 " return 1;\n"
5095 " }\n"
5096 " int g();\n"
5097 "};\n"
5098 "int\n"
5099 "f() {\n"
5100 " return 1;\n"
5101 "}\n"
5102 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005103 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005104 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005105 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005106 " return \"\";\n"
5107 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005108 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005109 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005110 verifyFormat("template <class T>\n"
5111 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005112 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005113 " return NULL;\n"
5114 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005115 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005116 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005117 verifyFormat("class C {\n"
5118 " int\n"
5119 " operator+() {\n"
5120 " return 1;\n"
5121 " }\n"
5122 " int\n"
5123 " operator()() {\n"
5124 " return 1;\n"
5125 " }\n"
5126 "};\n",
5127 Style);
5128 verifyFormat("void\n"
5129 "A::operator()() {}\n"
5130 "void\n"
5131 "A::operator>>() {}\n"
5132 "void\n"
5133 "A::operator+() {}\n",
5134 Style);
5135 verifyFormat("void *operator new(std::size_t s);", // No break here.
5136 Style);
5137 verifyFormat("void *\n"
5138 "operator new(std::size_t s) {}",
5139 Style);
5140 verifyFormat("void *\n"
5141 "operator delete[](void *ptr) {}",
5142 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005143 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005144 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005145 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005146 "{\n"
5147 " return \"\";\n"
5148 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005149 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005150 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005151 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005152 "T *\n" // Problem here: no line break
5153 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005154 "{\n"
5155 " return NULL;\n"
5156 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005157 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005158 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005159}
5160
Alexander Kornienko58611712013-07-04 12:02:44 +00005161TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5162 FormatStyle NoBreak = getLLVMStyle();
5163 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5164 FormatStyle Break = getLLVMStyle();
5165 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005166 verifyFormat("aaaa = \"bbbb\"\n"
5167 " \"cccc\";",
5168 NoBreak);
5169 verifyFormat("aaaa =\n"
5170 " \"bbbb\"\n"
5171 " \"cccc\";",
5172 Break);
5173 verifyFormat("aaaa(\"bbbb\"\n"
5174 " \"cccc\");",
5175 NoBreak);
5176 verifyFormat("aaaa(\n"
5177 " \"bbbb\"\n"
5178 " \"cccc\");",
5179 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005180 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5181 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005182 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005183 verifyFormat("aaaa(qqq,\n"
5184 " \"bbbb\"\n"
5185 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005186 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005187 verifyFormat("aaaa(qqq,\n"
5188 " L\"bbbb\"\n"
5189 " L\"cccc\");",
5190 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005191 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5192 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005193 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005194 verifyFormat("string s = someFunction(\n"
5195 " \"abc\"\n"
5196 " \"abc\");",
5197 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005198
Daniel Jasper3251fff2014-06-10 06:27:23 +00005199 // As we break before unary operators, breaking right after them is bad.
5200 verifyFormat("string foo = abc ? \"x\"\n"
5201 " \"blah blah blah blah blah blah\"\n"
5202 " : \"y\";",
5203 Break);
5204
Daniel Jasperc834c702013-07-17 15:38:19 +00005205 // Don't break if there is no column gain.
5206 verifyFormat("f(\"aaaa\"\n"
5207 " \"bbbb\");",
5208 Break);
5209
5210 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005211 EXPECT_EQ("x = \"a\\\n"
5212 "b\\\n"
5213 "c\";",
5214 format("x = \"a\\\n"
5215 "b\\\n"
5216 "c\";",
5217 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005218 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005219 " \"a\\\n"
5220 "b\\\n"
5221 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005222 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005223 "b\\\n"
5224 "c\";",
5225 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005226
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00005227 EXPECT_EQ("NSString *const kString =\n"
5228 " @\"aaaa\"\n"
5229 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005230 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005231 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005232 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005233
5234 Break.ColumnLimit = 0;
5235 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005236}
5237
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005238TEST_F(FormatTest, AlignsPipes) {
5239 verifyFormat(
5240 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5241 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5242 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5243 verifyFormat(
5244 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5245 " << aaaaaaaaaaaaaaaaaaaa;");
5246 verifyFormat(
5247 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5248 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5249 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005250 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5251 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5252 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005253 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5254 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5255 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5256 verifyFormat(
5257 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5258 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5259 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005260 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5261 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5262 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5263 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005264 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5265 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005266 verifyFormat(
5267 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5268 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00005269 verifyFormat(
5270 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5271 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005272
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005273 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5274 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005275 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5276 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5277 " aaaaaaaaaaaaaaaaaaaaa)\n"
5278 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005279 verifyFormat("LOG_IF(aaa == //\n"
5280 " bbb)\n"
5281 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005282
Daniel Jasper467ddb12013-08-12 12:58:05 +00005283 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005284 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5285 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005286 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5287 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5288 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005289 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5290 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005291 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5292 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5293 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5294 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5295 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5296 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5297 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005298
Daniel Jasperc238c872013-04-02 14:33:13 +00005299 verifyFormat(
5300 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5301 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005302
5303 // Incomplete string literal.
5304 EXPECT_EQ("llvm::errs() << \"\n"
5305 " << a;",
5306 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005307
5308 verifyFormat("void f() {\n"
5309 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5310 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5311 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005312
5313 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005314 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5315 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5316 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005317
5318 // Handle '\n'.
5319 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5320 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5321 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5322 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5323 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5324 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5325 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005326}
5327
Daniel Jasper7209bb92016-12-13 11:16:42 +00005328TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5329 verifyFormat("return out << \"somepacket = {\\n\"\n"
5330 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5331 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5332 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5333 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5334 " << \"}\";");
5335
5336 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5337 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5338 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5339 verifyFormat(
5340 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5341 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5342 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5343 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5344 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5345 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5346 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5347 verifyFormat(
5348 "void f() {\n"
5349 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5350 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5351 "}");
5352
5353 // Breaking before the first "<<" is generally not desirable.
5354 verifyFormat(
5355 "llvm::errs()\n"
5356 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5357 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5358 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5359 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5360 getLLVMStyleWithColumns(70));
5361 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5362 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5363 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5364 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5365 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5366 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5367 getLLVMStyleWithColumns(70));
5368
5369 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5370 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5371 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5372 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5373 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5374 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005375 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5376 " (aaaa + aaaa);",
5377 getLLVMStyleWithColumns(40));
5378 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5379 " (aaaaaaa + aaaaa));",
5380 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005381 verifyFormat(
5382 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5383 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5384 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005385}
5386
Daniel Jasperf7935112012-12-03 18:12:45 +00005387TEST_F(FormatTest, UnderstandsEquals) {
5388 verifyFormat(
5389 "aaaaaaaaaaaaaaaaa =\n"
5390 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5391 verifyFormat(
5392 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005393 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005394 verifyFormat(
5395 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005396 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005397 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005398 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5399 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005400
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005401 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5402 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005403}
5404
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005405TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005406 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5407 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005408
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005409 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5410 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005411
5412 verifyFormat(
5413 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5414 " Parameter2);");
5415
5416 verifyFormat(
5417 "ShortObject->shortFunction(\n"
5418 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5419 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5420
5421 verifyFormat("loooooooooooooongFunction(\n"
5422 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5423
5424 verifyFormat(
5425 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5426 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5427
Daniel Jasper687af3b2013-02-14 14:26:07 +00005428 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5429 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005430 verifyFormat("void f() {\n"
5431 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5432 " .Times(2)\n"
5433 " .WillRepeatedly(Return(SomeValue));\n"
5434 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005435 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5436 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005437 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005438 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5439 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005440 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005441 verifyFormat("void f() {\n"
5442 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5443 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5444 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005445 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5446 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5447 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5448 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5449 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005450 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5451 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5452 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5453 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5454 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005455
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005456 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005457 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005458 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005459 verifyFormat(
5460 "aaaaaaaaaaa->aaaaaaaaa(\n"
5461 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5462 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005463
5464 verifyFormat(
5465 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5466 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005467 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5468 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5469 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5470 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005471
Daniel Jasper9b334242013-03-15 14:57:30 +00005472 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005473 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5474 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005475
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005476 FormatStyle NoBinPacking = getLLVMStyle();
5477 NoBinPacking.BinPackParameters = false;
5478 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5479 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5480 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5481 " aaaaaaaaaaaaaaaaaaa,\n"
5482 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5483 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005484
5485 // If there is a subsequent call, change to hanging indentation.
5486 verifyFormat(
5487 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5488 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5489 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5490 verifyFormat(
5491 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5492 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005493 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5494 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5495 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5496 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5497 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5498 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005499}
5500
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005501TEST_F(FormatTest, WrapsTemplateDeclarations) {
5502 verifyFormat("template <typename T>\n"
5503 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005504 verifyFormat("template <typename T>\n"
5505 "// T should be one of {A, B}.\n"
5506 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005507 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005508 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005509 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005510 verifyFormat("template <typename T>\n"
5511 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5512 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005513 verifyFormat(
5514 "template <typename T>\n"
5515 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5516 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005517 verifyFormat(
5518 "template <typename T>\n"
5519 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5520 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5521 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005522 verifyFormat("template <typename T>\n"
5523 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005524 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005525 verifyFormat(
5526 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5527 " typename T4 = char>\n"
5528 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005529 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5530 " template <typename> class cccccccccccccccccccccc,\n"
5531 " typename ddddddddddddd>\n"
5532 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005533 verifyFormat(
5534 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5535 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005536
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005537 verifyFormat("void f() {\n"
5538 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5539 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5540 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005541
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005542 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005543 verifyFormat("template <typename T> void f();");
5544 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005545 verifyFormat(
5546 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5547 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5548 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5549 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5550 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5552 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5553 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005554 EXPECT_EQ("static_cast<A< //\n"
5555 " B> *>(\n"
5556 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00005557 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00005558 format("static_cast<A<//\n"
5559 " B>*>(\n"
5560 "\n"
5561 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005562 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5563 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005564
5565 FormatStyle AlwaysBreak = getLLVMStyle();
Francois Ferrand58e6fe52018-05-16 08:25:03 +00005566 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005567 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5568 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5569 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5570 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5571 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5572 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5573 verifyFormat("template <template <typename> class Fooooooo,\n"
5574 " template <typename> class Baaaaaaar>\n"
5575 "struct C {};",
5576 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005577 verifyFormat("template <typename T> // T can be A, B or C.\n"
5578 "struct C {};",
5579 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005580 verifyFormat("template <enum E> class A {\n"
5581 "public:\n"
5582 " E *f();\n"
5583 "};");
Francois Ferrand58e6fe52018-05-16 08:25:03 +00005584
5585 FormatStyle NeverBreak = getLLVMStyle();
5586 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
5587 verifyFormat("template <typename T> class C {};", NeverBreak);
5588 verifyFormat("template <typename T> void f();", NeverBreak);
5589 verifyFormat("template <typename T> void f() {}", NeverBreak);
5590 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
5591 NeverBreak);
5592 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5593 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5594 " ccccccccccccccccccccccccccccccccccccccccccccccc);",
5595 NeverBreak);
5596 verifyFormat("template <template <typename> class Fooooooo,\n"
5597 " template <typename> class Baaaaaaar>\n"
5598 "struct C {};",
5599 NeverBreak);
5600 verifyFormat("template <typename T> // T can be A, B or C.\n"
5601 "struct C {};",
5602 NeverBreak);
5603 verifyFormat("template <enum E> class A {\n"
5604 "public:\n"
5605 " E *f();\n"
5606 "};", NeverBreak);
5607 NeverBreak.PenaltyBreakTemplateDeclaration = 100;
5608 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
5609 NeverBreak);
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005610}
5611
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005612TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
5613 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
5614 Style.ColumnLimit = 60;
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005615 EXPECT_EQ("// Baseline - no comments.\n"
5616 "template <\n"
5617 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
5618 "void f() {}",
5619 format("// Baseline - no comments.\n"
5620 "template <\n"
5621 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
5622 "void f() {}",
5623 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005624
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005625 EXPECT_EQ("template <\n"
5626 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5627 "void f() {}",
5628 format("template <\n"
5629 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5630 "void f() {}",
5631 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005632
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005633 EXPECT_EQ(
5634 "template <\n"
5635 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
5636 "void f() {}",
5637 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
5638 "void f() {}",
5639 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005640
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005641 EXPECT_EQ(
5642 "template <\n"
5643 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5644 " // multiline\n"
5645 "void f() {}",
5646 format("template <\n"
5647 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5648 " // multiline\n"
5649 "void f() {}",
5650 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005651
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005652 EXPECT_EQ(
5653 "template <typename aaaaaaaaaa<\n"
5654 " bbbbbbbbbbbb>::value> // trailing loooong\n"
5655 "void f() {}",
5656 format(
5657 "template <\n"
5658 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
5659 "void f() {}",
5660 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005661}
5662
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005663TEST_F(FormatTest, WrapsTemplateParameters) {
5664 FormatStyle Style = getLLVMStyle();
5665 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5666 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5667 verifyFormat(
5668 "template <typename... a> struct q {};\n"
5669 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5670 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5671 " y;",
5672 Style);
5673 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5674 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5675 verifyFormat(
5676 "template <typename... a> struct r {};\n"
5677 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5678 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5679 " y;",
5680 Style);
5681 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5682 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5683 verifyFormat(
5684 "template <typename... a> struct s {};\n"
5685 "extern s<\n"
5686 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5687 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5688 " y;",
5689 Style);
5690 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5691 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5692 verifyFormat(
5693 "template <typename... a> struct t {};\n"
5694 "extern t<\n"
5695 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5696 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5697 " y;",
5698 Style);
5699}
5700
Daniel Jasper45797022013-01-25 10:57:27 +00005701TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5702 verifyFormat(
5703 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5704 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5705 verifyFormat(
5706 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5707 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5708 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5709
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005710 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005711 verifyFormat(
5712 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5713 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005714 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005715
Daniel Jasper45797022013-01-25 10:57:27 +00005716 verifyFormat(
5717 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005718 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005719
5720 // Breaking at nested name specifiers is generally not desirable.
5721 verifyFormat(
5722 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5723 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005724
5725 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005726 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5727 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5728 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005729 " aaaaaaaaaaaaaaaaaaaaa);",
5730 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005731
5732 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5733 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5734 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005735}
5736
Daniel Jasperf7935112012-12-03 18:12:45 +00005737TEST_F(FormatTest, UnderstandsTemplateParameters) {
5738 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005739 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005740 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5741 verifyFormat("bool x = a < 1 || 2 > a;");
5742 verifyFormat("bool x = 5 < f<int>();");
5743 verifyFormat("bool x = f<int>() > 5;");
5744 verifyFormat("bool x = 5 < a<int>::x;");
5745 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5746 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5747
5748 verifyGoogleFormat("A<A<int>> a;");
5749 verifyGoogleFormat("A<A<A<int>>> a;");
5750 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005751 verifyGoogleFormat("A<A<int> > a;");
5752 verifyGoogleFormat("A<A<A<int> > > a;");
5753 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005754 verifyGoogleFormat("A<::A<int>> a;");
5755 verifyGoogleFormat("A<::A> a;");
5756 verifyGoogleFormat("A< ::A> a;");
5757 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005758 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5759 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005760 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5761 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005762 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5763 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005764
Nico Weber7533b4d2014-09-24 17:17:32 +00005765 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5766
Daniel Jasperf7935112012-12-03 18:12:45 +00005767 verifyFormat("test >> a >> b;");
5768 verifyFormat("test << a >> b;");
5769
5770 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005771 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005772 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005773 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5774 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005775 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005776 verifyFormat("f(a.operator()<A>());");
5777 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5778 " .template operator()<A>());",
5779 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005780
5781 // Not template parameters.
5782 verifyFormat("return a < b && c > d;");
5783 verifyFormat("void f() {\n"
5784 " while (a < b && c > d) {\n"
5785 " }\n"
5786 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005787 verifyFormat("template <typename... Types>\n"
5788 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005789
5790 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5791 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5792 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005793 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005794 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005795 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005796}
5797
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005798TEST_F(FormatTest, BitshiftOperatorWidth) {
5799 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5800 " bar */",
5801 format("int a=1<<2; /* foo\n"
5802 " bar */"));
5803
5804 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5805 " bar */",
5806 format("int b =256>>1 ; /* foo\n"
5807 " bar */"));
5808}
5809
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005810TEST_F(FormatTest, UnderstandsBinaryOperators) {
5811 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005812 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005813}
5814
5815TEST_F(FormatTest, UnderstandsPointersToMembers) {
5816 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005817 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005818 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005819 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005820 verifyFormat("void f() {\n"
5821 " (a->*f)();\n"
5822 " a->*x;\n"
5823 " (a.*f)();\n"
5824 " ((*a).*f)();\n"
5825 " a.*x;\n"
5826 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005827 verifyFormat("void f() {\n"
5828 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5829 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5830 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005831 verifyFormat(
5832 "(aaaaaaaaaa->*bbbbbbb)(\n"
5833 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005834 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005835 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005836 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005837}
5838
Daniel Jasper8dd40472012-12-21 09:41:31 +00005839TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005840 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005841 verifyFormat("f(-1, -2, -3);");
5842 verifyFormat("a[-1] = 5;");
5843 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005844 verifyFormat("if (i == -1) {\n}");
5845 verifyFormat("if (i != -1) {\n}");
5846 verifyFormat("if (i > -1) {\n}");
5847 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005848 verifyFormat("++(a->f());");
5849 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005850 verifyFormat("(a->f())++;");
5851 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005852 verifyFormat("if (!(a->f())) {\n}");
Krasimir Georgiev446d6ec2018-03-06 13:56:28 +00005853 verifyFormat("if (!+i) {\n}");
5854 verifyFormat("~&a;");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005855
5856 verifyFormat("a-- > b;");
5857 verifyFormat("b ? -a : c;");
5858 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005859 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005860 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005861 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005862
5863 verifyFormat("return -1;");
5864 verifyFormat("switch (a) {\n"
5865 "case -1:\n"
5866 " break;\n"
5867 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005868 verifyFormat("#define X -1");
5869 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005870
Chandler Carruthf8b72662014-03-02 12:37:31 +00005871 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5872 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005873
5874 verifyFormat("int a = /* confusing comment */ -1;");
5875 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5876 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005877}
5878
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005879TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005880 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005881 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005882 "}");
5883 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005884 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005885 verifyFormat("*aaa = aaaaaaa( // break\n"
5886 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005887}
5888
Daniel Jasper8863ada2013-08-26 08:10:17 +00005889TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005890 verifyFormat("bool operator<();");
5891 verifyFormat("bool operator>();");
5892 verifyFormat("bool operator=();");
5893 verifyFormat("bool operator==();");
5894 verifyFormat("bool operator!=();");
5895 verifyFormat("int operator+();");
5896 verifyFormat("int operator++();");
Daniel Jasperbbf5f4e2017-11-06 12:11:51 +00005897 verifyFormat("int operator++(int) volatile noexcept;");
Daniel Jasper804a2762016-01-09 15:56:40 +00005898 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005899 verifyFormat("bool operator();");
5900 verifyFormat("bool operator()();");
5901 verifyFormat("bool operator[]();");
5902 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005903 verifyFormat("operator int();");
5904 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005905 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005906 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005907 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005908 verifyFormat("void *operator new(std::size_t size);");
5909 verifyFormat("void *operator new[](std::size_t size);");
5910 verifyFormat("void operator delete(void *ptr);");
5911 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005912 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5913 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005914 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005915 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005916
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005917 verifyFormat(
5918 "ostream &operator<<(ostream &OutputStream,\n"
5919 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005920 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5921 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5922 " return left.group < right.group;\n"
5923 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005924 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005925 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005926
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005927 verifyGoogleFormat("operator void*();");
5928 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005929 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005930
5931 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005932 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5933 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005934}
5935
Daniel Jasper1c220482015-02-25 10:30:06 +00005936TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005937 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5938 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5939 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5940 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5941 verifyFormat("Deleted &operator=(const Deleted &) &;");
5942 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5943 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5944 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5945 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5946 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5947 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005948 verifyFormat("void Fn(T const &) const &;");
5949 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005950 verifyFormat("template <typename T>\n"
5951 "void F(T) && = delete;",
5952 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005953
Daniel Jasperaf642c62015-08-25 13:40:51 +00005954 FormatStyle AlignLeft = getLLVMStyle();
5955 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005956 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005957 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5958 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5959 AlignLeft);
5960 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5961 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005962 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5963 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5964 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5965 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005966 verifyFormat("void Fn(T const&) const&;", AlignLeft);
5967 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005968
5969 FormatStyle Spaces = getLLVMStyle();
5970 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005971 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5972 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5973 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5974 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005975
5976 Spaces.SpacesInCStyleCastParentheses = false;
5977 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005978 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5979 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5980 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5981 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005982}
5983
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005984TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005985 verifyFormat("void f() {\n"
5986 " A *a = new A;\n"
5987 " A *a = new (placement) A;\n"
5988 " delete a;\n"
5989 " delete (A *)a;\n"
5990 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005991 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5992 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005993 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5994 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5995 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005996 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005997}
5998
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005999TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006000 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006001 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006002 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006003 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006004 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006005 verifyIndependentOfContext("int a = b * 10;");
6006 verifyIndependentOfContext("int a = 10 * b;");
6007 verifyIndependentOfContext("int a = b * c;");
6008 verifyIndependentOfContext("int a += b * c;");
6009 verifyIndependentOfContext("int a -= b * c;");
6010 verifyIndependentOfContext("int a *= b * c;");
6011 verifyIndependentOfContext("int a /= b * c;");
6012 verifyIndependentOfContext("int a = *b;");
6013 verifyIndependentOfContext("int a = *b * c;");
6014 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00006015 verifyIndependentOfContext("int a = b * (10);");
6016 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006017 verifyIndependentOfContext("return 10 * b;");
6018 verifyIndependentOfContext("return *b * *c;");
6019 verifyIndependentOfContext("return a & ~b;");
6020 verifyIndependentOfContext("f(b ? *c : *d);");
6021 verifyIndependentOfContext("int a = b ? *c : *d;");
6022 verifyIndependentOfContext("*b = a;");
6023 verifyIndependentOfContext("a * ~b;");
6024 verifyIndependentOfContext("a * !b;");
6025 verifyIndependentOfContext("a * +b;");
6026 verifyIndependentOfContext("a * -b;");
6027 verifyIndependentOfContext("a * ++b;");
6028 verifyIndependentOfContext("a * --b;");
6029 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00006030 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006031 verifyIndependentOfContext("f() * b;");
6032 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006033 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006034 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00006035 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006036 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00006037 verifyIndependentOfContext("return sizeof(int **);");
6038 verifyIndependentOfContext("return sizeof(int ******);");
6039 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00006040 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006041 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00006042 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00006043 verifyGoogleFormat("return sizeof(int**);");
6044 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6045 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006046 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00006047 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00006048 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00006049 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00006050 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00006051 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00006052 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00006053 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00006054 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00006055 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00006056 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00006057 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00006058 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00006059 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00006060 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00006061 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00006062 verifyFormat("void f(const MyOverride &override);");
6063 verifyFormat("void f(const MyFinal &final);");
6064 verifyIndependentOfContext("bool a = f() && override.f();");
6065 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00006066
Daniel Jasper5b49f472013-01-23 12:10:53 +00006067 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00006068
Daniel Jasper5b49f472013-01-23 12:10:53 +00006069 verifyIndependentOfContext("A<int *> a;");
6070 verifyIndependentOfContext("A<int **> a;");
6071 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00006072 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006073 verifyIndependentOfContext(
6074 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006075 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00006076 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00006077 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00006078 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00006079 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00006080
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00006081 verifyFormat(
6082 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6083 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6084
Daniel Jasper1f5d6372016-06-13 14:45:12 +00006085 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00006086 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00006087 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006088 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00006089 verifyGoogleFormat("A<int*> a;");
6090 verifyGoogleFormat("A<int**> a;");
6091 verifyGoogleFormat("A<int*, int*> a;");
6092 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006093 verifyGoogleFormat("f(b ? *c : *d);");
6094 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00006095 verifyGoogleFormat("Type* t = **x;");
6096 verifyGoogleFormat("Type* t = *++*x;");
6097 verifyGoogleFormat("*++*x;");
6098 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6099 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006100 verifyGoogleFormat(
6101 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00006102 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00006103 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6104 verifyGoogleFormat("template <typename T>\n"
6105 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00006106
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006107 FormatStyle Left = getLLVMStyle();
6108 Left.PointerAlignment = FormatStyle::PAS_Left;
6109 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00006110 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00006111 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00006112 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00006113 verifyFormat("delete *x;", Left);
6114 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
6115 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
6116 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006117
Daniel Jasper5b49f472013-01-23 12:10:53 +00006118 verifyIndependentOfContext("a = *(x + y);");
6119 verifyIndependentOfContext("a = &(x + y);");
6120 verifyIndependentOfContext("*(x + y).call();");
6121 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006122 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00006123
Daniel Jasper5b49f472013-01-23 12:10:53 +00006124 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00006125 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00006126 "int *MyValues = {\n"
6127 " *A, // Operator detection might be confused by the '{'\n"
6128 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00006129 "};");
Nico Weber80a82762013-01-17 17:17:19 +00006130
Daniel Jasper5b49f472013-01-23 12:10:53 +00006131 verifyIndependentOfContext("if (int *a = &b)");
6132 verifyIndependentOfContext("if (int &a = *b)");
6133 verifyIndependentOfContext("if (a & b[i])");
6134 verifyIndependentOfContext("if (a::b::c::d & b[i])");
6135 verifyIndependentOfContext("if (*b[i])");
6136 verifyIndependentOfContext("if (int *a = (&b))");
6137 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00006138 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00006139 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00006140 verifyFormat("void f() {\n"
6141 " for (const int &v : Values) {\n"
6142 " }\n"
6143 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006144 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6145 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00006146 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00006147
Daniel Jaspera98da3d2013-11-07 19:56:07 +00006148 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006149 verifyFormat("#define MACRO \\\n"
6150 " int *i = a * b; \\\n"
6151 " void f(a *b);",
6152 getLLVMStyleWithColumns(19));
6153
Daniel Jasper97b89482013-03-13 07:49:51 +00006154 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006155 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006156 verifyIndependentOfContext("T **t = new T *;");
6157 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00006158 verifyGoogleFormat("A = new SomeType*[Length]();");
6159 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006160 verifyGoogleFormat("T** t = new T*;");
6161 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006162
Daniel Jaspera65e8872014-03-25 10:52:45 +00006163 verifyFormat("STATIC_ASSERT((a & b) == 0);");
6164 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006165 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006166 "typename t::if<x && y>::type f() {}");
6167 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006168 verifyFormat("vector<int *> v;");
6169 verifyFormat("vector<int *const> v;");
6170 verifyFormat("vector<int *const **const *> v;");
6171 verifyFormat("vector<int *volatile> v;");
6172 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006173 verifyFormat("foo<b && false>();");
6174 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00006175 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00006176 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006177 "template <class T, class = typename std::enable_if<\n"
6178 " std::is_integral<T>::value &&\n"
6179 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
6180 "void F();",
6181 getLLVMStyleWithColumns(70));
6182 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006183 "template <class T,\n"
6184 " class = typename std::enable_if<\n"
6185 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006186 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
6187 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006188 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006189 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006190 verifyFormat(
6191 "template <class T,\n"
6192 " class = typename ::std::enable_if<\n"
6193 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6194 "void F();",
6195 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006196
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006197 verifyIndependentOfContext("MACRO(int *i);");
6198 verifyIndependentOfContext("MACRO(auto *a);");
6199 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00006200 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006201 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006202 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006203 // FIXME: Is there a way to make this work?
6204 // verifyIndependentOfContext("MACRO(A *a);");
6205
Daniel Jasper32ccb032014-06-23 07:36:18 +00006206 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006207 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006208
Daniel Jasper866468a2014-04-14 13:15:29 +00006209 EXPECT_EQ("#define OP(x) \\\n"
6210 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6211 " return s << a.DebugString(); \\\n"
6212 " }",
6213 format("#define OP(x) \\\n"
6214 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6215 " return s << a.DebugString(); \\\n"
6216 " }",
6217 getLLVMStyleWithColumns(50)));
6218
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006219 // FIXME: We cannot handle this case yet; we might be able to figure out that
6220 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006221 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006222
6223 FormatStyle PointerMiddle = getLLVMStyle();
6224 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6225 verifyFormat("delete *x;", PointerMiddle);
6226 verifyFormat("int * x;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006227 verifyFormat("int *[] x;", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006228 verifyFormat("template <int * y> f() {}", PointerMiddle);
6229 verifyFormat("int * f(int * a) {}", PointerMiddle);
6230 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6231 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6232 verifyFormat("A<int *> a;", PointerMiddle);
6233 verifyFormat("A<int **> a;", PointerMiddle);
6234 verifyFormat("A<int *, int *> a;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006235 verifyFormat("A<int *[]> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006236 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6237 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006238 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006239
6240 // Member function reference qualifiers aren't binary operators.
6241 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006242 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006243 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006244 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006245 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006246 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006247}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006248
Daniel Jasperee6d6502013-07-17 20:25:02 +00006249TEST_F(FormatTest, UnderstandsAttributes) {
6250 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006251 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6252 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006253 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006254 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006255 verifyFormat("__attribute__((nodebug)) void\n"
6256 "foo() {}\n",
6257 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006258}
6259
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006260TEST_F(FormatTest, UnderstandsSquareAttributes) {
6261 verifyFormat("SomeType s [[unused]] (InitValue);");
6262 verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
6263 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
6264 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
6265 verifyFormat("void f() [[deprecated(\"so sorry\")]];");
6266 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6267 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Manuel Klimekd0f3fe52018-04-11 14:51:54 +00006268
6269 // Make sure we do not mistake attributes for array subscripts.
6270 verifyFormat("int a() {}\n"
6271 "[[unused]] int b() {}\n");
6272
6273 // On the other hand, we still need to correctly find array subscripts.
6274 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
6275
6276 // Make sure we do not parse attributes as lambda introducers.
6277 FormatStyle MultiLineFunctions = getLLVMStyle();
6278 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6279 verifyFormat("[[unused]] int b() {\n"
6280 " return 42;\n"
6281 "}\n",
6282 MultiLineFunctions);
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006283}
6284
Daniel Jasper10cd5812013-05-06 06:35:44 +00006285TEST_F(FormatTest, UnderstandsEllipsis) {
6286 verifyFormat("int printf(const char *fmt, ...);");
6287 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006288 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6289
6290 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006291 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006292 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006293}
6294
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006295TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006296 EXPECT_EQ("int *a;\n"
6297 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006298 "int *a;",
6299 format("int *a;\n"
6300 "int* a;\n"
6301 "int *a;",
6302 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006303 EXPECT_EQ("int* a;\n"
6304 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006305 "int* a;",
6306 format("int* a;\n"
6307 "int* a;\n"
6308 "int *a;",
6309 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006310 EXPECT_EQ("int *a;\n"
6311 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006312 "int *a;",
6313 format("int *a;\n"
6314 "int * a;\n"
6315 "int * a;",
6316 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006317 EXPECT_EQ("auto x = [] {\n"
6318 " int *a;\n"
6319 " int *a;\n"
6320 " int *a;\n"
6321 "};",
6322 format("auto x=[]{int *a;\n"
6323 "int * a;\n"
6324 "int * a;};",
6325 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006326}
6327
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006328TEST_F(FormatTest, UnderstandsRvalueReferences) {
6329 verifyFormat("int f(int &&a) {}");
6330 verifyFormat("int f(int a, char &&b) {}");
6331 verifyFormat("void f() { int &&a = b; }");
6332 verifyGoogleFormat("int f(int a, char&& b) {}");
6333 verifyGoogleFormat("void f() { int&& a = b; }");
6334
Daniel Jasper1eff9082013-05-27 16:36:33 +00006335 verifyIndependentOfContext("A<int &&> a;");
6336 verifyIndependentOfContext("A<int &&, int &&> a;");
6337 verifyGoogleFormat("A<int&&> a;");
6338 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006339
6340 // Not rvalue references:
6341 verifyFormat("template <bool B, bool C> class A {\n"
6342 " static_assert(B && C, \"Something is wrong\");\n"
6343 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006344 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6345 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006346 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006347}
6348
Manuel Klimekc1237a82013-01-23 14:08:21 +00006349TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6350 verifyFormat("void f() {\n"
6351 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006352 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006353 "}",
6354 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006355}
6356
Daniel Jasperef906a92013-01-13 08:01:36 +00006357TEST_F(FormatTest, FormatsCasts) {
6358 verifyFormat("Type *A = static_cast<Type *>(P);");
6359 verifyFormat("Type *A = (Type *)P;");
6360 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6361 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006362 verifyFormat("int a = (int)2.0f;");
6363 verifyFormat("x[(int32)y];");
6364 verifyFormat("x = (int32)y;");
6365 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6366 verifyFormat("int a = (int)*b;");
6367 verifyFormat("int a = (int)2.0f;");
6368 verifyFormat("int a = (int)~0;");
6369 verifyFormat("int a = (int)++a;");
6370 verifyFormat("int a = (int)sizeof(int);");
6371 verifyFormat("int a = (int)+2;");
6372 verifyFormat("my_int a = (my_int)2.0f;");
6373 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006374 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006375 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006376 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006377 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006378 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006379
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006380 verifyFormat("void f() { my_int a = (my_int)*b; }");
6381 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6382 verifyFormat("my_int a = (my_int)~0;");
6383 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006384 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006385 verifyFormat("my_int a = (my_int)1;");
6386 verifyFormat("my_int a = (my_int *)1;");
6387 verifyFormat("my_int a = (const my_int)-1;");
6388 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006389 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006390 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006391 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006392 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006393
6394 // FIXME: single value wrapped with paren will be treated as cast.
6395 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006396
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006397 verifyFormat("{ (void)F; }");
6398
Daniel Jasper998cabc2013-07-18 14:46:07 +00006399 // Don't break after a cast's
6400 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6401 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6402 " bbbbbbbbbbbbbbbbbbbbbb);");
6403
Daniel Jasperef906a92013-01-13 08:01:36 +00006404 // These are not casts.
6405 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006406 verifyFormat("f(foo)->b;");
6407 verifyFormat("f(foo).b;");
6408 verifyFormat("f(foo)(b);");
6409 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006410 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006411 verifyFormat("(*funptr)(foo)[4];");
6412 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006413 verifyFormat("void f(int *);");
6414 verifyFormat("void f(int *) = 0;");
6415 verifyFormat("void f(SmallVector<int>) {}");
6416 verifyFormat("void f(SmallVector<int>);");
6417 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006418 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006419 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006420 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006421 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6422 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006423 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006424
Daniel Jasperba0bda92013-02-23 08:07:18 +00006425 // These are not casts, but at some point were confused with casts.
6426 verifyFormat("virtual void foo(int *) override;");
6427 verifyFormat("virtual void foo(char &) const;");
6428 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006429 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006430 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006431 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006432 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006433
6434 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6435 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006436 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006437 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006438 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6439 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6440 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006441}
6442
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006443TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006444 verifyFormat("A<bool()> a;");
6445 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006446 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006447 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006448 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006449 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006450 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006451 verifyFormat("template <class CallbackClass>\n"
6452 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006453
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006454 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6455 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006456 verifyGoogleFormat(
6457 "template <class CallbackClass>\n"
6458 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006459
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006460 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006461 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006462 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006463 verifyFormat("some_var = function(*some_pointer_var)[0];");
6464 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006465 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006466 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00006467 verifyFormat("std::function<\n"
6468 " LooooooooooongTemplatedType<\n"
6469 " SomeType>*(\n"
6470 " LooooooooooooooooongType type)>\n"
6471 " function;",
6472 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006473}
6474
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006475TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6476 verifyFormat("A (*foo_)[6];");
6477 verifyFormat("vector<int> (*foo_)[6];");
6478}
6479
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006480TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6481 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6482 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6483 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6484 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006485 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6486 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006487
6488 // Different ways of ()-initializiation.
6489 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6490 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6491 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6492 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6493 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6494 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006495 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6496 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006497
6498 // Lambdas should not confuse the variable declaration heuristic.
6499 verifyFormat("LooooooooooooooooongType\n"
6500 " variable(nullptr, [](A *a) {});",
6501 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006502}
6503
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006504TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006505 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006506 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006507 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006509 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006510 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006511 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6512 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006513 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6514 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006515 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6516 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006517 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6518 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006519 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6520 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006521 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6522 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6523 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6524 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006525 FormatStyle Indented = getLLVMStyle();
6526 Indented.IndentWrappedFunctionNames = true;
6527 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6528 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6529 Indented);
6530 verifyFormat(
6531 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6532 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6533 Indented);
6534 verifyFormat(
6535 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6536 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6537 Indented);
6538 verifyFormat(
6539 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6540 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6541 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006542
6543 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006544 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6545 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6546 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006547
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006548 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006549 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006550 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006551 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6552 " SourceLocation L, IdentifierIn *II,\n"
6553 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006554 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006555 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006556 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006557 " const SomeType<string, SomeOtherTemplateParameter>\n"
6558 " &ReallyReallyLongParameterName,\n"
6559 " const SomeType<string, SomeOtherTemplateParameter>\n"
6560 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006561 verifyFormat("template <typename A>\n"
6562 "SomeLoooooooooooooooooooooongType<\n"
6563 " typename some_namespace::SomeOtherType<A>::Type>\n"
6564 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006565
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006566 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006567 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6568 " aaaaaaaaaaaaaaaaaaaaaaa;");
6569 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006570 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6571 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006572 verifyGoogleFormat(
6573 "some_namespace::LongReturnType\n"
6574 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006575 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006576
6577 verifyGoogleFormat("template <typename T>\n"
6578 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006579 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006580 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6581 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006582
6583 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006584 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6585 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006586 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6587 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6588 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6589 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6590 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6591 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6592 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006593
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006594 verifyFormat("template <typename T> // Templates on own line.\n"
6595 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006596 "MyFunction(int a);",
6597 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006598}
6599
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006600TEST_F(FormatTest, FormatsArrays) {
6601 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6602 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006603 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6604 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006605 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6606 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006607 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6608 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6609 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6610 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6611 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6612 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6613 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6614 verifyFormat(
6615 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6616 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6617 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006618 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6619 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006620
6621 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6622 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006623 verifyFormat(
6624 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6625 " .aaaaaaa[0]\n"
6626 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006627 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006628
6629 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006630
6631 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6632 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006633}
6634
Daniel Jaspere9de2602012-12-06 09:56:08 +00006635TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6636 verifyFormat("(a)->b();");
6637 verifyFormat("--a;");
6638}
6639
Daniel Jasper8b529712012-12-04 13:02:32 +00006640TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006641 verifyFormat("#include <string>\n"
6642 "#include <a/b/c.h>\n"
6643 "#include \"a/b/string\"\n"
6644 "#include \"string.h\"\n"
6645 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006646 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006647 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006648 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006649 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006650 "#include \"some long include\" // with a comment\n"
Manuel Klimek45ab5592017-11-14 09:19:53 +00006651 "#include \"some very long include path\"\n"
6652 "#include <some/very/long/include/path>\n",
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006653 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006654 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6655 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006656
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006657 verifyFormat("#import <string>");
6658 verifyFormat("#import <a/b/c.h>");
6659 verifyFormat("#import \"a/b/string\"");
6660 verifyFormat("#import \"string.h\"");
6661 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006662 verifyFormat("#if __has_include(<strstream>)\n"
6663 "#include <strstream>\n"
6664 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006665
Daniel Jasper343643b2014-08-13 08:29:18 +00006666 verifyFormat("#define MY_IMPORT <a/b>");
6667
Nico Weber21088802017-02-10 19:36:52 +00006668 verifyFormat("#if __has_include(<a/b>)");
6669 verifyFormat("#if __has_include_next(<a/b>)");
6670 verifyFormat("#define F __has_include(<a/b>)");
6671 verifyFormat("#define F __has_include_next(<a/b>)");
6672
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006673 // Protocol buffer definition or missing "#".
6674 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6675 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006676
6677 FormatStyle Style = getLLVMStyle();
6678 Style.AlwaysBreakBeforeMultilineStrings = true;
6679 Style.ColumnLimit = 0;
6680 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006681
6682 // But 'import' might also be a regular C++ namespace.
6683 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6684 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006685}
6686
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006687//===----------------------------------------------------------------------===//
6688// Error recovery tests.
6689//===----------------------------------------------------------------------===//
6690
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006691TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006692 FormatStyle NoBinPacking = getLLVMStyle();
6693 NoBinPacking.BinPackParameters = false;
6694 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6695 " double *min_x,\n"
6696 " double *max_x,\n"
6697 " double *min_y,\n"
6698 " double *max_y,\n"
6699 " double *min_z,\n"
6700 " double *max_z, ) {}",
6701 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006702}
6703
Daniel Jasper83a54d22013-01-10 09:26:47 +00006704TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006705 verifyFormat("void f() { return; }\n42");
6706 verifyFormat("void f() {\n"
6707 " if (0)\n"
6708 " return;\n"
6709 "}\n"
6710 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006711 verifyFormat("void f() { return }\n42");
6712 verifyFormat("void f() {\n"
6713 " if (0)\n"
6714 " return\n"
6715 "}\n"
6716 "42");
6717}
6718
6719TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6720 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6721 EXPECT_EQ("void f() {\n"
6722 " if (a)\n"
6723 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006724 "}",
6725 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006726 EXPECT_EQ("namespace N {\n"
6727 "void f()\n"
6728 "}",
6729 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006730 EXPECT_EQ("namespace N {\n"
6731 "void f() {}\n"
6732 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006733 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006734 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006735}
6736
Daniel Jasper2df93312013-01-09 10:16:05 +00006737TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6738 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006739 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006740 " b;",
6741 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006742 verifyFormat("function(\n"
6743 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006744 " LoooooooooooongArgument);\n",
6745 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006746}
6747
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006748TEST_F(FormatTest, IncorrectAccessSpecifier) {
6749 verifyFormat("public:");
6750 verifyFormat("class A {\n"
6751 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006752 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006753 "};");
6754 verifyFormat("public\n"
6755 "int qwerty;");
6756 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006757 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006758 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006759 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006760 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006761 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006762}
Daniel Jasperf7935112012-12-03 18:12:45 +00006763
Daniel Jasper291f9362013-03-20 15:58:10 +00006764TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6765 verifyFormat("{");
6766 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006767 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006768}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006769
Krasimir Georgiev067ec702018-05-22 11:44:03 +00006770TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
6771 // Found by oss-fuzz:
6772 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
6773 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
6774 Style.ColumnLimit = 60;
6775 verifyNoCrash(
6776 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
6777 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
6778 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
6779 Style);
6780}
6781
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006782TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006783 verifyFormat("do {\n}");
6784 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006785 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006786 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006787 "wheeee(fun);");
6788 verifyFormat("do {\n"
6789 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006790 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006791}
6792
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006793TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006794 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006795 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006796 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006797 verifyFormat("while {\n foo;\n foo();\n}");
6798 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006799}
6800
Daniel Jasperc0880a92013-01-04 18:52:56 +00006801TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006802 verifyIncompleteFormat("namespace {\n"
6803 "class Foo { Foo (\n"
6804 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006805 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006806}
6807
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006808TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006809 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006810 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6811 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006812 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006813
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006814 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006815 " {\n"
6816 " breakme(\n"
6817 " qwe);\n"
6818 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006819 format("{\n"
6820 " {\n"
6821 " breakme(qwe);\n"
6822 "}\n",
6823 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006824}
6825
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006826TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006827 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006828 " avariable,\n"
6829 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006830 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006831}
6832
Manuel Klimek762dd182013-01-21 10:07:49 +00006833TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006834 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006835}
6836
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006837TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006838 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006839 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006840 " 1,\n"
6841 " 2,\n"
6842 " 3,\n"
6843 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006844 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006845 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6846 verifyFormat("f({1, 2});");
6847 verifyFormat("auto v = Foo{-1};");
6848 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6849 verifyFormat("Class::Class : member{1, 2, 3} {}");
6850 verifyFormat("new vector<int>{1, 2, 3};");
6851 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006852 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006853 verifyFormat("return {arg1, arg2};");
6854 verifyFormat("return {arg1, SomeType{parameter}};");
6855 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6856 verifyFormat("new T{arg1, arg2};");
6857 verifyFormat("f(MyMap[{composite, key}]);");
6858 verifyFormat("class Class {\n"
6859 " T member = {arg1, arg2};\n"
6860 "};");
6861 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006862 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6863 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006864 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6865 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006866
Daniel Jasper438059e2014-05-22 12:11:13 +00006867 verifyFormat("int foo(int i) { return fo1{}(i); }");
6868 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006869 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006870 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006871 verifyFormat("Node n{1, Node{1000}, //\n"
6872 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006873 verifyFormat("Aaaa aaaaaaa{\n"
6874 " {\n"
6875 " aaaa,\n"
6876 " },\n"
6877 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006878 verifyFormat("class C : public D {\n"
6879 " SomeClass SC{2};\n"
6880 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006881 verifyFormat("class C : public A {\n"
6882 " class D : public B {\n"
6883 " void f() { int i{2}; }\n"
6884 " };\n"
6885 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006886 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006887
Francois Ferrandf92f8062018-05-16 08:03:52 +00006888 // Avoid breaking between equal sign and opening brace
6889 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
6890 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
6891 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
6892 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
6893 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
6894 " {\"ccccccccccccccccccccc\", 2}};",
6895 AvoidBreakingFirstArgument);
6896
Francois Ferrandd2130f52017-06-30 20:00:02 +00006897 // Binpacking only if there is no trailing comma
6898 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6899 " cccccccccc, dddddddddd};",
6900 getLLVMStyleWithColumns(50));
6901 verifyFormat("const Aaaaaa aaaaa = {\n"
6902 " aaaaaaaaaaa,\n"
6903 " bbbbbbbbbbb,\n"
6904 " ccccccccccc,\n"
6905 " ddddddddddd,\n"
6906 "};", getLLVMStyleWithColumns(50));
6907
Daniel Jaspere4ada022016-12-13 10:05:03 +00006908 // Cases where distinguising braced lists and blocks is hard.
6909 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6910 verifyFormat("void f() {\n"
6911 " return; // comment\n"
6912 "}\n"
6913 "SomeType t;");
6914 verifyFormat("void f() {\n"
6915 " if (a) {\n"
6916 " f();\n"
6917 " }\n"
6918 "}\n"
6919 "SomeType t;");
6920
Daniel Jasper08434342015-05-26 07:26:26 +00006921 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006922 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006923 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006924 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6925 " bbbbb,\n"
6926 " ccccc,\n"
6927 " ddddd,\n"
6928 " eeeee,\n"
6929 " ffffff,\n"
6930 " ggggg,\n"
6931 " hhhhhh,\n"
6932 " iiiiii,\n"
6933 " jjjjjj,\n"
6934 " kkkkkk};",
6935 NoBinPacking);
6936 verifyFormat("const Aaaaaa aaaaa = {\n"
6937 " aaaaa,\n"
6938 " bbbbb,\n"
6939 " ccccc,\n"
6940 " ddddd,\n"
6941 " eeeee,\n"
6942 " ffffff,\n"
6943 " ggggg,\n"
6944 " hhhhhh,\n"
6945 " iiiiii,\n"
6946 " jjjjjj,\n"
6947 " kkkkkk,\n"
6948 "};",
6949 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006950 verifyFormat(
6951 "const Aaaaaa aaaaa = {\n"
6952 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6953 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6954 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6955 "};",
6956 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006957
Chandler Carruthf8b72662014-03-02 12:37:31 +00006958 // FIXME: The alignment of these trailing comments might be bad. Then again,
6959 // this might be utterly useless in real code.
6960 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006961 " : some_value{ //\n"
6962 " aaaaaaa, //\n"
6963 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006964
Chandler Carruthf8b72662014-03-02 12:37:31 +00006965 // In braced lists, the first comment is always assumed to belong to the
6966 // first element. Thus, it can be moved to the next or previous line as
6967 // appropriate.
6968 EXPECT_EQ("function({// First element:\n"
6969 " 1,\n"
6970 " // Second element:\n"
6971 " 2});",
6972 format("function({\n"
6973 " // First element:\n"
6974 " 1,\n"
6975 " // Second element:\n"
6976 " 2});"));
6977 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6978 " // First element:\n"
6979 " 1,\n"
6980 " // Second element:\n"
6981 " 2};",
6982 format("std::vector<int> MyNumbers{// First element:\n"
6983 " 1,\n"
6984 " // Second element:\n"
6985 " 2};",
6986 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00006987 // A trailing comma should still lead to an enforced line break and no
6988 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00006989 EXPECT_EQ("vector<int> SomeVector = {\n"
6990 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006991 " 1,\n"
6992 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006993 "};",
6994 format("vector<int> SomeVector = { // aaa\n"
6995 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006996
Chandler Carruthf8b72662014-03-02 12:37:31 +00006997 FormatStyle ExtraSpaces = getLLVMStyle();
6998 ExtraSpaces.Cpp11BracedListStyle = false;
6999 ExtraSpaces.ColumnLimit = 75;
7000 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7001 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7002 verifyFormat("f({ 1, 2 });", ExtraSpaces);
7003 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7004 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7005 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7006 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7007 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7008 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7009 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7010 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7011 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7012 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7013 verifyFormat("class Class {\n"
7014 " T member = { arg1, arg2 };\n"
7015 "};",
7016 ExtraSpaces);
7017 verifyFormat(
7018 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7019 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7020 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7021 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7022 ExtraSpaces);
7023 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00007024 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007025 ExtraSpaces);
7026 verifyFormat(
7027 "someFunction(OtherParam,\n"
7028 " BracedList{ // comment 1 (Forcing interesting break)\n"
7029 " param1, param2,\n"
7030 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00007031 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007032 ExtraSpaces);
7033 verifyFormat(
7034 "std::this_thread::sleep_for(\n"
7035 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7036 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00007037 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00007038 " aaaaaaa,\n"
7039 " aaaaaaaaaa,\n"
7040 " aaaaa,\n"
7041 " aaaaaaaaaaaaaaa,\n"
7042 " aaa,\n"
7043 " aaaaaaaaaa,\n"
7044 " a,\n"
7045 " aaaaaaaaaaaaaaaaaaaaa,\n"
7046 " aaaaaaaaaaaa,\n"
7047 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7048 " aaaaaaa,\n"
7049 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007050 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00007051 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
7052 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Francois Ferrandf92f8062018-05-16 08:03:52 +00007053
7054 // Avoid breaking between initializer/equal sign and opening brace
7055 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
7056 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
7057 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7058 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7059 " { \"ccccccccccccccccccccc\", 2 }\n"
7060 "};",
7061 ExtraSpaces);
7062 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
7063 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7064 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7065 " { \"ccccccccccccccccccccc\", 2 }\n"
7066 "};",
7067 ExtraSpaces);
Hans Wennborgbfc34062018-06-14 08:01:09 +00007068
7069 FormatStyle SpaceBeforeBrace = getLLVMStyle();
7070 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
7071 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
7072 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
Manuel Klimekab419912013-05-23 09:41:43 +00007073}
7074
Daniel Jasper33b909c2013-10-25 14:29:37 +00007075TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007076 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7077 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7078 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7079 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7080 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7081 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007082 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007083 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00007084 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007085 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7086 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007087 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007088 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7089 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7090 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
7091 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7092 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7093 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7094 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007095 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007096 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7097 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007098 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7099 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7100 " // Separating comment.\n"
7101 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7102 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7103 " // Leading comment\n"
7104 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7105 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007106 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7107 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007108 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00007109 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7110 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007111 getLLVMStyleWithColumns(38));
7112 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007113 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7114 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007115 verifyFormat(
7116 "static unsigned SomeValues[10][3] = {\n"
7117 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
7118 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7119 verifyFormat("static auto fields = new vector<string>{\n"
7120 " \"aaaaaaaaaaaaa\",\n"
7121 " \"aaaaaaaaaaaaa\",\n"
7122 " \"aaaaaaaaaaaa\",\n"
7123 " \"aaaaaaaaaaaaaa\",\n"
7124 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7125 " \"aaaaaaaaaaaa\",\n"
7126 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7127 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00007128 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7129 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7130 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7131 " 3, cccccccccccccccccccccc};",
7132 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00007133
7134 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00007135 verifyFormat("vector<int> x = {\n"
7136 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
7137 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00007138 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00007139 verifyFormat("vector<int> x = {\n"
7140 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00007141 "};",
7142 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00007143 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7144 " 1, 1, 1, 1,\n"
7145 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00007146 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007147
Daniel Jasper60c27072015-05-13 08:16:00 +00007148 // Trailing comment in the first line.
7149 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
7150 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
7151 " 111111111, 222222222, 3333333333, 444444444, //\n"
7152 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00007153 // Trailing comment in the last line.
7154 verifyFormat("int aaaaa[] = {\n"
7155 " 1, 2, 3, // comment\n"
7156 " 4, 5, 6 // comment\n"
7157 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00007158
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007159 // With nested lists, we should either format one item per line or all nested
7160 // lists one on line.
7161 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007162 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7163 " {aaaaaaaaaaaaaaaaaaa},\n"
7164 " {aaaaaaaaaaaaaaaaaaaaa},\n"
7165 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00007166 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00007167 verifyFormat(
7168 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007169 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7170 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7171 " {aaa, aaa},\n"
7172 " {aaa, aaa},\n"
7173 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7174 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7175 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00007176
7177 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00007178 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007179 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00007180
7181 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00007182
Daniel Jaspereb65e912015-12-21 18:31:15 +00007183 // No braced initializer here.
7184 verifyFormat("void f() {\n"
7185 " struct Dummy {};\n"
7186 " f(v);\n"
7187 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00007188
7189 // Long lists should be formatted in columns even if they are nested.
7190 verifyFormat(
7191 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7192 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7193 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7194 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7195 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7196 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00007197
7198 // Allow "single-column" layout even if that violates the column limit. There
7199 // isn't going to be a better way.
7200 verifyFormat("std::vector<int> a = {\n"
7201 " aaaaaaaa,\n"
7202 " aaaaaaaa,\n"
7203 " aaaaaaaa,\n"
7204 " aaaaaaaa,\n"
7205 " aaaaaaaaaa,\n"
7206 " aaaaaaaa,\n"
7207 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7208 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00007209 verifyFormat("vector<int> aaaa = {\n"
7210 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7211 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7212 " aaaaaa.aaaaaaa,\n"
7213 " aaaaaa.aaaaaaa,\n"
7214 " aaaaaa.aaaaaaa,\n"
7215 " aaaaaa.aaaaaaa,\n"
7216 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007217
7218 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00007219 verifyFormat("someFunction(Param, {List1, List2,\n"
7220 " List3});",
7221 getLLVMStyleWithColumns(35));
7222 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007223 " {List1, List2,\n"
7224 " List3});",
7225 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00007226 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7227 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007228}
7229
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007230TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007231 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007232 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007233
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007234 verifyFormat("void f() { return 42; }");
7235 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007236 " return 42;\n"
7237 "}",
7238 DoNotMerge);
7239 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007240 " // Comment\n"
7241 "}");
7242 verifyFormat("{\n"
7243 "#error {\n"
7244 " int a;\n"
7245 "}");
7246 verifyFormat("{\n"
7247 " int a;\n"
7248 "#error {\n"
7249 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007250 verifyFormat("void f() {} // comment");
7251 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007252 verifyFormat("void f() {\n"
7253 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007254 DoNotMerge);
7255 verifyFormat("void f() {\n"
7256 " int a;\n"
7257 "} // comment",
7258 DoNotMerge);
7259 verifyFormat("void f() {\n"
7260 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007261 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007262
7263 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7264 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7265
7266 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7267 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007268 verifyFormat("class C {\n"
7269 " C()\n"
7270 " : iiiiiiii(nullptr),\n"
7271 " kkkkkkk(nullptr),\n"
7272 " mmmmmmm(nullptr),\n"
7273 " nnnnnnn(nullptr) {}\n"
7274 "};",
7275 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007276
7277 FormatStyle NoColumnLimit = getLLVMStyle();
7278 NoColumnLimit.ColumnLimit = 0;
7279 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7280 EXPECT_EQ("class C {\n"
7281 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007282 "};",
7283 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007284 EXPECT_EQ("A()\n"
7285 " : b(0) {\n"
7286 "}",
7287 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7288
7289 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007290 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7291 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007292 EXPECT_EQ("A()\n"
7293 " : b(0) {\n"
7294 "}",
7295 format("A():b(0){}", DoNotMergeNoColumnLimit));
7296 EXPECT_EQ("A()\n"
7297 " : b(0) {\n"
7298 "}",
7299 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007300
7301 verifyFormat("#define A \\\n"
7302 " void f() { \\\n"
7303 " int i; \\\n"
7304 " }",
7305 getLLVMStyleWithColumns(20));
7306 verifyFormat("#define A \\\n"
7307 " void f() { int i; }",
7308 getLLVMStyleWithColumns(21));
7309 verifyFormat("#define A \\\n"
7310 " void f() { \\\n"
7311 " int i; \\\n"
7312 " } \\\n"
7313 " int j;",
7314 getLLVMStyleWithColumns(22));
7315 verifyFormat("#define A \\\n"
7316 " void f() { int i; } \\\n"
7317 " int j;",
7318 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007319}
7320
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007321TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
7322 FormatStyle MergeEmptyOnly = getLLVMStyle();
7323 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7324 verifyFormat("class C {\n"
7325 " int f() {}\n"
7326 "};",
7327 MergeEmptyOnly);
7328 verifyFormat("class C {\n"
7329 " int f() {\n"
7330 " return 42;\n"
7331 " }\n"
7332 "};",
7333 MergeEmptyOnly);
7334 verifyFormat("int f() {}", MergeEmptyOnly);
7335 verifyFormat("int f() {\n"
7336 " return 42;\n"
7337 "}",
7338 MergeEmptyOnly);
7339
7340 // Also verify behavior when BraceWrapping.AfterFunction = true
7341 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7342 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
7343 verifyFormat("int f() {}", MergeEmptyOnly);
7344 verifyFormat("class C {\n"
7345 " int f() {}\n"
7346 "};",
7347 MergeEmptyOnly);
7348}
7349
Daniel Jasperd74cf402014-04-08 12:46:38 +00007350TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7351 FormatStyle MergeInlineOnly = getLLVMStyle();
7352 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7353 verifyFormat("class C {\n"
7354 " int f() { return 42; }\n"
7355 "};",
7356 MergeInlineOnly);
7357 verifyFormat("int f() {\n"
7358 " return 42;\n"
7359 "}",
7360 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007361
7362 // SFS_Inline implies SFS_Empty
7363 verifyFormat("class C {\n"
7364 " int f() {}\n"
7365 "};",
7366 MergeInlineOnly);
7367 verifyFormat("int f() {}", MergeInlineOnly);
7368
7369 // Also verify behavior when BraceWrapping.AfterFunction = true
7370 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7371 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7372 verifyFormat("class C {\n"
7373 " int f() { return 42; }\n"
7374 "};",
7375 MergeInlineOnly);
7376 verifyFormat("int f()\n"
7377 "{\n"
7378 " return 42;\n"
7379 "}",
7380 MergeInlineOnly);
7381
7382 // SFS_Inline implies SFS_Empty
7383 verifyFormat("int f() {}", MergeInlineOnly);
7384 verifyFormat("class C {\n"
7385 " int f() {}\n"
7386 "};",
7387 MergeInlineOnly);
7388}
7389
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00007390TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
7391 FormatStyle MergeInlineOnly = getLLVMStyle();
7392 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
7393 FormatStyle::SFS_InlineOnly;
7394 verifyFormat("class C {\n"
7395 " int f() { return 42; }\n"
7396 "};",
7397 MergeInlineOnly);
7398 verifyFormat("int f() {\n"
7399 " return 42;\n"
7400 "}",
7401 MergeInlineOnly);
7402
7403 // SFS_InlineOnly does not imply SFS_Empty
7404 verifyFormat("class C {\n"
7405 " int f() {}\n"
7406 "};",
7407 MergeInlineOnly);
7408 verifyFormat("int f() {\n"
7409 "}",
7410 MergeInlineOnly);
7411
7412 // Also verify behavior when BraceWrapping.AfterFunction = true
7413 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7414 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7415 verifyFormat("class C {\n"
7416 " int f() { return 42; }\n"
7417 "};",
7418 MergeInlineOnly);
7419 verifyFormat("int f()\n"
7420 "{\n"
7421 " return 42;\n"
7422 "}",
7423 MergeInlineOnly);
7424
7425 // SFS_InlineOnly does not imply SFS_Empty
7426 verifyFormat("int f()\n"
7427 "{\n"
7428 "}",
7429 MergeInlineOnly);
7430 verifyFormat("class C {\n"
7431 " int f() {}\n"
7432 "};",
7433 MergeInlineOnly);
7434}
7435
Francois Ferrandad722562017-06-30 20:25:55 +00007436TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007437 FormatStyle Style = getLLVMStyle();
7438 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7439 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7440 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00007441 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007442 Style.ColumnLimit = 40;
7443
7444 verifyFormat("int f()\n"
7445 "{}",
7446 Style);
7447 verifyFormat("int f()\n"
7448 "{\n"
7449 " return 42;\n"
7450 "}",
7451 Style);
7452 verifyFormat("int f()\n"
7453 "{\n"
7454 " // some comment\n"
7455 "}",
7456 Style);
7457
7458 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7459 verifyFormat("int f() {}", Style);
7460 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7461 "{}",
7462 Style);
7463 verifyFormat("int f()\n"
7464 "{\n"
7465 " return 0;\n"
7466 "}",
7467 Style);
7468
7469 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7470 verifyFormat("class Foo {\n"
7471 " int f() {}\n"
7472 "};\n",
7473 Style);
7474 verifyFormat("class Foo {\n"
7475 " int f() { return 0; }\n"
7476 "};\n",
7477 Style);
7478 verifyFormat("class Foo {\n"
7479 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7480 " {}\n"
7481 "};\n",
7482 Style);
7483 verifyFormat("class Foo {\n"
7484 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7485 " {\n"
7486 " return 0;\n"
7487 " }\n"
7488 "};\n",
7489 Style);
7490
7491 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7492 verifyFormat("int f() {}", Style);
7493 verifyFormat("int f() { return 0; }", Style);
7494 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7495 "{}",
7496 Style);
7497 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7498 "{\n"
7499 " return 0;\n"
7500 "}",
7501 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00007502}
Krasimir Georgiev6a1c9d52017-10-02 15:53:37 +00007503TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
7504 FormatStyle Style = getLLVMStyle();
7505 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7506 verifyFormat("#ifdef A\n"
7507 "int f() {}\n"
7508 "#else\n"
7509 "int g() {}\n"
7510 "#endif",
7511 Style);
7512}
Daniel Jasperd74cf402014-04-08 12:46:38 +00007513
Francois Ferrandad722562017-06-30 20:25:55 +00007514TEST_F(FormatTest, SplitEmptyClass) {
7515 FormatStyle Style = getLLVMStyle();
7516 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7517 Style.BraceWrapping.AfterClass = true;
7518 Style.BraceWrapping.SplitEmptyRecord = false;
7519
7520 verifyFormat("class Foo\n"
7521 "{};",
7522 Style);
7523 verifyFormat("/* something */ class Foo\n"
7524 "{};",
7525 Style);
7526 verifyFormat("template <typename X> class Foo\n"
7527 "{};",
7528 Style);
7529 verifyFormat("class Foo\n"
7530 "{\n"
7531 " Foo();\n"
7532 "};",
7533 Style);
7534 verifyFormat("typedef class Foo\n"
7535 "{\n"
7536 "} Foo_t;",
7537 Style);
7538}
7539
7540TEST_F(FormatTest, SplitEmptyStruct) {
7541 FormatStyle Style = getLLVMStyle();
7542 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7543 Style.BraceWrapping.AfterStruct = true;
7544 Style.BraceWrapping.SplitEmptyRecord = false;
7545
7546 verifyFormat("struct Foo\n"
7547 "{};",
7548 Style);
7549 verifyFormat("/* something */ struct Foo\n"
7550 "{};",
7551 Style);
7552 verifyFormat("template <typename X> struct Foo\n"
7553 "{};",
7554 Style);
7555 verifyFormat("struct Foo\n"
7556 "{\n"
7557 " Foo();\n"
7558 "};",
7559 Style);
7560 verifyFormat("typedef struct Foo\n"
7561 "{\n"
7562 "} Foo_t;",
7563 Style);
7564 //typedef struct Bar {} Bar_t;
7565}
7566
7567TEST_F(FormatTest, SplitEmptyUnion) {
7568 FormatStyle Style = getLLVMStyle();
7569 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7570 Style.BraceWrapping.AfterUnion = true;
7571 Style.BraceWrapping.SplitEmptyRecord = false;
7572
7573 verifyFormat("union Foo\n"
7574 "{};",
7575 Style);
7576 verifyFormat("/* something */ union Foo\n"
7577 "{};",
7578 Style);
7579 verifyFormat("union Foo\n"
7580 "{\n"
7581 " A,\n"
7582 "};",
7583 Style);
7584 verifyFormat("typedef union Foo\n"
7585 "{\n"
7586 "} Foo_t;",
7587 Style);
7588}
7589
7590TEST_F(FormatTest, SplitEmptyNamespace) {
7591 FormatStyle Style = getLLVMStyle();
7592 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7593 Style.BraceWrapping.AfterNamespace = true;
7594 Style.BraceWrapping.SplitEmptyNamespace = false;
7595
7596 verifyFormat("namespace Foo\n"
7597 "{};",
7598 Style);
7599 verifyFormat("/* something */ namespace Foo\n"
7600 "{};",
7601 Style);
7602 verifyFormat("inline namespace Foo\n"
7603 "{};",
7604 Style);
7605 verifyFormat("namespace Foo\n"
7606 "{\n"
7607 "void Bar();\n"
7608 "};",
7609 Style);
7610}
7611
7612TEST_F(FormatTest, NeverMergeShortRecords) {
7613 FormatStyle Style = getLLVMStyle();
7614
7615 verifyFormat("class Foo {\n"
7616 " Foo();\n"
7617 "};",
7618 Style);
7619 verifyFormat("typedef class Foo {\n"
7620 " Foo();\n"
7621 "} Foo_t;",
7622 Style);
7623 verifyFormat("struct Foo {\n"
7624 " Foo();\n"
7625 "};",
7626 Style);
7627 verifyFormat("typedef struct Foo {\n"
7628 " Foo();\n"
7629 "} Foo_t;",
7630 Style);
7631 verifyFormat("union Foo {\n"
7632 " A,\n"
7633 "};",
7634 Style);
7635 verifyFormat("typedef union Foo {\n"
7636 " A,\n"
7637 "} Foo_t;",
7638 Style);
7639 verifyFormat("namespace Foo {\n"
7640 "void Bar();\n"
7641 "};",
7642 Style);
7643
7644 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7645 Style.BraceWrapping.AfterClass = true;
7646 Style.BraceWrapping.AfterStruct = true;
7647 Style.BraceWrapping.AfterUnion = true;
7648 Style.BraceWrapping.AfterNamespace = true;
7649 verifyFormat("class Foo\n"
7650 "{\n"
7651 " Foo();\n"
7652 "};",
7653 Style);
7654 verifyFormat("typedef class Foo\n"
7655 "{\n"
7656 " Foo();\n"
7657 "} Foo_t;",
7658 Style);
7659 verifyFormat("struct Foo\n"
7660 "{\n"
7661 " Foo();\n"
7662 "};",
7663 Style);
7664 verifyFormat("typedef struct Foo\n"
7665 "{\n"
7666 " Foo();\n"
7667 "} Foo_t;",
7668 Style);
7669 verifyFormat("union Foo\n"
7670 "{\n"
7671 " A,\n"
7672 "};",
7673 Style);
7674 verifyFormat("typedef union Foo\n"
7675 "{\n"
7676 " A,\n"
7677 "} Foo_t;",
7678 Style);
7679 verifyFormat("namespace Foo\n"
7680 "{\n"
7681 "void Bar();\n"
7682 "};",
7683 Style);
7684}
7685
Manuel Klimeke01bab52013-01-15 13:38:33 +00007686TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7687 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007688 verifyFormat("struct foo a = {bar};\nint n;");
7689 verifyFormat("class foo a = {bar};\nint n;");
7690 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007691
7692 // Elaborate types inside function definitions.
7693 verifyFormat("struct foo f() {}\nint n;");
7694 verifyFormat("class foo f() {}\nint n;");
7695 verifyFormat("union foo f() {}\nint n;");
7696
7697 // Templates.
7698 verifyFormat("template <class X> void f() {}\nint n;");
7699 verifyFormat("template <struct X> void f() {}\nint n;");
7700 verifyFormat("template <union X> void f() {}\nint n;");
7701
7702 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007703 verifyFormat("struct {\n} n;");
7704 verifyFormat(
7705 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007706 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007707 verifyFormat("class MACRO Z {\n} n;");
7708 verifyFormat("class MACRO(X) Z {\n} n;");
7709 verifyFormat("class __attribute__(X) Z {\n} n;");
7710 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007711 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007712 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007713 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7714 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007715
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007716 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007717 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007718
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007719 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007720 verifyFormat(
7721 "template <typename F>\n"
7722 "Matcher(const Matcher<F> &Other,\n"
7723 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7724 " !is_same<F, T>::value>::type * = 0)\n"
7725 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7726
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007727 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007728 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007729 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007730
7731 // FIXME:
7732 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007733 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007734
Manuel Klimeke01bab52013-01-15 13:38:33 +00007735 // Elaborate types where incorrectly parsing the structural element would
7736 // break the indent.
7737 verifyFormat("if (true)\n"
7738 " class X x;\n"
7739 "else\n"
7740 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007741
7742 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007743 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007744}
7745
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007746TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007747 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7748 format("#error Leave all white!!!!! space* alone!\n"));
7749 EXPECT_EQ(
7750 "#warning Leave all white!!!!! space* alone!\n",
7751 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007752 EXPECT_EQ("#error 1", format(" # error 1"));
7753 EXPECT_EQ("#warning 1", format(" # warning 1"));
7754}
7755
Daniel Jasper4431aa92013-04-23 13:54:04 +00007756TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007757 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007758 verifyFormat("#if (AAAA && BBBB)");
7759 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007760 // FIXME: Come up with a better indentation for #elif.
7761 verifyFormat(
7762 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7763 " defined(BBBBBBBB)\n"
7764 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7765 " defined(BBBBBBBB)\n"
7766 "#endif",
7767 getLLVMStyleWithColumns(65));
7768}
7769
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007770TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7771 FormatStyle AllowsMergedIf = getGoogleStyle();
7772 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7773 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7774 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007775 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7776 EXPECT_EQ("if (true) return 42;",
7777 format("if (true)\nreturn 42;", AllowsMergedIf));
7778 FormatStyle ShortMergedIf = AllowsMergedIf;
7779 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007780 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007781 " if (true) return 42;",
7782 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007783 verifyFormat("#define A \\\n"
7784 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007785 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007786 "#define B",
7787 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007788 verifyFormat("#define A \\\n"
7789 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007790 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007791 "g();",
7792 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007793 verifyFormat("{\n"
7794 "#ifdef A\n"
7795 " // Comment\n"
7796 " if (true) continue;\n"
7797 "#endif\n"
7798 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007799 " if (true) continue;\n"
7800 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007801 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007802 ShortMergedIf.ColumnLimit = 33;
7803 verifyFormat("#define A \\\n"
7804 " if constexpr (true) return 42;",
7805 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007806 ShortMergedIf.ColumnLimit = 29;
7807 verifyFormat("#define A \\\n"
7808 " if (aaaaaaaaaa) return 1; \\\n"
7809 " return 2;",
7810 ShortMergedIf);
7811 ShortMergedIf.ColumnLimit = 28;
7812 verifyFormat("#define A \\\n"
7813 " if (aaaaaaaaaa) \\\n"
7814 " return 1; \\\n"
7815 " return 2;",
7816 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007817 verifyFormat("#define A \\\n"
7818 " if constexpr (aaaaaaa) \\\n"
7819 " return 1; \\\n"
7820 " return 2;",
7821 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007822}
7823
Manuel Klimekd33516e2013-01-23 10:09:28 +00007824TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007825 verifyFormat("void f(int *a);");
7826 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007827 verifyFormat("class A {\n void f(int *a);\n};");
7828 verifyFormat("class A {\n int *a;\n};");
7829 verifyFormat("namespace a {\n"
7830 "namespace b {\n"
7831 "class A {\n"
7832 " void f() {}\n"
7833 " int *a;\n"
7834 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00007835 "} // namespace b\n"
7836 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007837}
7838
Manuel Klimekd33516e2013-01-23 10:09:28 +00007839TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7840 verifyFormat("while");
7841 verifyFormat("operator");
7842}
7843
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007844TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7845 // This code would be painfully slow to format if we didn't skip it.
7846 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
7847 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7848 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7849 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7850 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7851 "A(1, 1)\n"
7852 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7853 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7854 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7855 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7856 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7857 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7858 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7859 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7860 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7861 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7862 // Deeply nested part is untouched, rest is formatted.
7863 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7864 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00007865 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007866}
7867
Nico Weber7e6a7a12013-01-08 17:56:31 +00007868//===----------------------------------------------------------------------===//
7869// Objective-C tests.
7870//===----------------------------------------------------------------------===//
7871
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007872TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7873 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7874 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7875 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007876 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007877 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7878 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7879 format("-(NSInteger)Method3:(id)anObject;"));
7880 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7881 format("-(NSInteger)Method4:(id)anObject;"));
7882 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7883 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7884 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7885 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007886 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7887 "forAllCells:(BOOL)flag;",
7888 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7889 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007890
7891 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007892 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7893 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007894 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7895 " inRange:(NSRange)range\n"
7896 " outRange:(NSRange)out_range\n"
7897 " outRange1:(NSRange)out_range1\n"
7898 " outRange2:(NSRange)out_range2\n"
7899 " outRange3:(NSRange)out_range3\n"
7900 " outRange4:(NSRange)out_range4\n"
7901 " outRange5:(NSRange)out_range5\n"
7902 " outRange6:(NSRange)out_range6\n"
7903 " outRange7:(NSRange)out_range7\n"
7904 " outRange8:(NSRange)out_range8\n"
7905 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007906
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007907 // When the function name has to be wrapped.
7908 FormatStyle Style = getLLVMStyle();
Ben Hamilton416348e2018-04-12 15:11:48 +00007909 // ObjC ignores IndentWrappedFunctionNames when wrapping methods
7910 // and always indents instead.
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007911 Style.IndentWrappedFunctionNames = false;
7912 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
Ben Hamilton416348e2018-04-12 15:11:48 +00007913 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7914 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007915 "}",
7916 Style);
7917 Style.IndentWrappedFunctionNames = true;
7918 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
Ben Hamilton416348e2018-04-12 15:11:48 +00007919 " veryLooooooooooongName:(NSString)cccccccccccccc\n"
7920 " anotherName:(NSString)dddddddddddddd {\n"
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007921 "}",
7922 Style);
7923
Nico Weberd6f962f2013-01-10 20:18:33 +00007924 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007925 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007926 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7927 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007928 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007929
Daniel Jasper37194282013-05-28 08:33:00 +00007930 verifyFormat("- (int (*)())foo:(int (*)())f;");
7931 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007932
7933 // If there's no return type (very rare in practice!), LLVM and Google style
7934 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007935 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007936 verifyFormat("- foo:(int)f;");
7937 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007938}
7939
Nico Weber0588b502013-02-07 00:19:29 +00007940
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007941TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007942 EXPECT_EQ("\"some text \"\n"
7943 "\"other\";",
7944 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007945 EXPECT_EQ("\"some text \"\n"
7946 "\"other\";",
7947 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007948 EXPECT_EQ(
7949 "#define A \\\n"
7950 " \"some \" \\\n"
7951 " \"text \" \\\n"
7952 " \"other\";",
7953 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7954 EXPECT_EQ(
7955 "#define A \\\n"
7956 " \"so \" \\\n"
7957 " \"text \" \\\n"
7958 " \"other\";",
7959 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7960
7961 EXPECT_EQ("\"some text\"",
7962 format("\"some text\"", getLLVMStyleWithColumns(1)));
7963 EXPECT_EQ("\"some text\"",
7964 format("\"some text\"", getLLVMStyleWithColumns(11)));
7965 EXPECT_EQ("\"some \"\n"
7966 "\"text\"",
7967 format("\"some text\"", getLLVMStyleWithColumns(10)));
7968 EXPECT_EQ("\"some \"\n"
7969 "\"text\"",
7970 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007971 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007972 "\" tex\"\n"
7973 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007974 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007975 EXPECT_EQ("\"some\"\n"
7976 "\" tex\"\n"
7977 "\" and\"",
7978 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7979 EXPECT_EQ("\"some\"\n"
7980 "\"/tex\"\n"
7981 "\"/and\"",
7982 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007983
7984 EXPECT_EQ("variable =\n"
7985 " \"long string \"\n"
7986 " \"literal\";",
7987 format("variable = \"long string literal\";",
7988 getLLVMStyleWithColumns(20)));
7989
7990 EXPECT_EQ("variable = f(\n"
7991 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007992 " \"literal\",\n"
7993 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007994 " loooooooooooooooooooong);",
7995 format("variable = f(\"long string literal\", short, "
7996 "loooooooooooooooooooong);",
7997 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007998
Daniel Jaspera44991332015-04-29 13:06:49 +00007999 EXPECT_EQ(
8000 "f(g(\"long string \"\n"
8001 " \"literal\"),\n"
8002 " b);",
8003 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008004 EXPECT_EQ("f(g(\"long string \"\n"
8005 " \"literal\",\n"
8006 " a),\n"
8007 " b);",
8008 format("f(g(\"long string literal\", a), b);",
8009 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008010 EXPECT_EQ(
8011 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00008012 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008013 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8014 EXPECT_EQ("f(\"one two three four five six \"\n"
8015 " \"seven\".split(\n"
8016 " really_looooong_variable));",
8017 format("f(\"one two three four five six seven\"."
8018 "split(really_looooong_variable));",
8019 getLLVMStyleWithColumns(33)));
8020
8021 EXPECT_EQ("f(\"some \"\n"
8022 " \"text\",\n"
8023 " other);",
8024 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008025
8026 // Only break as a last resort.
8027 verifyFormat(
8028 "aaaaaaaaaaaaaaaaaaaa(\n"
8029 " aaaaaaaaaaaaaaaaaaaa,\n"
8030 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008031
Daniel Jaspera44991332015-04-29 13:06:49 +00008032 EXPECT_EQ("\"splitmea\"\n"
8033 "\"trandomp\"\n"
8034 "\"oint\"",
8035 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008036
Daniel Jaspera44991332015-04-29 13:06:49 +00008037 EXPECT_EQ("\"split/\"\n"
8038 "\"pathat/\"\n"
8039 "\"slashes\"",
8040 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008041
Daniel Jaspera44991332015-04-29 13:06:49 +00008042 EXPECT_EQ("\"split/\"\n"
8043 "\"pathat/\"\n"
8044 "\"slashes\"",
8045 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008046 EXPECT_EQ("\"split at \"\n"
8047 "\"spaces/at/\"\n"
8048 "\"slashes.at.any$\"\n"
8049 "\"non-alphanumeric%\"\n"
8050 "\"1111111111characte\"\n"
8051 "\"rs\"",
8052 format("\"split at "
8053 "spaces/at/"
8054 "slashes.at."
8055 "any$non-"
8056 "alphanumeric%"
8057 "1111111111characte"
8058 "rs\"",
8059 getLLVMStyleWithColumns(20)));
8060
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008061 // Verify that splitting the strings understands
8062 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008063 EXPECT_EQ(
8064 "aaaaaaaaaaaa(\n"
8065 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8066 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8067 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8068 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8069 "aaaaaaaaaaaaaaaaaaaaaa\");",
8070 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008071 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8072 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8073 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8074 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8075 "aaaaaaaaaaaaaaaaaaaaaa\";",
8076 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008077 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8078 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8079 format("llvm::outs() << "
8080 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8081 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008082 EXPECT_EQ("ffff(\n"
8083 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8084 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8085 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8086 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8087 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008088
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008089 FormatStyle Style = getLLVMStyleWithColumns(12);
8090 Style.BreakStringLiterals = false;
8091 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8092
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008093 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008094 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00008095 EXPECT_EQ("#define A \\\n"
8096 " \"some \" \\\n"
8097 " \"text \" \\\n"
8098 " \"other\";",
8099 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008100}
8101
Manuel Klimek93699f42017-11-29 14:29:43 +00008102TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
8103 EXPECT_EQ("C a = \"some more \"\n"
8104 " \"text\";",
8105 format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
8106}
8107
Manuel Klimek9e321992015-07-28 15:50:24 +00008108TEST_F(FormatTest, FullyRemoveEmptyLines) {
8109 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8110 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8111 EXPECT_EQ("int i = a(b());",
8112 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8113}
8114
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008115TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8116 EXPECT_EQ(
8117 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8118 "(\n"
8119 " \"x\t\");",
8120 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8121 "aaaaaaa("
8122 "\"x\t\");"));
8123}
8124
Daniel Jasper174b0122014-01-09 14:18:12 +00008125TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008126 EXPECT_EQ(
8127 "u8\"utf8 string \"\n"
8128 "u8\"literal\";",
8129 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8130 EXPECT_EQ(
8131 "u\"utf16 string \"\n"
8132 "u\"literal\";",
8133 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8134 EXPECT_EQ(
8135 "U\"utf32 string \"\n"
8136 "U\"literal\";",
8137 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8138 EXPECT_EQ("L\"wide string \"\n"
8139 "L\"literal\";",
8140 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008141 EXPECT_EQ("@\"NSString \"\n"
8142 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008143 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00008144 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008145
8146 // This input makes clang-format try to split the incomplete unicode escape
8147 // sequence, which used to lead to a crasher.
8148 verifyNoCrash(
8149 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8150 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008151}
8152
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008153TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8154 FormatStyle Style = getGoogleStyleWithColumns(15);
8155 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8156 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8157 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8158 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8159 EXPECT_EQ("u8R\"x(raw literal)x\";",
8160 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008161}
8162
8163TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8164 FormatStyle Style = getLLVMStyleWithColumns(20);
8165 EXPECT_EQ(
8166 "_T(\"aaaaaaaaaaaaaa\")\n"
8167 "_T(\"aaaaaaaaaaaaaa\")\n"
8168 "_T(\"aaaaaaaaaaaa\")",
8169 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00008170 EXPECT_EQ("f(x,\n"
8171 " _T(\"aaaaaaaaaaaa\")\n"
8172 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00008173 " z);",
8174 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8175
8176 // FIXME: Handle embedded spaces in one iteration.
8177 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8178 // "_T(\"aaaaaaaaaaaaa\")\n"
8179 // "_T(\"aaaaaaaaaaaaa\")\n"
8180 // "_T(\"a\")",
8181 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8182 // getLLVMStyleWithColumns(20)));
8183 EXPECT_EQ(
8184 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8185 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008186 EXPECT_EQ("f(\n"
8187 "#if !TEST\n"
8188 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8189 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00008190 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008191 format("f(\n"
8192 "#if !TEST\n"
8193 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8194 "#endif\n"
8195 ");"));
8196 EXPECT_EQ("f(\n"
8197 "\n"
8198 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8199 format("f(\n"
8200 "\n"
8201 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008202}
8203
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00008204TEST_F(FormatTest, BreaksStringLiteralOperands) {
8205 // In a function call with two operands, the second can be broken with no line
8206 // break before it.
8207 EXPECT_EQ("func(a, \"long long \"\n"
8208 " \"long long\");",
8209 format("func(a, \"long long long long\");",
8210 getLLVMStyleWithColumns(24)));
8211 // In a function call with three operands, the second must be broken with a
8212 // line break before it.
8213 EXPECT_EQ("func(a,\n"
8214 " \"long long long \"\n"
8215 " \"long\",\n"
8216 " c);",
8217 format("func(a, \"long long long long\", c);",
8218 getLLVMStyleWithColumns(24)));
8219 // In a function call with three operands, the third must be broken with a
8220 // line break before it.
8221 EXPECT_EQ("func(a, b,\n"
8222 " \"long long long \"\n"
8223 " \"long\");",
8224 format("func(a, b, \"long long long long\");",
8225 getLLVMStyleWithColumns(24)));
8226 // In a function call with three operands, both the second and the third must
8227 // be broken with a line break before them.
8228 EXPECT_EQ("func(a,\n"
8229 " \"long long long \"\n"
8230 " \"long\",\n"
8231 " \"long long long \"\n"
8232 " \"long\");",
8233 format("func(a, \"long long long long\", \"long long long long\");",
8234 getLLVMStyleWithColumns(24)));
8235 // In a chain of << with two operands, the second can be broken with no line
8236 // break before it.
8237 EXPECT_EQ("a << \"line line \"\n"
8238 " \"line\";",
8239 format("a << \"line line line\";",
8240 getLLVMStyleWithColumns(20)));
8241 // In a chain of << with three operands, the second can be broken with no line
8242 // break before it.
8243 EXPECT_EQ("abcde << \"line \"\n"
8244 " \"line line\"\n"
8245 " << c;",
8246 format("abcde << \"line line line\" << c;",
8247 getLLVMStyleWithColumns(20)));
8248 // In a chain of << with three operands, the third must be broken with a line
8249 // break before it.
8250 EXPECT_EQ("a << b\n"
8251 " << \"line line \"\n"
8252 " \"line\";",
8253 format("a << b << \"line line line\";",
8254 getLLVMStyleWithColumns(20)));
8255 // In a chain of << with three operands, the second can be broken with no line
8256 // break before it and the third must be broken with a line break before it.
8257 EXPECT_EQ("abcd << \"line line \"\n"
8258 " \"line\"\n"
8259 " << \"line line \"\n"
8260 " \"line\";",
8261 format("abcd << \"line line line\" << \"line line line\";",
8262 getLLVMStyleWithColumns(20)));
8263 // In a chain of binary operators with two operands, the second can be broken
8264 // with no line break before it.
8265 EXPECT_EQ("abcd + \"line line \"\n"
8266 " \"line line\";",
8267 format("abcd + \"line line line line\";",
8268 getLLVMStyleWithColumns(20)));
8269 // In a chain of binary operators with three operands, the second must be
8270 // broken with a line break before it.
8271 EXPECT_EQ("abcd +\n"
8272 " \"line line \"\n"
8273 " \"line line\" +\n"
8274 " e;",
8275 format("abcd + \"line line line line\" + e;",
8276 getLLVMStyleWithColumns(20)));
8277 // In a function call with two operands, with AlignAfterOpenBracket enabled,
8278 // the first must be broken with a line break before it.
8279 FormatStyle Style = getLLVMStyleWithColumns(25);
8280 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8281 EXPECT_EQ("someFunction(\n"
8282 " \"long long long \"\n"
8283 " \"long\",\n"
8284 " a);",
8285 format("someFunction(\"long long long long\", a);", Style));
8286}
8287
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008288TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008289 EXPECT_EQ(
8290 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8292 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8293 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8294 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8295 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8296}
8297
8298TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8299 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008300 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008301 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8302 "multiline raw string literal xxxxxxxxxxxxxx\n"
8303 ")x\",\n"
8304 " a),\n"
8305 " b);",
8306 format("fffffffffff(g(R\"x(\n"
8307 "multiline raw string literal xxxxxxxxxxxxxx\n"
8308 ")x\", a), b);",
8309 getGoogleStyleWithColumns(20)));
8310 EXPECT_EQ("fffffffffff(\n"
8311 " g(R\"x(qqq\n"
8312 "multiline raw string literal xxxxxxxxxxxxxx\n"
8313 ")x\",\n"
8314 " a),\n"
8315 " b);",
8316 format("fffffffffff(g(R\"x(qqq\n"
8317 "multiline raw string literal xxxxxxxxxxxxxx\n"
8318 ")x\", a), b);",
8319 getGoogleStyleWithColumns(20)));
8320
8321 EXPECT_EQ("fffffffffff(R\"x(\n"
8322 "multiline raw string literal xxxxxxxxxxxxxx\n"
8323 ")x\");",
8324 format("fffffffffff(R\"x(\n"
8325 "multiline raw string literal xxxxxxxxxxxxxx\n"
8326 ")x\");",
8327 getGoogleStyleWithColumns(20)));
8328 EXPECT_EQ("fffffffffff(R\"x(\n"
8329 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008330 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008331 format("fffffffffff(R\"x(\n"
8332 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008333 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008334 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008335 EXPECT_EQ("fffffffffff(\n"
8336 " R\"x(\n"
8337 "multiline raw string literal xxxxxxxxxxxxxx\n"
8338 ")x\" +\n"
8339 " bbbbbb);",
8340 format("fffffffffff(\n"
8341 " R\"x(\n"
8342 "multiline raw string literal xxxxxxxxxxxxxx\n"
8343 ")x\" + bbbbbb);",
8344 getGoogleStyleWithColumns(20)));
Daniel Jasperfd327672018-03-22 14:43:54 +00008345 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
8346 format("fffffffffff(\n"
8347 " R\"(single line raw string)\" + bbbbbb);"));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008348}
8349
Alexander Kornienkobe633902013-06-14 11:46:10 +00008350TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008351 verifyFormat("string a = \"unterminated;");
8352 EXPECT_EQ("function(\"unterminated,\n"
8353 " OtherParameter);",
8354 format("function( \"unterminated,\n"
8355 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008356}
8357
8358TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008359 FormatStyle Style = getLLVMStyle();
8360 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008361 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008362 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008363}
8364
Daniel Jaspera44991332015-04-29 13:06:49 +00008365TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008366
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008367TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8368 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8369 " \"ddeeefff\");",
8370 format("someFunction(\"aaabbbcccdddeeefff\");",
8371 getLLVMStyleWithColumns(25)));
8372 EXPECT_EQ("someFunction1234567890(\n"
8373 " \"aaabbbcccdddeeefff\");",
8374 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8375 getLLVMStyleWithColumns(26)));
8376 EXPECT_EQ("someFunction1234567890(\n"
8377 " \"aaabbbcccdddeeeff\"\n"
8378 " \"f\");",
8379 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8380 getLLVMStyleWithColumns(25)));
8381 EXPECT_EQ("someFunction1234567890(\n"
8382 " \"aaabbbcccdddeeeff\"\n"
8383 " \"f\");",
8384 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8385 getLLVMStyleWithColumns(24)));
Manuel Klimek77866142017-11-17 11:17:15 +00008386 EXPECT_EQ("someFunction(\n"
8387 " \"aaabbbcc ddde \"\n"
8388 " \"efff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008389 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008390 getLLVMStyleWithColumns(25)));
8391 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8392 " \"ddeeefff\");",
8393 format("someFunction(\"aaabbbccc ddeeefff\");",
8394 getLLVMStyleWithColumns(25)));
8395 EXPECT_EQ("someFunction1234567890(\n"
8396 " \"aaabb \"\n"
8397 " \"cccdddeeefff\");",
8398 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8399 getLLVMStyleWithColumns(25)));
8400 EXPECT_EQ("#define A \\\n"
8401 " string s = \\\n"
8402 " \"123456789\" \\\n"
8403 " \"0\"; \\\n"
8404 " int i;",
8405 format("#define A string s = \"1234567890\"; int i;",
8406 getLLVMStyleWithColumns(20)));
Manuel Klimek77866142017-11-17 11:17:15 +00008407 EXPECT_EQ("someFunction(\n"
8408 " \"aaabbbcc \"\n"
8409 " \"dddeeefff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008410 format("someFunction(\"aaabbbcc dddeeefff\");",
8411 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008412}
8413
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008414TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008415 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8416 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008417 EXPECT_EQ("\"test\"\n"
8418 "\"\\n\"",
8419 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8420 EXPECT_EQ("\"tes\\\\\"\n"
8421 "\"n\"",
8422 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8423 EXPECT_EQ("\"\\\\\\\\\"\n"
8424 "\"\\n\"",
8425 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008426 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008427 EXPECT_EQ("\"\\uff01\"\n"
8428 "\"test\"",
8429 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8430 EXPECT_EQ("\"\\Uff01ff02\"",
8431 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8432 EXPECT_EQ("\"\\x000000000001\"\n"
8433 "\"next\"",
8434 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8435 EXPECT_EQ("\"\\x000000000001next\"",
8436 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8437 EXPECT_EQ("\"\\x000000000001\"",
8438 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8439 EXPECT_EQ("\"test\"\n"
8440 "\"\\000000\"\n"
8441 "\"000001\"",
8442 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8443 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008444 "\"00000000\"\n"
8445 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008446 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008447}
8448
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008449TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8450 verifyFormat("void f() {\n"
8451 " return g() {}\n"
8452 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008453 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008454 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008455 "}");
8456}
8457
Manuel Klimek421147e2014-01-24 09:25:23 +00008458TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8459 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008460 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008461}
8462
Manuel Klimek13b97d82013-05-13 08:42:42 +00008463TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8464 verifyFormat("class X {\n"
8465 " void f() {\n"
8466 " }\n"
8467 "};",
8468 getLLVMStyleWithColumns(12));
8469}
8470
8471TEST_F(FormatTest, ConfigurableIndentWidth) {
8472 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8473 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008474 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008475 verifyFormat("void f() {\n"
8476 " someFunction();\n"
8477 " if (true) {\n"
8478 " f();\n"
8479 " }\n"
8480 "}",
8481 EightIndent);
8482 verifyFormat("class X {\n"
8483 " void f() {\n"
8484 " }\n"
8485 "};",
8486 EightIndent);
8487 verifyFormat("int x[] = {\n"
8488 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008489 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008490 EightIndent);
8491}
8492
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008493TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008494 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008495 "f();",
8496 getLLVMStyleWithColumns(8));
8497}
8498
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008499TEST_F(FormatTest, ConfigurableUseOfTab) {
8500 FormatStyle Tab = getLLVMStyleWithColumns(42);
8501 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008502 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008503 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008504
8505 EXPECT_EQ("if (aaaaaaaa && // q\n"
8506 " bb)\t\t// w\n"
8507 "\t;",
8508 format("if (aaaaaaaa &&// q\n"
8509 "bb)// w\n"
8510 ";",
8511 Tab));
8512 EXPECT_EQ("if (aaa && bbb) // w\n"
8513 "\t;",
8514 format("if(aaa&&bbb)// w\n"
8515 ";",
8516 Tab));
8517
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008518 verifyFormat("class X {\n"
8519 "\tvoid f() {\n"
8520 "\t\tsomeFunction(parameter1,\n"
8521 "\t\t\t parameter2);\n"
8522 "\t}\n"
8523 "};",
8524 Tab);
8525 verifyFormat("#define A \\\n"
8526 "\tvoid f() { \\\n"
8527 "\t\tsomeFunction( \\\n"
8528 "\t\t parameter1, \\\n"
8529 "\t\t parameter2); \\\n"
8530 "\t}",
8531 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008532
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008533 Tab.TabWidth = 4;
8534 Tab.IndentWidth = 8;
8535 verifyFormat("class TabWidth4Indent8 {\n"
8536 "\t\tvoid f() {\n"
8537 "\t\t\t\tsomeFunction(parameter1,\n"
8538 "\t\t\t\t\t\t\t parameter2);\n"
8539 "\t\t}\n"
8540 "};",
8541 Tab);
8542
8543 Tab.TabWidth = 4;
8544 Tab.IndentWidth = 4;
8545 verifyFormat("class TabWidth4Indent4 {\n"
8546 "\tvoid f() {\n"
8547 "\t\tsomeFunction(parameter1,\n"
8548 "\t\t\t\t\t parameter2);\n"
8549 "\t}\n"
8550 "};",
8551 Tab);
8552
8553 Tab.TabWidth = 8;
8554 Tab.IndentWidth = 4;
8555 verifyFormat("class TabWidth8Indent4 {\n"
8556 " void f() {\n"
8557 "\tsomeFunction(parameter1,\n"
8558 "\t\t parameter2);\n"
8559 " }\n"
8560 "};",
8561 Tab);
8562
Alexander Kornienko39856b72013-09-10 09:38:25 +00008563 Tab.TabWidth = 8;
8564 Tab.IndentWidth = 8;
8565 EXPECT_EQ("/*\n"
8566 "\t a\t\tcomment\n"
8567 "\t in multiple lines\n"
8568 " */",
8569 format(" /*\t \t \n"
8570 " \t \t a\t\tcomment\t \t\n"
8571 " \t \t in multiple lines\t\n"
8572 " \t */",
8573 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008574
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008575 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008576 verifyFormat("{\n"
8577 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8578 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8579 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8580 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8581 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8582 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008583 "};",
8584 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008585 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008586 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008587 "\ta2,\n"
8588 "\ta3\n"
8589 "};",
8590 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008591 EXPECT_EQ("if (aaaaaaaa && // q\n"
8592 " bb) // w\n"
8593 "\t;",
8594 format("if (aaaaaaaa &&// q\n"
8595 "bb)// w\n"
8596 ";",
8597 Tab));
8598 verifyFormat("class X {\n"
8599 "\tvoid f() {\n"
8600 "\t\tsomeFunction(parameter1,\n"
8601 "\t\t parameter2);\n"
8602 "\t}\n"
8603 "};",
8604 Tab);
8605 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008606 "\tQ(\n"
8607 "\t {\n"
8608 "\t\t int a;\n"
8609 "\t\t someFunction(aaaaaaaa,\n"
8610 "\t\t bbbbbbb);\n"
8611 "\t },\n"
8612 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008613 "}",
8614 Tab);
8615 EXPECT_EQ("{\n"
8616 "\t/* aaaa\n"
8617 "\t bbbb */\n"
8618 "}",
8619 format("{\n"
8620 "/* aaaa\n"
8621 " bbbb */\n"
8622 "}",
8623 Tab));
8624 EXPECT_EQ("{\n"
8625 "\t/*\n"
8626 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8627 "\t bbbbbbbbbbbbb\n"
8628 "\t*/\n"
8629 "}",
8630 format("{\n"
8631 "/*\n"
8632 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8633 "*/\n"
8634 "}",
8635 Tab));
8636 EXPECT_EQ("{\n"
8637 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8638 "\t// bbbbbbbbbbbbb\n"
8639 "}",
8640 format("{\n"
8641 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8642 "}",
8643 Tab));
8644 EXPECT_EQ("{\n"
8645 "\t/*\n"
8646 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8647 "\t bbbbbbbbbbbbb\n"
8648 "\t*/\n"
8649 "}",
8650 format("{\n"
8651 "\t/*\n"
8652 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8653 "\t*/\n"
8654 "}",
8655 Tab));
8656 EXPECT_EQ("{\n"
8657 "\t/*\n"
8658 "\n"
8659 "\t*/\n"
8660 "}",
8661 format("{\n"
8662 "\t/*\n"
8663 "\n"
8664 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008665 "}",
8666 Tab));
8667 EXPECT_EQ("{\n"
8668 "\t/*\n"
8669 " asdf\n"
8670 "\t*/\n"
8671 "}",
8672 format("{\n"
8673 "\t/*\n"
8674 " asdf\n"
8675 "\t*/\n"
8676 "}",
8677 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008678
8679 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008680 EXPECT_EQ("/*\n"
8681 " a\t\tcomment\n"
8682 " in multiple lines\n"
8683 " */",
8684 format(" /*\t \t \n"
8685 " \t \t a\t\tcomment\t \t\n"
8686 " \t \t in multiple lines\t\n"
8687 " \t */",
8688 Tab));
8689 EXPECT_EQ("/* some\n"
8690 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008691 format(" \t \t /* some\n"
8692 " \t \t comment */",
8693 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008694 EXPECT_EQ("int a; /* some\n"
8695 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008696 format(" \t \t int a; /* some\n"
8697 " \t \t comment */",
8698 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008699
Alexander Kornienko39856b72013-09-10 09:38:25 +00008700 EXPECT_EQ("int a; /* some\n"
8701 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008702 format(" \t \t int\ta; /* some\n"
8703 " \t \t comment */",
8704 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008705 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8706 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008707 format(" \t \t f(\"\t\t\"); /* some\n"
8708 " \t \t comment */",
8709 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008710 EXPECT_EQ("{\n"
8711 " /*\n"
8712 " * Comment\n"
8713 " */\n"
8714 " int i;\n"
8715 "}",
8716 format("{\n"
8717 "\t/*\n"
8718 "\t * Comment\n"
8719 "\t */\n"
8720 "\t int i;\n"
8721 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008722
8723 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8724 Tab.TabWidth = 8;
8725 Tab.IndentWidth = 8;
8726 EXPECT_EQ("if (aaaaaaaa && // q\n"
8727 " bb) // w\n"
8728 "\t;",
8729 format("if (aaaaaaaa &&// q\n"
8730 "bb)// w\n"
8731 ";",
8732 Tab));
8733 EXPECT_EQ("if (aaa && bbb) // w\n"
8734 "\t;",
8735 format("if(aaa&&bbb)// w\n"
8736 ";",
8737 Tab));
8738 verifyFormat("class X {\n"
8739 "\tvoid f() {\n"
8740 "\t\tsomeFunction(parameter1,\n"
8741 "\t\t\t parameter2);\n"
8742 "\t}\n"
8743 "};",
8744 Tab);
8745 verifyFormat("#define A \\\n"
8746 "\tvoid f() { \\\n"
8747 "\t\tsomeFunction( \\\n"
8748 "\t\t parameter1, \\\n"
8749 "\t\t parameter2); \\\n"
8750 "\t}",
8751 Tab);
8752 Tab.TabWidth = 4;
8753 Tab.IndentWidth = 8;
8754 verifyFormat("class TabWidth4Indent8 {\n"
8755 "\t\tvoid f() {\n"
8756 "\t\t\t\tsomeFunction(parameter1,\n"
8757 "\t\t\t\t\t\t\t parameter2);\n"
8758 "\t\t}\n"
8759 "};",
8760 Tab);
8761 Tab.TabWidth = 4;
8762 Tab.IndentWidth = 4;
8763 verifyFormat("class TabWidth4Indent4 {\n"
8764 "\tvoid f() {\n"
8765 "\t\tsomeFunction(parameter1,\n"
8766 "\t\t\t\t\t parameter2);\n"
8767 "\t}\n"
8768 "};",
8769 Tab);
8770 Tab.TabWidth = 8;
8771 Tab.IndentWidth = 4;
8772 verifyFormat("class TabWidth8Indent4 {\n"
8773 " void f() {\n"
8774 "\tsomeFunction(parameter1,\n"
8775 "\t\t parameter2);\n"
8776 " }\n"
8777 "};",
8778 Tab);
8779 Tab.TabWidth = 8;
8780 Tab.IndentWidth = 8;
8781 EXPECT_EQ("/*\n"
8782 "\t a\t\tcomment\n"
8783 "\t in multiple lines\n"
8784 " */",
8785 format(" /*\t \t \n"
8786 " \t \t a\t\tcomment\t \t\n"
8787 " \t \t in multiple lines\t\n"
8788 " \t */",
8789 Tab));
8790 verifyFormat("{\n"
8791 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8792 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8793 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8794 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8795 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8796 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8797 "};",
8798 Tab);
8799 verifyFormat("enum AA {\n"
8800 "\ta1, // Force multiple lines\n"
8801 "\ta2,\n"
8802 "\ta3\n"
8803 "};",
8804 Tab);
8805 EXPECT_EQ("if (aaaaaaaa && // q\n"
8806 " bb) // w\n"
8807 "\t;",
8808 format("if (aaaaaaaa &&// q\n"
8809 "bb)// w\n"
8810 ";",
8811 Tab));
8812 verifyFormat("class X {\n"
8813 "\tvoid f() {\n"
8814 "\t\tsomeFunction(parameter1,\n"
8815 "\t\t\t parameter2);\n"
8816 "\t}\n"
8817 "};",
8818 Tab);
8819 verifyFormat("{\n"
8820 "\tQ(\n"
8821 "\t {\n"
8822 "\t\t int a;\n"
8823 "\t\t someFunction(aaaaaaaa,\n"
8824 "\t\t\t\t bbbbbbb);\n"
8825 "\t },\n"
8826 "\t p);\n"
8827 "}",
8828 Tab);
8829 EXPECT_EQ("{\n"
8830 "\t/* aaaa\n"
8831 "\t bbbb */\n"
8832 "}",
8833 format("{\n"
8834 "/* aaaa\n"
8835 " bbbb */\n"
8836 "}",
8837 Tab));
8838 EXPECT_EQ("{\n"
8839 "\t/*\n"
8840 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8841 "\t bbbbbbbbbbbbb\n"
8842 "\t*/\n"
8843 "}",
8844 format("{\n"
8845 "/*\n"
8846 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8847 "*/\n"
8848 "}",
8849 Tab));
8850 EXPECT_EQ("{\n"
8851 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8852 "\t// bbbbbbbbbbbbb\n"
8853 "}",
8854 format("{\n"
8855 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8856 "}",
8857 Tab));
8858 EXPECT_EQ("{\n"
8859 "\t/*\n"
8860 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8861 "\t bbbbbbbbbbbbb\n"
8862 "\t*/\n"
8863 "}",
8864 format("{\n"
8865 "\t/*\n"
8866 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8867 "\t*/\n"
8868 "}",
8869 Tab));
8870 EXPECT_EQ("{\n"
8871 "\t/*\n"
8872 "\n"
8873 "\t*/\n"
8874 "}",
8875 format("{\n"
8876 "\t/*\n"
8877 "\n"
8878 "\t*/\n"
8879 "}",
8880 Tab));
8881 EXPECT_EQ("{\n"
8882 "\t/*\n"
8883 " asdf\n"
8884 "\t*/\n"
8885 "}",
8886 format("{\n"
8887 "\t/*\n"
8888 " asdf\n"
8889 "\t*/\n"
8890 "}",
8891 Tab));
8892 EXPECT_EQ("/*\n"
8893 "\t a\t\tcomment\n"
8894 "\t in multiple lines\n"
8895 " */",
8896 format(" /*\t \t \n"
8897 " \t \t a\t\tcomment\t \t\n"
8898 " \t \t in multiple lines\t\n"
8899 " \t */",
8900 Tab));
8901 EXPECT_EQ("/* some\n"
8902 " comment */",
8903 format(" \t \t /* some\n"
8904 " \t \t comment */",
8905 Tab));
8906 EXPECT_EQ("int a; /* some\n"
8907 " comment */",
8908 format(" \t \t int a; /* some\n"
8909 " \t \t comment */",
8910 Tab));
8911 EXPECT_EQ("int a; /* some\n"
8912 "comment */",
8913 format(" \t \t int\ta; /* some\n"
8914 " \t \t comment */",
8915 Tab));
8916 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8917 " comment */",
8918 format(" \t \t f(\"\t\t\"); /* some\n"
8919 " \t \t comment */",
8920 Tab));
8921 EXPECT_EQ("{\n"
8922 " /*\n"
8923 " * Comment\n"
8924 " */\n"
8925 " int i;\n"
8926 "}",
8927 format("{\n"
8928 "\t/*\n"
8929 "\t * Comment\n"
8930 "\t */\n"
8931 "\t int i;\n"
8932 "}"));
8933 Tab.AlignConsecutiveAssignments = true;
8934 Tab.AlignConsecutiveDeclarations = true;
8935 Tab.TabWidth = 4;
8936 Tab.IndentWidth = 4;
8937 verifyFormat("class Assign {\n"
8938 "\tvoid f() {\n"
8939 "\t\tint x = 123;\n"
8940 "\t\tint random = 4;\n"
8941 "\t\tstd::string alphabet =\n"
8942 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8943 "\t}\n"
8944 "};",
8945 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008946}
8947
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008948TEST_F(FormatTest, CalculatesOriginalColumn) {
8949 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8950 "q\"; /* some\n"
8951 " comment */",
8952 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8953 "q\"; /* some\n"
8954 " comment */",
8955 getLLVMStyle()));
8956 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8957 "/* some\n"
8958 " comment */",
8959 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8960 " /* some\n"
8961 " comment */",
8962 getLLVMStyle()));
8963 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8964 "qqq\n"
8965 "/* some\n"
8966 " comment */",
8967 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8968 "qqq\n"
8969 " /* some\n"
8970 " comment */",
8971 getLLVMStyle()));
8972 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8973 "wwww; /* some\n"
8974 " comment */",
8975 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8976 "wwww; /* some\n"
8977 " comment */",
8978 getLLVMStyle()));
8979}
8980
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008981TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008982 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008983 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008984
8985 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008986 " continue;",
8987 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008988 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008989 " continue;",
8990 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008991 verifyFormat("if(true)\n"
8992 " f();\n"
8993 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008994 " f();",
8995 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008996 verifyFormat("do {\n"
8997 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008998 "} while(something());",
8999 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009000 verifyFormat("switch(x) {\n"
9001 "default:\n"
9002 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009003 "}",
9004 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00009005 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00009006 verifyFormat("size_t x = sizeof(x);", NoSpace);
9007 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
9008 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
9009 verifyFormat("alignas(128) char a[128];", NoSpace);
9010 verifyFormat("size_t x = alignof(MyType);", NoSpace);
9011 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
9012 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009013 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009014 verifyFormat("T A::operator()();", NoSpace);
9015 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009016
9017 FormatStyle Space = getLLVMStyle();
9018 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
9019
9020 verifyFormat("int f ();", Space);
9021 verifyFormat("void f (int a, T b) {\n"
9022 " while (true)\n"
9023 " continue;\n"
9024 "}",
9025 Space);
9026 verifyFormat("if (true)\n"
9027 " f ();\n"
9028 "else if (true)\n"
9029 " f ();",
9030 Space);
9031 verifyFormat("do {\n"
9032 " do_something ();\n"
9033 "} while (something ());",
9034 Space);
9035 verifyFormat("switch (x) {\n"
9036 "default:\n"
9037 " break;\n"
9038 "}",
9039 Space);
9040 verifyFormat("A::A () : a (1) {}", Space);
9041 verifyFormat("void f () __attribute__ ((asdf));", Space);
9042 verifyFormat("*(&a + 1);\n"
9043 "&((&a)[1]);\n"
9044 "a[(b + c) * d];\n"
9045 "(((a + 1) * 2) + 3) * 4;",
9046 Space);
9047 verifyFormat("#define A(x) x", Space);
9048 verifyFormat("#define A (x) x", Space);
9049 verifyFormat("#if defined(x)\n"
9050 "#endif",
9051 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00009052 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00009053 verifyFormat("size_t x = sizeof (x);", Space);
9054 verifyFormat("auto f (int x) -> decltype (x);", Space);
9055 verifyFormat("int f (T x) noexcept (x.create ());", Space);
9056 verifyFormat("alignas (128) char a[128];", Space);
9057 verifyFormat("size_t x = alignof (MyType);", Space);
9058 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
9059 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009060 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009061 verifyFormat("T A::operator() ();", Space);
9062 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009063}
9064
9065TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
9066 FormatStyle Spaces = getLLVMStyle();
9067
9068 Spaces.SpacesInParentheses = true;
Daniel Jasperd5e9ff42018-03-22 14:30:28 +00009069 verifyFormat("do_something( ::globalVar );", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009070 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009071 verifyFormat("call();", Spaces);
9072 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009073 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
9074 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009075 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009076 " continue;",
9077 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009078 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009079 " continue;",
9080 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009081 verifyFormat("if ( true )\n"
9082 " f();\n"
9083 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009084 " f();",
9085 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009086 verifyFormat("do {\n"
9087 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009088 "} while ( something() );",
9089 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009090 verifyFormat("switch ( x ) {\n"
9091 "default:\n"
9092 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009093 "}",
9094 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009095
9096 Spaces.SpacesInParentheses = false;
9097 Spaces.SpacesInCStyleCastParentheses = true;
9098 verifyFormat("Type *A = ( Type * )P;", Spaces);
9099 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9100 verifyFormat("x = ( int32 )y;", Spaces);
9101 verifyFormat("int a = ( int )(2.0f);", Spaces);
9102 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9103 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9104 verifyFormat("#define x (( int )-1)", Spaces);
9105
Daniel Jasper92e09822015-03-18 12:59:19 +00009106 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00009107 Spaces.SpacesInParentheses = false;
9108 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009109 Spaces.SpacesInCStyleCastParentheses = true;
9110 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009111 verifyFormat("call( );", Spaces);
9112 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009113 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009114 " continue;",
9115 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009116 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009117 " continue;",
9118 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009119 verifyFormat("if (true)\n"
9120 " f( );\n"
9121 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009122 " f( );",
9123 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009124 verifyFormat("do {\n"
9125 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009126 "} while (something( ));",
9127 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009128 verifyFormat("switch (x) {\n"
9129 "default:\n"
9130 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009131 "}",
9132 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009133
Daniel Jasper92e09822015-03-18 12:59:19 +00009134 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009135 Spaces.SpaceAfterCStyleCast = true;
9136 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009137 verifyFormat("call( );", Spaces);
9138 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009139 verifyFormat("while (( bool ) 1)\n"
9140 " continue;",
9141 Spaces);
9142 verifyFormat("for (;;)\n"
9143 " continue;",
9144 Spaces);
9145 verifyFormat("if (true)\n"
9146 " f( );\n"
9147 "else if (true)\n"
9148 " f( );",
9149 Spaces);
9150 verifyFormat("do {\n"
9151 " do_something(( int ) i);\n"
9152 "} while (something( ));",
9153 Spaces);
9154 verifyFormat("switch (x) {\n"
9155 "default:\n"
9156 " break;\n"
9157 "}",
9158 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009159
9160 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009161 Spaces.SpacesInCStyleCastParentheses = false;
9162 Spaces.SpaceAfterCStyleCast = true;
9163 verifyFormat("while ((bool) 1)\n"
9164 " continue;",
9165 Spaces);
9166 verifyFormat("do {\n"
9167 " do_something((int) i);\n"
9168 "} while (something( ));",
9169 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009170}
9171
Daniel Jasperad981f82014-08-26 11:41:14 +00009172TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9173 verifyFormat("int a[5];");
9174 verifyFormat("a[3] += 42;");
9175
9176 FormatStyle Spaces = getLLVMStyle();
9177 Spaces.SpacesInSquareBrackets = true;
9178 // Lambdas unchanged.
9179 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9180 verifyFormat("return [i, args...] {};", Spaces);
9181
9182 // Not lambdas.
9183 verifyFormat("int a[ 5 ];", Spaces);
9184 verifyFormat("a[ 3 ] += 42;", Spaces);
9185 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9186 verifyFormat("double &operator[](int i) { return 0; }\n"
9187 "int i;",
9188 Spaces);
9189 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9190 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9191 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9192}
9193
Daniel Jasperd94bff32013-09-25 15:15:02 +00009194TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9195 verifyFormat("int a = 5;");
9196 verifyFormat("a += 42;");
9197 verifyFormat("a or_eq 8;");
9198
9199 FormatStyle Spaces = getLLVMStyle();
9200 Spaces.SpaceBeforeAssignmentOperators = false;
9201 verifyFormat("int a= 5;", Spaces);
9202 verifyFormat("a+= 42;", Spaces);
9203 verifyFormat("a or_eq 8;", Spaces);
9204}
9205
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009206TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
9207 verifyFormat("class Foo : public Bar {};");
9208 verifyFormat("Foo::Foo() : foo(1) {}");
9209 verifyFormat("for (auto a : b) {\n}");
9210 verifyFormat("int x = a ? b : c;");
9211 verifyFormat("{\n"
9212 "label0:\n"
9213 " int x = 0;\n"
9214 "}");
9215 verifyFormat("switch (x) {\n"
9216 "case 1:\n"
9217 "default:\n"
9218 "}");
9219
9220 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
9221 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
9222 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
9223 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
9224 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
9225 verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
9226 verifyFormat("{\n"
9227 "label1:\n"
9228 " int x = 0;\n"
9229 "}",
9230 CtorInitializerStyle);
9231 verifyFormat("switch (x) {\n"
9232 "case 1:\n"
9233 "default:\n"
9234 "}",
9235 CtorInitializerStyle);
9236 CtorInitializerStyle.BreakConstructorInitializers =
9237 FormatStyle::BCIS_AfterColon;
9238 verifyFormat("Fooooooooooo::Fooooooooooo():\n"
9239 " aaaaaaaaaaaaaaaa(1),\n"
9240 " bbbbbbbbbbbbbbbb(2) {}",
9241 CtorInitializerStyle);
9242 CtorInitializerStyle.BreakConstructorInitializers =
9243 FormatStyle::BCIS_BeforeComma;
9244 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9245 " : aaaaaaaaaaaaaaaa(1)\n"
9246 " , bbbbbbbbbbbbbbbb(2) {}",
9247 CtorInitializerStyle);
9248 CtorInitializerStyle.BreakConstructorInitializers =
9249 FormatStyle::BCIS_BeforeColon;
9250 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9251 " : aaaaaaaaaaaaaaaa(1),\n"
9252 " bbbbbbbbbbbbbbbb(2) {}",
9253 CtorInitializerStyle);
9254 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
9255 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9256 ": aaaaaaaaaaaaaaaa(1),\n"
9257 " bbbbbbbbbbbbbbbb(2) {}",
9258 CtorInitializerStyle);
9259
Francois Ferrand6bb103f2018-06-11 14:41:26 +00009260 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009261 InheritanceStyle.SpaceBeforeInheritanceColon = false;
9262 verifyFormat("class Foo: public Bar {};", InheritanceStyle);
9263 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
9264 verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
9265 verifyFormat("int x = a ? b : c;", InheritanceStyle);
9266 verifyFormat("{\n"
9267 "label2:\n"
9268 " int x = 0;\n"
9269 "}",
9270 InheritanceStyle);
9271 verifyFormat("switch (x) {\n"
9272 "case 1:\n"
9273 "default:\n"
9274 "}",
9275 InheritanceStyle);
Francois Ferrand6bb103f2018-06-11 14:41:26 +00009276 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
9277 verifyFormat("class Foooooooooooooooooooooo:\n"
9278 " public aaaaaaaaaaaaaaaaaa,\n"
9279 " public bbbbbbbbbbbbbbbbbb {\n"
9280 "}",
9281 InheritanceStyle);
9282 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
9283 verifyFormat("class Foooooooooooooooooooooo\n"
9284 " : public aaaaaaaaaaaaaaaaaa\n"
9285 " , public bbbbbbbbbbbbbbbbbb {\n"
9286 "}",
9287 InheritanceStyle);
9288 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
9289 verifyFormat("class Foooooooooooooooooooooo\n"
9290 " : public aaaaaaaaaaaaaaaaaa,\n"
9291 " public bbbbbbbbbbbbbbbbbb {\n"
9292 "}",
9293 InheritanceStyle);
9294 InheritanceStyle.ConstructorInitializerIndentWidth = 0;
9295 verifyFormat("class Foooooooooooooooooooooo\n"
9296 ": public aaaaaaaaaaaaaaaaaa,\n"
9297 " public bbbbbbbbbbbbbbbbbb {}",
9298 InheritanceStyle);
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009299
9300 FormatStyle ForLoopStyle = getLLVMStyle();
9301 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
9302 verifyFormat("class Foo : public Bar {};", ForLoopStyle);
9303 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
9304 verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
9305 verifyFormat("int x = a ? b : c;", ForLoopStyle);
9306 verifyFormat("{\n"
9307 "label2:\n"
9308 " int x = 0;\n"
9309 "}",
9310 ForLoopStyle);
9311 verifyFormat("switch (x) {\n"
9312 "case 1:\n"
9313 "default:\n"
9314 "}",
9315 ForLoopStyle);
9316
9317 FormatStyle NoSpaceStyle = getLLVMStyle();
9318 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
9319 NoSpaceStyle.SpaceBeforeInheritanceColon = false;
9320 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
9321 verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
9322 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
9323 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
9324 verifyFormat("int x = a ? b : c;", NoSpaceStyle);
9325 verifyFormat("{\n"
9326 "label3:\n"
9327 " int x = 0;\n"
9328 "}",
9329 NoSpaceStyle);
9330 verifyFormat("switch (x) {\n"
9331 "case 1:\n"
9332 "default:\n"
9333 "}",
9334 NoSpaceStyle);
9335}
9336
Daniel Jaspera44991332015-04-29 13:06:49 +00009337TEST_F(FormatTest, AlignConsecutiveAssignments) {
9338 FormatStyle Alignment = getLLVMStyle();
9339 Alignment.AlignConsecutiveAssignments = false;
9340 verifyFormat("int a = 5;\n"
9341 "int oneTwoThree = 123;",
9342 Alignment);
9343 verifyFormat("int a = 5;\n"
9344 "int oneTwoThree = 123;",
9345 Alignment);
9346
9347 Alignment.AlignConsecutiveAssignments = true;
9348 verifyFormat("int a = 5;\n"
9349 "int oneTwoThree = 123;",
9350 Alignment);
9351 verifyFormat("int a = method();\n"
9352 "int oneTwoThree = 133;",
9353 Alignment);
9354 verifyFormat("a &= 5;\n"
9355 "bcd *= 5;\n"
9356 "ghtyf += 5;\n"
9357 "dvfvdb -= 5;\n"
9358 "a /= 5;\n"
9359 "vdsvsv %= 5;\n"
9360 "sfdbddfbdfbb ^= 5;\n"
9361 "dvsdsv |= 5;\n"
9362 "int dsvvdvsdvvv = 123;",
9363 Alignment);
9364 verifyFormat("int i = 1, j = 10;\n"
9365 "something = 2000;",
9366 Alignment);
9367 verifyFormat("something = 2000;\n"
9368 "int i = 1, j = 10;\n",
9369 Alignment);
9370 verifyFormat("something = 2000;\n"
9371 "another = 911;\n"
9372 "int i = 1, j = 10;\n"
9373 "oneMore = 1;\n"
9374 "i = 2;",
9375 Alignment);
9376 verifyFormat("int a = 5;\n"
9377 "int one = 1;\n"
9378 "method();\n"
9379 "int oneTwoThree = 123;\n"
9380 "int oneTwo = 12;",
9381 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009382 verifyFormat("int oneTwoThree = 123;\n"
9383 "int oneTwo = 12;\n"
9384 "method();\n",
9385 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009386 verifyFormat("int oneTwoThree = 123; // comment\n"
9387 "int oneTwo = 12; // comment",
9388 Alignment);
9389 EXPECT_EQ("int a = 5;\n"
9390 "\n"
9391 "int oneTwoThree = 123;",
9392 format("int a = 5;\n"
9393 "\n"
9394 "int oneTwoThree= 123;",
9395 Alignment));
9396 EXPECT_EQ("int a = 5;\n"
9397 "int one = 1;\n"
9398 "\n"
9399 "int oneTwoThree = 123;",
9400 format("int a = 5;\n"
9401 "int one = 1;\n"
9402 "\n"
9403 "int oneTwoThree = 123;",
9404 Alignment));
9405 EXPECT_EQ("int a = 5;\n"
9406 "int one = 1;\n"
9407 "\n"
9408 "int oneTwoThree = 123;\n"
9409 "int oneTwo = 12;",
9410 format("int a = 5;\n"
9411 "int one = 1;\n"
9412 "\n"
9413 "int oneTwoThree = 123;\n"
9414 "int oneTwo = 12;",
9415 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009416 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9417 verifyFormat("#define A \\\n"
9418 " int aaaa = 12; \\\n"
9419 " int b = 23; \\\n"
9420 " int ccc = 234; \\\n"
9421 " int dddddddddd = 2345;",
9422 Alignment);
9423 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00009424 verifyFormat("#define A \\\n"
9425 " int aaaa = 12; \\\n"
9426 " int b = 23; \\\n"
9427 " int ccc = 234; \\\n"
9428 " int dddddddddd = 2345;",
9429 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009430 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00009431 verifyFormat("#define A "
9432 " \\\n"
9433 " int aaaa = 12; "
9434 " \\\n"
9435 " int b = 23; "
9436 " \\\n"
9437 " int ccc = 234; "
9438 " \\\n"
9439 " int dddddddddd = 2345;",
9440 Alignment);
9441 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9442 "k = 4, int l = 5,\n"
9443 " int m = 6) {\n"
9444 " int j = 10;\n"
9445 " otherThing = 1;\n"
9446 "}",
9447 Alignment);
9448 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9449 " int i = 1;\n"
9450 " int j = 2;\n"
9451 " int big = 10000;\n"
9452 "}",
9453 Alignment);
9454 verifyFormat("class C {\n"
9455 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009456 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009457 " virtual void f() = 0;\n"
9458 "};",
9459 Alignment);
9460 verifyFormat("int i = 1;\n"
9461 "if (SomeType t = getSomething()) {\n"
9462 "}\n"
9463 "int j = 2;\n"
9464 "int big = 10000;",
9465 Alignment);
9466 verifyFormat("int j = 7;\n"
9467 "for (int k = 0; k < N; ++k) {\n"
9468 "}\n"
9469 "int j = 2;\n"
9470 "int big = 10000;\n"
9471 "}",
9472 Alignment);
9473 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9474 verifyFormat("int i = 1;\n"
9475 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9476 " = someLooooooooooooooooongFunction();\n"
9477 "int j = 2;",
9478 Alignment);
9479 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9480 verifyFormat("int i = 1;\n"
9481 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9482 " someLooooooooooooooooongFunction();\n"
9483 "int j = 2;",
9484 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009485
9486 verifyFormat("auto lambda = []() {\n"
9487 " auto i = 0;\n"
9488 " return 0;\n"
9489 "};\n"
9490 "int i = 0;\n"
9491 "auto v = type{\n"
9492 " i = 1, //\n"
9493 " (i = 2), //\n"
9494 " i = 3 //\n"
9495 "};",
9496 Alignment);
9497
Daniel Jaspera44991332015-04-29 13:06:49 +00009498 verifyFormat(
9499 "int i = 1;\n"
9500 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9501 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009502 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00009503 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009504
9505 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9506 " typename B = very_long_type_name_1,\n"
9507 " typename T_2 = very_long_type_name_2>\n"
9508 "auto foo() {}\n",
9509 Alignment);
9510 verifyFormat("int a, b = 1;\n"
9511 "int c = 2;\n"
9512 "int dd = 3;\n",
9513 Alignment);
9514 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9515 "float b[1][] = {{3.f}};\n",
9516 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009517 verifyFormat("for (int i = 0; i < 1; i++)\n"
9518 " int x = 1;\n",
9519 Alignment);
9520 verifyFormat("for (i = 0; i < 1; i++)\n"
9521 " x = 1;\n"
9522 "y = 1;\n",
9523 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009524}
9525
Daniel Jaspere12597c2015-10-01 10:06:54 +00009526TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9527 FormatStyle Alignment = getLLVMStyle();
9528 Alignment.AlignConsecutiveDeclarations = false;
9529 verifyFormat("float const a = 5;\n"
9530 "int oneTwoThree = 123;",
9531 Alignment);
9532 verifyFormat("int a = 5;\n"
9533 "float const oneTwoThree = 123;",
9534 Alignment);
9535
9536 Alignment.AlignConsecutiveDeclarations = true;
9537 verifyFormat("float const a = 5;\n"
9538 "int oneTwoThree = 123;",
9539 Alignment);
9540 verifyFormat("int a = method();\n"
9541 "float const oneTwoThree = 133;",
9542 Alignment);
9543 verifyFormat("int i = 1, j = 10;\n"
9544 "something = 2000;",
9545 Alignment);
9546 verifyFormat("something = 2000;\n"
9547 "int i = 1, j = 10;\n",
9548 Alignment);
9549 verifyFormat("float something = 2000;\n"
9550 "double another = 911;\n"
9551 "int i = 1, j = 10;\n"
9552 "const int *oneMore = 1;\n"
9553 "unsigned i = 2;",
9554 Alignment);
9555 verifyFormat("float a = 5;\n"
9556 "int one = 1;\n"
9557 "method();\n"
9558 "const double oneTwoThree = 123;\n"
9559 "const unsigned int oneTwo = 12;",
9560 Alignment);
9561 verifyFormat("int oneTwoThree{0}; // comment\n"
9562 "unsigned oneTwo; // comment",
9563 Alignment);
9564 EXPECT_EQ("float const a = 5;\n"
9565 "\n"
9566 "int oneTwoThree = 123;",
9567 format("float const a = 5;\n"
9568 "\n"
9569 "int oneTwoThree= 123;",
9570 Alignment));
9571 EXPECT_EQ("float a = 5;\n"
9572 "int one = 1;\n"
9573 "\n"
9574 "unsigned oneTwoThree = 123;",
9575 format("float a = 5;\n"
9576 "int one = 1;\n"
9577 "\n"
9578 "unsigned oneTwoThree = 123;",
9579 Alignment));
9580 EXPECT_EQ("float a = 5;\n"
9581 "int one = 1;\n"
9582 "\n"
9583 "unsigned oneTwoThree = 123;\n"
9584 "int oneTwo = 12;",
9585 format("float a = 5;\n"
9586 "int one = 1;\n"
9587 "\n"
9588 "unsigned oneTwoThree = 123;\n"
9589 "int oneTwo = 12;",
9590 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009591 // Function prototype alignment
9592 verifyFormat("int a();\n"
9593 "double b();",
9594 Alignment);
9595 verifyFormat("int a(int x);\n"
9596 "double b();",
9597 Alignment);
9598 unsigned OldColumnLimit = Alignment.ColumnLimit;
9599 // We need to set ColumnLimit to zero, in order to stress nested alignments,
9600 // otherwise the function parameters will be re-flowed onto a single line.
9601 Alignment.ColumnLimit = 0;
9602 EXPECT_EQ("int a(int x,\n"
9603 " float y);\n"
9604 "double b(int x,\n"
9605 " double y);",
9606 format("int a(int x,\n"
9607 " float y);\n"
9608 "double b(int x,\n"
9609 " double y);",
9610 Alignment));
9611 // This ensures that function parameters of function declarations are
9612 // correctly indented when their owning functions are indented.
9613 // The failure case here is for 'double y' to not be indented enough.
9614 EXPECT_EQ("double a(int x);\n"
9615 "int b(int y,\n"
9616 " double z);",
9617 format("double a(int x);\n"
9618 "int b(int y,\n"
9619 " double z);",
9620 Alignment));
9621 // Set ColumnLimit low so that we induce wrapping immediately after
9622 // the function name and opening paren.
9623 Alignment.ColumnLimit = 13;
9624 verifyFormat("int function(\n"
9625 " int x,\n"
9626 " bool y);",
9627 Alignment);
9628 Alignment.ColumnLimit = OldColumnLimit;
9629 // Ensure function pointers don't screw up recursive alignment
9630 verifyFormat("int a(int x, void (*fp)(int y));\n"
9631 "double b();",
9632 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009633 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009634 // Ensure recursive alignment is broken by function braces, so that the
9635 // "a = 1" does not align with subsequent assignments inside the function
9636 // body.
9637 verifyFormat("int func(int a = 1) {\n"
9638 " int b = 2;\n"
9639 " int cc = 3;\n"
9640 "}",
9641 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009642 verifyFormat("float something = 2000;\n"
9643 "double another = 911;\n"
9644 "int i = 1, j = 10;\n"
9645 "const int *oneMore = 1;\n"
9646 "unsigned i = 2;",
9647 Alignment);
9648 verifyFormat("int oneTwoThree = {0}; // comment\n"
9649 "unsigned oneTwo = 0; // comment",
9650 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009651 // Make sure that scope is correctly tracked, in the absence of braces
9652 verifyFormat("for (int i = 0; i < n; i++)\n"
9653 " j = i;\n"
9654 "double x = 1;\n",
9655 Alignment);
9656 verifyFormat("if (int i = 0)\n"
9657 " j = i;\n"
9658 "double x = 1;\n",
9659 Alignment);
9660 // Ensure operator[] and operator() are comprehended
9661 verifyFormat("struct test {\n"
9662 " long long int foo();\n"
9663 " int operator[](int a);\n"
9664 " double bar();\n"
9665 "};\n",
9666 Alignment);
9667 verifyFormat("struct test {\n"
9668 " long long int foo();\n"
9669 " int operator()(int a);\n"
9670 " double bar();\n"
9671 "};\n",
9672 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009673 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9674 " int const i = 1;\n"
9675 " int * j = 2;\n"
9676 " int big = 10000;\n"
9677 "\n"
9678 " unsigned oneTwoThree = 123;\n"
9679 " int oneTwo = 12;\n"
9680 " method();\n"
9681 " float k = 2;\n"
9682 " int ll = 10000;\n"
9683 "}",
9684 format("void SomeFunction(int parameter= 0) {\n"
9685 " int const i= 1;\n"
9686 " int *j=2;\n"
9687 " int big = 10000;\n"
9688 "\n"
9689 "unsigned oneTwoThree =123;\n"
9690 "int oneTwo = 12;\n"
9691 " method();\n"
9692 "float k= 2;\n"
9693 "int ll=10000;\n"
9694 "}",
9695 Alignment));
9696 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009697 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9698 verifyFormat("#define A \\\n"
9699 " int aaaa = 12; \\\n"
9700 " float b = 23; \\\n"
9701 " const int ccc = 234; \\\n"
9702 " unsigned dddddddddd = 2345;",
9703 Alignment);
9704 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009705 verifyFormat("#define A \\\n"
9706 " int aaaa = 12; \\\n"
9707 " float b = 23; \\\n"
9708 " const int ccc = 234; \\\n"
9709 " unsigned dddddddddd = 2345;",
9710 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009711 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009712 Alignment.ColumnLimit = 30;
9713 verifyFormat("#define A \\\n"
9714 " int aaaa = 12; \\\n"
9715 " float b = 23; \\\n"
9716 " const int ccc = 234; \\\n"
9717 " int dddddddddd = 2345;",
9718 Alignment);
9719 Alignment.ColumnLimit = 80;
9720 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9721 "k = 4, int l = 5,\n"
9722 " int m = 6) {\n"
9723 " const int j = 10;\n"
9724 " otherThing = 1;\n"
9725 "}",
9726 Alignment);
9727 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9728 " int const i = 1;\n"
9729 " int * j = 2;\n"
9730 " int big = 10000;\n"
9731 "}",
9732 Alignment);
9733 verifyFormat("class C {\n"
9734 "public:\n"
9735 " int i = 1;\n"
9736 " virtual void f() = 0;\n"
9737 "};",
9738 Alignment);
9739 verifyFormat("float i = 1;\n"
9740 "if (SomeType t = getSomething()) {\n"
9741 "}\n"
9742 "const unsigned j = 2;\n"
9743 "int big = 10000;",
9744 Alignment);
9745 verifyFormat("float j = 7;\n"
9746 "for (int k = 0; k < N; ++k) {\n"
9747 "}\n"
9748 "unsigned j = 2;\n"
9749 "int big = 10000;\n"
9750 "}",
9751 Alignment);
9752 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9753 verifyFormat("float i = 1;\n"
9754 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9755 " = someLooooooooooooooooongFunction();\n"
9756 "int j = 2;",
9757 Alignment);
9758 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9759 verifyFormat("int i = 1;\n"
9760 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9761 " someLooooooooooooooooongFunction();\n"
9762 "int j = 2;",
9763 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009764
9765 Alignment.AlignConsecutiveAssignments = true;
9766 verifyFormat("auto lambda = []() {\n"
9767 " auto ii = 0;\n"
9768 " float j = 0;\n"
9769 " return 0;\n"
9770 "};\n"
9771 "int i = 0;\n"
9772 "float i2 = 0;\n"
9773 "auto v = type{\n"
9774 " i = 1, //\n"
9775 " (i = 2), //\n"
9776 " i = 3 //\n"
9777 "};",
9778 Alignment);
9779 Alignment.AlignConsecutiveAssignments = false;
9780
Daniel Jaspere12597c2015-10-01 10:06:54 +00009781 verifyFormat(
9782 "int i = 1;\n"
9783 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9784 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009785 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009786 Alignment);
9787
9788 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9789 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009790 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00009791 // happens.
9792 Alignment.AlignConsecutiveAssignments = true;
9793 Alignment.ColumnLimit = 30;
9794 verifyFormat("float ii = 1;\n"
9795 "unsigned j = 2;\n"
9796 "int someVerylongVariable = 1;\n"
9797 "AnotherLongType ll = 123456;\n"
9798 "VeryVeryLongType k = 2;\n"
9799 "int myvar = 1;",
9800 Alignment);
9801 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009802 Alignment.AlignConsecutiveAssignments = false;
9803
9804 verifyFormat(
9805 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9806 " typename LongType, typename B>\n"
9807 "auto foo() {}\n",
9808 Alignment);
9809 verifyFormat("float a, b = 1;\n"
9810 "int c = 2;\n"
9811 "int dd = 3;\n",
9812 Alignment);
9813 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9814 "float b[1][] = {{3.f}};\n",
9815 Alignment);
9816 Alignment.AlignConsecutiveAssignments = true;
9817 verifyFormat("float a, b = 1;\n"
9818 "int c = 2;\n"
9819 "int dd = 3;\n",
9820 Alignment);
9821 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9822 "float b[1][] = {{3.f}};\n",
9823 Alignment);
9824 Alignment.AlignConsecutiveAssignments = false;
9825
9826 Alignment.ColumnLimit = 30;
9827 Alignment.BinPackParameters = false;
9828 verifyFormat("void foo(float a,\n"
9829 " float b,\n"
9830 " int c,\n"
9831 " uint32_t *d) {\n"
9832 " int * e = 0;\n"
9833 " float f = 0;\n"
9834 " double g = 0;\n"
9835 "}\n"
9836 "void bar(ino_t a,\n"
9837 " int b,\n"
9838 " uint32_t *c,\n"
9839 " bool d) {}\n",
9840 Alignment);
9841 Alignment.BinPackParameters = true;
9842 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +00009843
9844 // Bug 33507
9845 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
9846 verifyFormat(
9847 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
9848 " static const Version verVs2017;\n"
9849 " return true;\n"
9850 "});\n",
9851 Alignment);
9852 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Ilya Biryukovf16a6fa2018-08-01 15:32:56 +00009853
9854 // See llvm.org/PR35641
9855 Alignment.AlignConsecutiveDeclarations = true;
9856 verifyFormat("int func() { //\n"
9857 " int b;\n"
9858 " unsigned c;\n"
9859 "}",
9860 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009861}
9862
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009863TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009864 FormatStyle LinuxBraceStyle = getLLVMStyle();
9865 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009866 verifyFormat("namespace a\n"
9867 "{\n"
9868 "class A\n"
9869 "{\n"
9870 " void f()\n"
9871 " {\n"
9872 " if (true) {\n"
9873 " a();\n"
9874 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009875 " } else {\n"
9876 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009877 " }\n"
9878 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009879 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009880 "};\n"
9881 "struct B {\n"
9882 " int x;\n"
9883 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009884 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009885 LinuxBraceStyle);
9886 verifyFormat("enum X {\n"
9887 " Y = 0,\n"
9888 "}\n",
9889 LinuxBraceStyle);
9890 verifyFormat("struct S {\n"
9891 " int Type;\n"
9892 " union {\n"
9893 " int x;\n"
9894 " double y;\n"
9895 " } Value;\n"
9896 " class C\n"
9897 " {\n"
9898 " MyFavoriteType Value;\n"
9899 " } Class;\n"
9900 "}\n",
9901 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009902}
9903
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009904TEST_F(FormatTest, MozillaBraceBreaking) {
9905 FormatStyle MozillaBraceStyle = getLLVMStyle();
9906 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009907 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009908 verifyFormat("namespace a {\n"
9909 "class A\n"
9910 "{\n"
9911 " void f()\n"
9912 " {\n"
9913 " if (true) {\n"
9914 " a();\n"
9915 " b();\n"
9916 " }\n"
9917 " }\n"
9918 " void g() { return; }\n"
9919 "};\n"
9920 "enum E\n"
9921 "{\n"
9922 " A,\n"
9923 " // foo\n"
9924 " B,\n"
9925 " C\n"
9926 "};\n"
9927 "struct B\n"
9928 "{\n"
9929 " int x;\n"
9930 "};\n"
9931 "}\n",
9932 MozillaBraceStyle);
9933 verifyFormat("struct S\n"
9934 "{\n"
9935 " int Type;\n"
9936 " union\n"
9937 " {\n"
9938 " int x;\n"
9939 " double y;\n"
9940 " } Value;\n"
9941 " class C\n"
9942 " {\n"
9943 " MyFavoriteType Value;\n"
9944 " } Class;\n"
9945 "}\n",
9946 MozillaBraceStyle);
9947}
9948
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009949TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009950 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9951 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009952 verifyFormat("namespace a {\n"
9953 "class A {\n"
9954 " void f()\n"
9955 " {\n"
9956 " if (true) {\n"
9957 " a();\n"
9958 " b();\n"
9959 " }\n"
9960 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009961 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009962 "};\n"
9963 "struct B {\n"
9964 " int x;\n"
9965 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00009966 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009967 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009968
Daniel Jasperd9670872014-08-05 12:06:20 +00009969 verifyFormat("void foo()\n"
9970 "{\n"
9971 " if (a) {\n"
9972 " a();\n"
9973 " }\n"
9974 " else {\n"
9975 " b();\n"
9976 " }\n"
9977 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009978 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009979
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009980 verifyFormat("#ifdef _DEBUG\n"
9981 "int foo(int i = 0)\n"
9982 "#else\n"
9983 "int foo(int i = 5)\n"
9984 "#endif\n"
9985 "{\n"
9986 " return i;\n"
9987 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009988 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009989
9990 verifyFormat("void foo() {}\n"
9991 "void bar()\n"
9992 "#ifdef _DEBUG\n"
9993 "{\n"
9994 " foo();\n"
9995 "}\n"
9996 "#else\n"
9997 "{\n"
9998 "}\n"
9999 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010000 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010001
10002 verifyFormat("void foobar() { int i = 5; }\n"
10003 "#ifdef _DEBUG\n"
10004 "void bar() {}\n"
10005 "#else\n"
10006 "void bar() { foobar(); }\n"
10007 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010008 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010009}
10010
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010011TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010012 FormatStyle AllmanBraceStyle = getLLVMStyle();
10013 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010014
10015 EXPECT_EQ("namespace a\n"
10016 "{\n"
10017 "void f();\n"
10018 "void g();\n"
10019 "} // namespace a\n",
10020 format("namespace a\n"
10021 "{\n"
10022 "void f();\n"
10023 "void g();\n"
10024 "}\n",
10025 AllmanBraceStyle));
10026
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010027 verifyFormat("namespace a\n"
10028 "{\n"
10029 "class A\n"
10030 "{\n"
10031 " void f()\n"
10032 " {\n"
10033 " if (true)\n"
10034 " {\n"
10035 " a();\n"
10036 " b();\n"
10037 " }\n"
10038 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +000010039 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010040 "};\n"
10041 "struct B\n"
10042 "{\n"
10043 " int x;\n"
10044 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010045 "} // namespace a",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010046 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010047
10048 verifyFormat("void f()\n"
10049 "{\n"
10050 " if (true)\n"
10051 " {\n"
10052 " a();\n"
10053 " }\n"
10054 " else if (false)\n"
10055 " {\n"
10056 " b();\n"
10057 " }\n"
10058 " else\n"
10059 " {\n"
10060 " c();\n"
10061 " }\n"
10062 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010063 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010064
10065 verifyFormat("void f()\n"
10066 "{\n"
10067 " for (int i = 0; i < 10; ++i)\n"
10068 " {\n"
10069 " a();\n"
10070 " }\n"
10071 " while (false)\n"
10072 " {\n"
10073 " b();\n"
10074 " }\n"
10075 " do\n"
10076 " {\n"
10077 " c();\n"
10078 " } while (false)\n"
10079 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010080 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010081
10082 verifyFormat("void f(int a)\n"
10083 "{\n"
10084 " switch (a)\n"
10085 " {\n"
10086 " case 0:\n"
10087 " break;\n"
10088 " case 1:\n"
10089 " {\n"
10090 " break;\n"
10091 " }\n"
10092 " case 2:\n"
10093 " {\n"
10094 " }\n"
10095 " break;\n"
10096 " default:\n"
10097 " break;\n"
10098 " }\n"
10099 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010100 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +000010101
10102 verifyFormat("enum X\n"
10103 "{\n"
10104 " Y = 0,\n"
10105 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010106 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +000010107 verifyFormat("enum X\n"
10108 "{\n"
10109 " Y = 0\n"
10110 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010111 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +000010112
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010113 verifyFormat("@interface BSApplicationController ()\n"
10114 "{\n"
10115 "@private\n"
10116 " id _extraIvar;\n"
10117 "}\n"
10118 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010119 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010120
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010121 verifyFormat("#ifdef _DEBUG\n"
10122 "int foo(int i = 0)\n"
10123 "#else\n"
10124 "int foo(int i = 5)\n"
10125 "#endif\n"
10126 "{\n"
10127 " return i;\n"
10128 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010129 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010130
10131 verifyFormat("void foo() {}\n"
10132 "void bar()\n"
10133 "#ifdef _DEBUG\n"
10134 "{\n"
10135 " foo();\n"
10136 "}\n"
10137 "#else\n"
10138 "{\n"
10139 "}\n"
10140 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010141 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010142
10143 verifyFormat("void foobar() { int i = 5; }\n"
10144 "#ifdef _DEBUG\n"
10145 "void bar() {}\n"
10146 "#else\n"
10147 "void bar() { foobar(); }\n"
10148 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010149 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010150
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010151 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010152 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010153 " // ...\n"
10154 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010155 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010156 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010157 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010158 " // ...\n"
10159 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010160 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010161 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010162 // .. or dict literals.
10163 verifyFormat("void f()\n"
10164 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +000010165 " // ...\n"
10166 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
10167 "}",
10168 AllmanBraceStyle);
10169 verifyFormat("void f()\n"
10170 "{\n"
10171 " // ...\n"
10172 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010173 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010174 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +000010175 verifyFormat("int f()\n"
10176 "{ // comment\n"
10177 " return 42;\n"
10178 "}",
10179 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010180
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010181 AllmanBraceStyle.ColumnLimit = 19;
10182 verifyFormat("void f() { int i; }", AllmanBraceStyle);
10183 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +000010184 verifyFormat("void f()\n"
10185 "{\n"
10186 " int i;\n"
10187 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010188 AllmanBraceStyle);
10189 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +000010190
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010191 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +000010192 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
10193 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
10194 verifyFormat("void f(bool b)\n"
10195 "{\n"
10196 " if (b)\n"
10197 " {\n"
10198 " return;\n"
10199 " }\n"
10200 "}\n",
10201 BreakBeforeBraceShortIfs);
10202 verifyFormat("void f(bool b)\n"
10203 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010204 " if constexpr (b)\n"
10205 " {\n"
10206 " return;\n"
10207 " }\n"
10208 "}\n",
10209 BreakBeforeBraceShortIfs);
10210 verifyFormat("void f(bool b)\n"
10211 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +000010212 " if (b) return;\n"
10213 "}\n",
10214 BreakBeforeBraceShortIfs);
10215 verifyFormat("void f(bool b)\n"
10216 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010217 " if constexpr (b) return;\n"
10218 "}\n",
10219 BreakBeforeBraceShortIfs);
10220 verifyFormat("void f(bool b)\n"
10221 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +000010222 " while (b)\n"
10223 " {\n"
10224 " return;\n"
10225 " }\n"
10226 "}\n",
10227 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010228}
10229
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010230TEST_F(FormatTest, GNUBraceBreaking) {
10231 FormatStyle GNUBraceStyle = getLLVMStyle();
10232 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
10233 verifyFormat("namespace a\n"
10234 "{\n"
10235 "class A\n"
10236 "{\n"
10237 " void f()\n"
10238 " {\n"
10239 " int a;\n"
10240 " {\n"
10241 " int b;\n"
10242 " }\n"
10243 " if (true)\n"
10244 " {\n"
10245 " a();\n"
10246 " b();\n"
10247 " }\n"
10248 " }\n"
10249 " void g() { return; }\n"
10250 "}\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010251 "} // namespace a",
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010252 GNUBraceStyle);
10253
10254 verifyFormat("void f()\n"
10255 "{\n"
10256 " if (true)\n"
10257 " {\n"
10258 " a();\n"
10259 " }\n"
10260 " else if (false)\n"
10261 " {\n"
10262 " b();\n"
10263 " }\n"
10264 " else\n"
10265 " {\n"
10266 " c();\n"
10267 " }\n"
10268 "}\n",
10269 GNUBraceStyle);
10270
10271 verifyFormat("void f()\n"
10272 "{\n"
10273 " for (int i = 0; i < 10; ++i)\n"
10274 " {\n"
10275 " a();\n"
10276 " }\n"
10277 " while (false)\n"
10278 " {\n"
10279 " b();\n"
10280 " }\n"
10281 " do\n"
10282 " {\n"
10283 " c();\n"
10284 " }\n"
10285 " while (false);\n"
10286 "}\n",
10287 GNUBraceStyle);
10288
10289 verifyFormat("void f(int a)\n"
10290 "{\n"
10291 " switch (a)\n"
10292 " {\n"
10293 " case 0:\n"
10294 " break;\n"
10295 " case 1:\n"
10296 " {\n"
10297 " break;\n"
10298 " }\n"
10299 " case 2:\n"
10300 " {\n"
10301 " }\n"
10302 " break;\n"
10303 " default:\n"
10304 " break;\n"
10305 " }\n"
10306 "}\n",
10307 GNUBraceStyle);
10308
10309 verifyFormat("enum X\n"
10310 "{\n"
10311 " Y = 0,\n"
10312 "}\n",
10313 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010314
10315 verifyFormat("@interface BSApplicationController ()\n"
10316 "{\n"
10317 "@private\n"
10318 " id _extraIvar;\n"
10319 "}\n"
10320 "@end\n",
10321 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010322
10323 verifyFormat("#ifdef _DEBUG\n"
10324 "int foo(int i = 0)\n"
10325 "#else\n"
10326 "int foo(int i = 5)\n"
10327 "#endif\n"
10328 "{\n"
10329 " return i;\n"
10330 "}",
10331 GNUBraceStyle);
10332
10333 verifyFormat("void foo() {}\n"
10334 "void bar()\n"
10335 "#ifdef _DEBUG\n"
10336 "{\n"
10337 " foo();\n"
10338 "}\n"
10339 "#else\n"
10340 "{\n"
10341 "}\n"
10342 "#endif",
10343 GNUBraceStyle);
10344
10345 verifyFormat("void foobar() { int i = 5; }\n"
10346 "#ifdef _DEBUG\n"
10347 "void bar() {}\n"
10348 "#else\n"
10349 "void bar() { foobar(); }\n"
10350 "#endif",
10351 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010352}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010353
10354TEST_F(FormatTest, WebKitBraceBreaking) {
10355 FormatStyle WebKitBraceStyle = getLLVMStyle();
10356 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010357 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010358 verifyFormat("namespace a {\n"
10359 "class A {\n"
10360 " void f()\n"
10361 " {\n"
10362 " if (true) {\n"
10363 " a();\n"
10364 " b();\n"
10365 " }\n"
10366 " }\n"
10367 " void g() { return; }\n"
10368 "};\n"
10369 "enum E {\n"
10370 " A,\n"
10371 " // foo\n"
10372 " B,\n"
10373 " C\n"
10374 "};\n"
10375 "struct B {\n"
10376 " int x;\n"
10377 "};\n"
10378 "}\n",
10379 WebKitBraceStyle);
10380 verifyFormat("struct S {\n"
10381 " int Type;\n"
10382 " union {\n"
10383 " int x;\n"
10384 " double y;\n"
10385 " } Value;\n"
10386 " class C {\n"
10387 " MyFavoriteType Value;\n"
10388 " } Class;\n"
10389 "};\n",
10390 WebKitBraceStyle);
10391}
10392
Manuel Klimekd5735502013-08-12 03:51:17 +000010393TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10394 verifyFormat("void f() {\n"
10395 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010396 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010397 " }\n"
10398 "}\n",
10399 getLLVMStyle());
10400}
10401
Daniel Jasper9613c812013-08-07 16:29:23 +000010402TEST_F(FormatTest, UnderstandsPragmas) {
10403 verifyFormat("#pragma omp reduction(| : var)");
10404 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010405
10406 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10407 "(including parentheses).",
10408 format("#pragma mark Any non-hyphenated or hyphenated string "
10409 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010410}
10411
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010412TEST_F(FormatTest, UnderstandPragmaOption) {
10413 verifyFormat("#pragma option -C -A");
10414
10415 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10416}
10417
Manuel Klimek77866142017-11-17 11:17:15 +000010418TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
10419 FormatStyle Style = getLLVMStyle();
10420 Style.ColumnLimit = 20;
10421
10422 verifyFormat("int a; // the\n"
10423 " // comment", Style);
10424 EXPECT_EQ("int a; /* first line\n"
10425 " * second\n"
10426 " * line third\n"
10427 " * line\n"
10428 " */",
10429 format("int a; /* first line\n"
10430 " * second\n"
10431 " * line third\n"
10432 " * line\n"
10433 " */",
10434 Style));
10435 EXPECT_EQ("int a; // first line\n"
10436 " // second\n"
10437 " // line third\n"
10438 " // line",
10439 format("int a; // first line\n"
10440 " // second line\n"
10441 " // third line",
10442 Style));
10443
10444 Style.PenaltyExcessCharacter = 90;
10445 verifyFormat("int a; // the comment", Style);
Manuel Klimek93699f42017-11-29 14:29:43 +000010446 EXPECT_EQ("int a; // the comment\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010447 " // aaa",
10448 format("int a; // the comment aaa", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010449 EXPECT_EQ("int a; /* first line\n"
10450 " * second line\n"
10451 " * third line\n"
10452 " */",
10453 format("int a; /* first line\n"
10454 " * second line\n"
10455 " * third line\n"
10456 " */",
10457 Style));
Manuel Klimek93699f42017-11-29 14:29:43 +000010458 EXPECT_EQ("int a; // first line\n"
10459 " // second line\n"
10460 " // third line",
10461 format("int a; // first line\n"
10462 " // second line\n"
10463 " // third line",
10464 Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010465 // FIXME: Investigate why this is not getting the same layout as the test
10466 // above.
10467 EXPECT_EQ("int a; /* first line\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010468 " * second line\n"
10469 " * third line\n"
Manuel Klimek77866142017-11-17 11:17:15 +000010470 " */",
10471 format("int a; /* first line second line third line"
10472 "\n*/",
10473 Style));
10474
10475 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010476 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010477 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010478 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010479 Style));
10480 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010481 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010482 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010483 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010484 Style));
10485
10486 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
10487 // next one.
Manuel Klimek93699f42017-11-29 14:29:43 +000010488 EXPECT_EQ("// foo bar baz bazfoo\n"
10489 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010490 format("// foo bar baz bazfoo bar\n"
10491 "// foo bar\n",
10492 Style));
10493
10494 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010495 "// foo bar baz bazfoo\n"
10496 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010497 format("// foo bar baz bazfoo\n"
10498 "// foo bar baz bazfoo bar\n"
10499 "// foo bar\n",
10500 Style));
10501
Manuel Klimek77866142017-11-17 11:17:15 +000010502 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010503 "// foo bar baz bazfoo\n"
10504 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010505 format("// foo bar baz bazfoo\n"
10506 "// foo bar baz bazfoo bar\n"
10507 "// foo bar\n",
10508 Style));
Manuel Klimek0b58c322017-12-01 13:28:08 +000010509
10510 // Make sure we do not keep protruding characters if strict mode reflow is
10511 // cheaper than keeping protruding characters.
10512 Style.ColumnLimit = 21;
10513 EXPECT_EQ("// foo foo foo foo\n"
10514 "// foo foo foo foo\n"
10515 "// foo foo foo foo\n",
10516 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
10517 Style));
10518
10519 EXPECT_EQ("int a = /* long block\n"
10520 " comment */\n"
10521 " 42;",
10522 format("int a = /* long block comment */ 42;", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010523}
10524
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010525#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10526 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010527 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10528 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010529
10530TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010531 SmallVector<FormatStyle, 3> Styles;
10532 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010533
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010534 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010535 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10536 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10537 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010538
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010539 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010540 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10541 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10542 EXPECT_ALL_STYLES_EQUAL(Styles);
10543
Nico Weber514ecc82014-02-02 20:50:45 +000010544 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010545 EXPECT_TRUE(
10546 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10547 EXPECT_TRUE(
10548 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10549 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010550
Nico Weber514ecc82014-02-02 20:50:45 +000010551 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010552 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10553 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10554 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010555
10556 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010557 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10558 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10559 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010560
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010561 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010562 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10563 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10564 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010565
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010566 Styles[0] = getGNUStyle();
10567 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10568 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10569 EXPECT_ALL_STYLES_EQUAL(Styles);
10570
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010571 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10572}
10573
10574TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10575 SmallVector<FormatStyle, 8> Styles;
10576 Styles.resize(2);
10577
10578 Styles[0] = getGoogleStyle();
10579 Styles[1] = getLLVMStyle();
10580 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10581 EXPECT_ALL_STYLES_EQUAL(Styles);
10582
10583 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010584 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010585 Styles[1] = getLLVMStyle();
10586 Styles[1].Language = FormatStyle::LK_JavaScript;
10587 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10588
10589 Styles[2] = getLLVMStyle();
10590 Styles[2].Language = FormatStyle::LK_JavaScript;
10591 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10592 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010593 &Styles[2])
10594 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010595
10596 Styles[3] = getLLVMStyle();
10597 Styles[3].Language = FormatStyle::LK_JavaScript;
10598 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10599 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010600 &Styles[3])
10601 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010602
10603 Styles[4] = getLLVMStyle();
10604 Styles[4].Language = FormatStyle::LK_JavaScript;
10605 EXPECT_EQ(0, parseConfiguration("---\n"
10606 "BasedOnStyle: LLVM\n"
10607 "IndentWidth: 123\n"
10608 "---\n"
10609 "BasedOnStyle: Google\n"
10610 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010611 &Styles[4])
10612 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010613 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010614}
10615
Daniel Jasper91881d92014-09-29 08:07:46 +000010616#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010617 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010618 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010619 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010620 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010621 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010622
Daniel Jasper91881d92014-09-29 08:07:46 +000010623#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10624
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010625#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10626 Style.STRUCT.FIELD = false; \
10627 EXPECT_EQ(0, \
10628 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10629 .value()); \
10630 EXPECT_TRUE(Style.STRUCT.FIELD); \
10631 EXPECT_EQ(0, \
10632 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10633 .value()); \
10634 EXPECT_FALSE(Style.STRUCT.FIELD);
10635
10636#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10637 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10638
Daniel Jasper00853002014-09-16 16:22:30 +000010639#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10640 EXPECT_NE(VALUE, Style.FIELD); \
10641 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10642 EXPECT_EQ(VALUE, Style.FIELD)
10643
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010644TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010645 FormatStyle Style = {};
10646 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +000010647 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010648 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010649 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010650 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010651 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010652 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010653 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010654 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010655 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper18210d72014-10-09 09:52:05 +000010656 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010657 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010658 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010659 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010660 CHECK_PARSE_BOOL(BreakStringLiterals);
Francois Ferrande56a8292017-06-14 12:29:47 +000010661 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010662 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010663 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010664 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010665 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010666 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010667 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010668 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010669 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010670 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010671 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010672 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010673 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +000010674 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010675 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010676 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010677 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010678 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010679 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010680 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010681 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010682 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010683 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Hans Wennborgbfc34062018-06-14 08:01:09 +000010684 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
Francois Ferrand2a9ea782018-03-01 10:09:13 +000010685 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
10686 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
10687 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010688
10689 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10690 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10691 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10692 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10693 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10694 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10695 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10696 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
Krasimir Georgievd6ce9372017-09-15 11:23:50 +000010697 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010698 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10699 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10700 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +000010701 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10702 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10703 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010704}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010705
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010706#undef CHECK_PARSE_BOOL
10707
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010708TEST_F(FormatTest, ParsesConfiguration) {
10709 FormatStyle Style = {};
10710 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010711 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010712 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10713 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010714 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010715 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10716 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +000010717 CHECK_PARSE("PenaltyBreakAssignment: 1234",
10718 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010719 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10720 PenaltyBreakBeforeFirstCallParameter, 1234u);
Francois Ferrand58e6fe52018-05-16 08:25:03 +000010721 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
10722 PenaltyBreakTemplateDeclaration, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010723 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10724 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10725 PenaltyReturnTypeOnItsOwnLine, 1234u);
10726 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10727 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010728 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010729 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010730 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010731
Daniel Jasper553d4872014-06-17 12:40:34 +000010732 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010733 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10734 FormatStyle::PAS_Left);
10735 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10736 FormatStyle::PAS_Right);
10737 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10738 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010739 // For backward compatibility:
10740 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10741 FormatStyle::PAS_Left);
10742 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10743 FormatStyle::PAS_Right);
10744 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10745 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010746
Alexander Kornienkod6538332013-05-07 15:32:14 +000010747 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010748 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10749 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010750 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10751 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10752 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10753
Daniel Jasperac043c92014-09-15 11:11:00 +000010754 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010755 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10756 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010757 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10758 FormatStyle::BOS_None);
10759 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10760 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010761 // For backward compatibility:
10762 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10763 FormatStyle::BOS_None);
10764 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10765 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010766
Francois Ferranda6b6d512017-05-24 11:36:58 +000010767 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10768 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10769 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10770 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10771 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10772 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10773 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10774 // For backward compatibility:
10775 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10776 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10777
Francois Ferrand6bb103f2018-06-11 14:41:26 +000010778 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
10779 CHECK_PARSE("BreakInheritanceList: BeforeComma",
10780 BreakInheritanceList, FormatStyle::BILS_BeforeComma);
10781 CHECK_PARSE("BreakInheritanceList: AfterColon",
10782 BreakInheritanceList, FormatStyle::BILS_AfterColon);
10783 CHECK_PARSE("BreakInheritanceList: BeforeColon",
10784 BreakInheritanceList, FormatStyle::BILS_BeforeColon);
10785 // For backward compatibility:
10786 CHECK_PARSE("BreakBeforeInheritanceComma: true",
10787 BreakInheritanceList, FormatStyle::BILS_BeforeComma);
10788
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010789 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10790 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10791 FormatStyle::BAS_Align);
10792 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10793 FormatStyle::BAS_DontAlign);
10794 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10795 FormatStyle::BAS_AlwaysBreak);
10796 // For backward compatibility:
10797 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10798 FormatStyle::BAS_DontAlign);
10799 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10800 FormatStyle::BAS_Align);
10801
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +000010802 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10803 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
10804 FormatStyle::ENAS_DontAlign);
10805 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
10806 FormatStyle::ENAS_Left);
10807 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
10808 FormatStyle::ENAS_Right);
10809 // For backward compatibility:
10810 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
10811 FormatStyle::ENAS_Left);
10812 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
10813 FormatStyle::ENAS_Right);
10814
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010815 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010816 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10817 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10818 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010819 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10820 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010821 // For backward compatibility:
10822 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10823 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010824
Daniel Jasperd74cf402014-04-08 12:46:38 +000010825 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010826 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10827 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10828 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10829 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010830 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10831 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010832 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10833 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010834 // For backward compatibility:
10835 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10836 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10837 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10838 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010839
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010840 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10841 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10842 FormatStyle::SBPO_Never);
10843 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10844 FormatStyle::SBPO_Always);
10845 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10846 FormatStyle::SBPO_ControlStatements);
10847 // For backward compatibility:
10848 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10849 FormatStyle::SBPO_Never);
10850 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10851 FormatStyle::SBPO_ControlStatements);
10852
Alexander Kornienkod6538332013-05-07 15:32:14 +000010853 Style.ColumnLimit = 123;
10854 FormatStyle BaseStyle = getLLVMStyle();
10855 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10856 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10857
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010858 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10859 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10860 FormatStyle::BS_Attach);
10861 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10862 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010863 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10864 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010865 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10866 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010867 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10868 FormatStyle::BS_Allman);
10869 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010870 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10871 FormatStyle::BS_WebKit);
10872 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10873 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010874
Zachary Turner448592e2015-12-18 22:20:15 +000010875 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10876 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10877 FormatStyle::RTBS_None);
10878 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10879 FormatStyle::RTBS_All);
10880 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010881 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010882 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10883 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10884 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10885 AlwaysBreakAfterReturnType,
10886 FormatStyle::RTBS_TopLevelDefinitions);
10887
Francois Ferrand58e6fe52018-05-16 08:25:03 +000010888 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
10889 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", AlwaysBreakTemplateDeclarations,
10890 FormatStyle::BTDS_No);
10891 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", AlwaysBreakTemplateDeclarations,
10892 FormatStyle::BTDS_MultiLine);
10893 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", AlwaysBreakTemplateDeclarations,
10894 FormatStyle::BTDS_Yes);
10895 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", AlwaysBreakTemplateDeclarations,
10896 FormatStyle::BTDS_MultiLine);
10897 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", AlwaysBreakTemplateDeclarations,
10898 FormatStyle::BTDS_Yes);
10899
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010900 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10901 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10902 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10903 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10904 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10905 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10906 AlwaysBreakAfterDefinitionReturnType,
10907 FormatStyle::DRTBS_TopLevel);
10908
Daniel Jasper65ee3472013-07-31 23:16:02 +000010909 Style.NamespaceIndentation = FormatStyle::NI_All;
10910 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10911 FormatStyle::NI_None);
10912 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10913 FormatStyle::NI_Inner);
10914 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10915 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010916
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010917 // FIXME: This is required because parsing a configuration simply overwrites
10918 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010919 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010920 std::vector<std::string> BoostForeach;
10921 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010922 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010923 std::vector<std::string> BoostAndQForeach;
10924 BoostAndQForeach.push_back("BOOST_FOREACH");
10925 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010926 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10927 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010928
Eric Liu9d92c022018-05-14 19:51:33 +000010929 Style.IncludeStyle.IncludeCategories.clear();
10930 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
10931 {"abc/.*", 2}, {".*", 1}};
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010932 CHECK_PARSE("IncludeCategories:\n"
10933 " - Regex: abc/.*\n"
10934 " Priority: 2\n"
10935 " - Regex: .*\n"
10936 " Priority: 1",
Eric Liu9d92c022018-05-14 19:51:33 +000010937 IncludeStyle.IncludeCategories, ExpectedCategories);
10938 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
10939 "abc$");
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010940
10941 Style.RawStringFormats.clear();
10942 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010943 {
10944 FormatStyle::LK_TextProto,
10945 {"pb", "proto"},
10946 {"PARSE_TEXT_PROTO"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010947 /*CanonicalDelimiter=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010948 "llvm",
10949 },
10950 {
10951 FormatStyle::LK_Cpp,
10952 {"cc", "cpp"},
10953 {"C_CODEBLOCK", "CPPEVAL"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010954 /*CanonicalDelimiter=*/"cc",
10955 /*BasedOnStyle=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010956 },
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010957 };
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010958
10959 CHECK_PARSE("RawStringFormats:\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010960 " - Language: TextProto\n"
10961 " Delimiters:\n"
10962 " - 'pb'\n"
10963 " - 'proto'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010964 " EnclosingFunctions:\n"
10965 " - 'PARSE_TEXT_PROTO'\n"
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010966 " BasedOnStyle: llvm\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010967 " - Language: Cpp\n"
10968 " Delimiters:\n"
10969 " - 'cc'\n"
10970 " - 'cpp'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010971 " EnclosingFunctions:\n"
10972 " - 'C_CODEBLOCK'\n"
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010973 " - 'CPPEVAL'\n"
10974 " CanonicalDelimiter: 'cc'",
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010975 RawStringFormats, ExpectedRawStringFormats);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010976}
10977
10978TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10979 FormatStyle Style = {};
10980 Style.Language = FormatStyle::LK_Cpp;
10981 CHECK_PARSE("Language: Cpp\n"
10982 "IndentWidth: 12",
10983 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010984 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10985 "IndentWidth: 34",
10986 &Style),
10987 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010988 EXPECT_EQ(12u, Style.IndentWidth);
10989 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10990 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10991
10992 Style.Language = FormatStyle::LK_JavaScript;
10993 CHECK_PARSE("Language: JavaScript\n"
10994 "IndentWidth: 12",
10995 IndentWidth, 12u);
10996 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010997 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10998 "IndentWidth: 34",
10999 &Style),
11000 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011001 EXPECT_EQ(23u, Style.IndentWidth);
11002 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
11003 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
11004
11005 CHECK_PARSE("BasedOnStyle: LLVM\n"
11006 "IndentWidth: 67",
11007 IndentWidth, 67u);
11008
11009 CHECK_PARSE("---\n"
11010 "Language: JavaScript\n"
11011 "IndentWidth: 12\n"
11012 "---\n"
11013 "Language: Cpp\n"
11014 "IndentWidth: 34\n"
11015 "...\n",
11016 IndentWidth, 12u);
11017
11018 Style.Language = FormatStyle::LK_Cpp;
11019 CHECK_PARSE("---\n"
11020 "Language: JavaScript\n"
11021 "IndentWidth: 12\n"
11022 "---\n"
11023 "Language: Cpp\n"
11024 "IndentWidth: 34\n"
11025 "...\n",
11026 IndentWidth, 34u);
11027 CHECK_PARSE("---\n"
11028 "IndentWidth: 78\n"
11029 "---\n"
11030 "Language: JavaScript\n"
11031 "IndentWidth: 56\n"
11032 "...\n",
11033 IndentWidth, 78u);
11034
11035 Style.ColumnLimit = 123;
11036 Style.IndentWidth = 234;
11037 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
11038 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000011039 EXPECT_FALSE(parseConfiguration("---\n"
11040 "IndentWidth: 456\n"
11041 "BreakBeforeBraces: Allman\n"
11042 "---\n"
11043 "Language: JavaScript\n"
11044 "IndentWidth: 111\n"
11045 "TabWidth: 111\n"
11046 "---\n"
11047 "Language: Cpp\n"
11048 "BreakBeforeBraces: Stroustrup\n"
11049 "TabWidth: 789\n"
11050 "...\n",
11051 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011052 EXPECT_EQ(123u, Style.ColumnLimit);
11053 EXPECT_EQ(456u, Style.IndentWidth);
11054 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
11055 EXPECT_EQ(789u, Style.TabWidth);
11056
Rafael Espindola1f243172014-06-12 11:35:17 +000011057 EXPECT_EQ(parseConfiguration("---\n"
11058 "Language: JavaScript\n"
11059 "IndentWidth: 56\n"
11060 "---\n"
11061 "IndentWidth: 78\n"
11062 "...\n",
11063 &Style),
11064 ParseError::Error);
11065 EXPECT_EQ(parseConfiguration("---\n"
11066 "Language: JavaScript\n"
11067 "IndentWidth: 56\n"
11068 "---\n"
11069 "Language: JavaScript\n"
11070 "IndentWidth: 78\n"
11071 "...\n",
11072 &Style),
11073 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011074
11075 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
11076}
Daniel Jasper65ee3472013-07-31 23:16:02 +000011077
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011078#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011079
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011080TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
11081 FormatStyle Style = {};
11082 Style.Language = FormatStyle::LK_JavaScript;
11083 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011084 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000011085 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011086
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011087 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011088 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011089 "BasedOnStyle: Google\n"
11090 "---\n"
11091 "Language: JavaScript\n"
11092 "IndentWidth: 76\n"
11093 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011094 &Style)
11095 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000011096 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011097 EXPECT_EQ(76u, Style.IndentWidth);
11098 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
11099}
11100
Alexander Kornienkod6538332013-05-07 15:32:14 +000011101TEST_F(FormatTest, ConfigurationRoundTripTest) {
11102 FormatStyle Style = getLLVMStyle();
11103 std::string YAML = configurationAsText(Style);
11104 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011105 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000011106 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
11107 EXPECT_EQ(Style, ParsedStyle);
11108}
11109
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011110TEST_F(FormatTest, WorksFor8bitEncodings) {
11111 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
11112 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
11113 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
11114 "\"\xef\xee\xf0\xf3...\"",
11115 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
11116 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
11117 "\xef\xee\xf0\xf3...\"",
11118 getLLVMStyleWithColumns(12)));
11119}
11120
Alexander Kornienko393e3082013-11-13 14:04:17 +000011121TEST_F(FormatTest, HandlesUTF8BOM) {
11122 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
11123 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
11124 format("\xef\xbb\xbf#include <iostream>"));
11125 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
11126 format("\xef\xbb\xbf\n#include <iostream>"));
11127}
11128
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000011129// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
11130#if !defined(_MSC_VER)
11131
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011132TEST_F(FormatTest, CountsUTF8CharactersProperly) {
11133 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
11134 getLLVMStyleWithColumns(35));
11135 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011136 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011137 verifyFormat("// Однажды в студёную зимнюю пору...",
11138 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000011139 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011140 verifyFormat("/* Однажды в студёную зимнюю пору... */",
11141 getLLVMStyleWithColumns(39));
11142 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011143 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011144}
11145
11146TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000011147 // Non-printable characters' width is currently considered to be the length in
11148 // bytes in UTF8. The characters can be displayed in very different manner
11149 // (zero-width, single width with a substitution glyph, expanded to their code
11150 // (e.g. "<8d>"), so there's no single correct way to handle them.
11151 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011152 "\"\xc2\x8d\";",
11153 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000011154 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011155 "\"\xc2\x8d\";",
11156 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000011157 EXPECT_EQ("\"Однажды, в \"\n"
11158 "\"студёную \"\n"
11159 "\"зимнюю \"\n"
11160 "\"пору,\"",
11161 format("\"Однажды, в студёную зимнюю пору,\"",
11162 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011163 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000011164 "\"一 二 三 \"\n"
11165 "\"四 五六 \"\n"
11166 "\"七 八 九 \"\n"
11167 "\"十\"",
11168 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Manuel Klimek93699f42017-11-29 14:29:43 +000011169 EXPECT_EQ("\"一\t\"\n"
11170 "\"二 \t\"\n"
11171 "\"三 四 \"\n"
11172 "\"五\t\"\n"
11173 "\"六 \t\"\n"
11174 "\"七 \"\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011175 "\"八九十\tqq\"",
11176 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
11177 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000011178
11179 // UTF8 character in an escape sequence.
11180 EXPECT_EQ("\"aaaaaa\"\n"
11181 "\"\\\xC2\x8D\"",
11182 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011183}
11184
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011185TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
11186 EXPECT_EQ("const char *sssss =\n"
11187 " \"一二三四五六七八\\\n"
11188 " 九 十\";",
11189 format("const char *sssss = \"一二三四五六七八\\\n"
11190 " 九 十\";",
11191 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011192}
11193
11194TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011195 EXPECT_EQ("// aaaaÄ\xc2\x8d",
11196 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011197 EXPECT_EQ("// Я из лесу\n"
11198 "// вышел; был\n"
11199 "// сильный\n"
11200 "// мороз.",
11201 format("// Я из лесу вышел; был сильный мороз.",
11202 getLLVMStyleWithColumns(13)));
11203 EXPECT_EQ("// 一二三\n"
11204 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011205 "// 八 九\n"
11206 "// 十",
11207 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011208}
11209
11210TEST_F(FormatTest, SplitsUTF8BlockComments) {
11211 EXPECT_EQ("/* Гляжу,\n"
11212 " * поднимается\n"
11213 " * медленно в\n"
11214 " * гору\n"
11215 " * Лошадка,\n"
11216 " * везущая\n"
11217 " * хворосту\n"
11218 " * воз. */",
11219 format("/* Гляжу, поднимается медленно в гору\n"
11220 " * Лошадка, везущая хворосту воз. */",
11221 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011222 EXPECT_EQ(
11223 "/* 一二三\n"
11224 " * 四五六七\n"
11225 " * 八 九\n"
11226 " * 十 */",
11227 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000011228 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
11229 " * 𝕓𝕪𝕥𝕖\n"
11230 " * 𝖀𝕿𝕱-𝟠 */",
11231 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011232}
11233
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011234#endif // _MSC_VER
11235
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011236TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
11237 FormatStyle Style = getLLVMStyle();
11238
11239 Style.ConstructorInitializerIndentWidth = 4;
11240 verifyFormat(
11241 "SomeClass::Constructor()\n"
11242 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11243 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11244 Style);
11245
11246 Style.ConstructorInitializerIndentWidth = 2;
11247 verifyFormat(
11248 "SomeClass::Constructor()\n"
11249 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11250 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11251 Style);
11252
11253 Style.ConstructorInitializerIndentWidth = 0;
11254 verifyFormat(
11255 "SomeClass::Constructor()\n"
11256 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11257 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11258 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000011259 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
11260 verifyFormat(
11261 "SomeLongTemplateVariableName<\n"
11262 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
11263 Style);
11264 verifyFormat(
11265 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
11266 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
11267 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000011268}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011269
Daniel Jasper00853002014-09-16 16:22:30 +000011270TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
11271 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000011272 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011273 Style.ConstructorInitializerIndentWidth = 4;
11274 verifyFormat("SomeClass::Constructor()\n"
11275 " : a(a)\n"
11276 " , b(b)\n"
11277 " , c(c) {}",
11278 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011279 verifyFormat("SomeClass::Constructor()\n"
11280 " : a(a) {}",
11281 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011282
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011283 Style.ColumnLimit = 0;
11284 verifyFormat("SomeClass::Constructor()\n"
11285 " : a(a) {}",
11286 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000011287 verifyFormat("SomeClass::Constructor() noexcept\n"
11288 " : a(a) {}",
11289 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011290 verifyFormat("SomeClass::Constructor()\n"
11291 " : a(a)\n"
11292 " , b(b)\n"
11293 " , c(c) {}",
11294 Style);
11295 verifyFormat("SomeClass::Constructor()\n"
11296 " : a(a) {\n"
11297 " foo();\n"
11298 " bar();\n"
11299 "}",
11300 Style);
11301
Daniel Jasperd74cf402014-04-08 12:46:38 +000011302 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011303 verifyFormat("SomeClass::Constructor()\n"
11304 " : a(a)\n"
11305 " , b(b)\n"
11306 " , c(c) {\n}",
11307 Style);
11308 verifyFormat("SomeClass::Constructor()\n"
11309 " : a(a) {\n}",
11310 Style);
11311
11312 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000011313 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011314 Style.ConstructorInitializerIndentWidth = 2;
11315 verifyFormat("SomeClass::Constructor()\n"
11316 " : a(a)\n"
11317 " , b(b)\n"
11318 " , c(c) {}",
11319 Style);
11320
11321 Style.ConstructorInitializerIndentWidth = 0;
11322 verifyFormat("SomeClass::Constructor()\n"
11323 ": a(a)\n"
11324 ", b(b)\n"
11325 ", c(c) {}",
11326 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011327
11328 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
11329 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011330 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
11331 verifyFormat(
11332 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
11333 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011334 verifyFormat(
11335 "SomeClass::Constructor()\n"
11336 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
11337 Style);
11338 Style.ConstructorInitializerIndentWidth = 4;
11339 Style.ColumnLimit = 60;
11340 verifyFormat("SomeClass::Constructor()\n"
11341 " : aaaaaaaa(aaaaaaaa)\n"
11342 " , aaaaaaaa(aaaaaaaa)\n"
11343 " , aaaaaaaa(aaaaaaaa) {}",
11344 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011345}
11346
Daniel Jasper38efc132014-10-21 07:51:54 +000011347TEST_F(FormatTest, Destructors) {
11348 verifyFormat("void F(int &i) { i.~int(); }");
11349 verifyFormat("void F(int &i) { i->~int(); }");
11350}
11351
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011352TEST_F(FormatTest, FormatsWithWebKitStyle) {
11353 FormatStyle Style = getWebKitStyle();
11354
11355 // Don't indent in outer namespaces.
11356 verifyFormat("namespace outer {\n"
11357 "int i;\n"
11358 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000011359 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011360 "} // namespace inner\n"
11361 "} // namespace outer\n"
11362 "namespace other_outer {\n"
11363 "int i;\n"
11364 "}",
11365 Style);
11366
11367 // Don't indent case labels.
11368 verifyFormat("switch (variable) {\n"
11369 "case 1:\n"
11370 "case 2:\n"
11371 " doSomething();\n"
11372 " break;\n"
11373 "default:\n"
11374 " ++variable;\n"
11375 "}",
11376 Style);
11377
11378 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000011379 EXPECT_EQ("void f()\n"
11380 "{\n"
11381 " if (aaaaaaaaaaaaaaaa\n"
11382 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
11383 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11384 " return;\n"
11385 "}",
11386 format("void f() {\n"
11387 "if (aaaaaaaaaaaaaaaa\n"
11388 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
11389 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11390 "return;\n"
11391 "}",
11392 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011393
Daniel Jasper35995672014-04-29 14:05:20 +000011394 // Allow functions on a single line.
11395 verifyFormat("void f() { return; }", Style);
11396
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011397 // Constructor initializers are formatted one per line with the "," on the
11398 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011399 verifyFormat("Constructor()\n"
11400 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
11401 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000011402 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011403 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
11404 "{\n"
11405 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011406 Style);
11407 verifyFormat("SomeClass::Constructor()\n"
11408 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011409 "{\n"
11410 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011411 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000011412 EXPECT_EQ("SomeClass::Constructor()\n"
11413 " : a(a)\n"
11414 "{\n"
11415 "}",
11416 format("SomeClass::Constructor():a(a){}", Style));
11417 verifyFormat("SomeClass::Constructor()\n"
11418 " : a(a)\n"
11419 " , b(b)\n"
11420 " , c(c)\n"
11421 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011422 "}",
11423 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011424 verifyFormat("SomeClass::Constructor()\n"
11425 " : a(a)\n"
11426 "{\n"
11427 " foo();\n"
11428 " bar();\n"
11429 "}",
11430 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011431
Daniel Jasper65ee3472013-07-31 23:16:02 +000011432 // Access specifiers should be aligned left.
11433 verifyFormat("class C {\n"
11434 "public:\n"
11435 " int i;\n"
11436 "};",
11437 Style);
11438
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011439 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000011440 verifyFormat("int a; // Do not\n"
11441 "double b; // align comments.",
11442 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011443
Daniel Jasper3219e432014-12-02 13:24:51 +000011444 // Do not align operands.
11445 EXPECT_EQ("ASSERT(aaaa\n"
11446 " || bbbb);",
11447 format("ASSERT ( aaaa\n||bbbb);", Style));
11448
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011449 // Accept input's line breaks.
11450 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
11451 " || bbbbbbbbbbbbbbb) {\n"
11452 " i++;\n"
11453 "}",
11454 format("if (aaaaaaaaaaaaaaa\n"
11455 "|| bbbbbbbbbbbbbbb) { i++; }",
11456 Style));
11457 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
11458 " i++;\n"
11459 "}",
11460 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000011461
11462 // Don't automatically break all macro definitions (llvm.org/PR17842).
11463 verifyFormat("#define aNumber 10", Style);
11464 // However, generally keep the line breaks that the user authored.
11465 EXPECT_EQ("#define aNumber \\\n"
11466 " 10",
11467 format("#define aNumber \\\n"
11468 " 10",
11469 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000011470
11471 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011472 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
11473 " copyItems:YES];",
11474 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
11475 "copyItems:YES];",
11476 Style));
11477 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
11478 " copyItems:YES];",
11479 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
11480 " copyItems:YES];",
11481 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000011482 // FIXME: This does not seem right, there should be more indentation before
11483 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011484 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000011485 " @\"a\",\n"
11486 " @\"a\"\n"
11487 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011488 " copyItems:YES];",
11489 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11490 " @\"a\",\n"
11491 " @\"a\"\n"
11492 " ]\n"
11493 " copyItems:YES];",
11494 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011495 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011496 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11497 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011498 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11499 " copyItems:YES];",
11500 Style));
11501
11502 verifyFormat("[self.a b:c c:d];", Style);
11503 EXPECT_EQ("[self.a b:c\n"
11504 " c:d];",
11505 format("[self.a b:c\n"
11506 "c:d];",
11507 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011508}
11509
Manuel Klimekffdeb592013-09-03 15:10:01 +000011510TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011511 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11512 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11513 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11514 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11515 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011516 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Manuel Klimek9f0a4e52017-09-19 09:59:30 +000011517 verifyFormat("auto c = [a = [b = 42] {}] {};\n");
11518 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011519 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011520 verifyFormat("void f() {\n"
11521 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11522 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011523 verifyFormat("void f() {\n"
11524 " other(x.begin(), //\n"
11525 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011526 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011527 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011528 verifyFormat("SomeFunction([]() { // A cool function...\n"
11529 " return 43;\n"
11530 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011531 EXPECT_EQ("SomeFunction([]() {\n"
11532 "#define A a\n"
11533 " return 43;\n"
11534 "});",
11535 format("SomeFunction([](){\n"
11536 "#define A a\n"
11537 "return 43;\n"
11538 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011539 verifyFormat("void f() {\n"
11540 " SomeFunction([](decltype(x), A *a) {});\n"
11541 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011542 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11543 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011544 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11545 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11546 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011547 verifyFormat("Constructor()\n"
11548 " : Field([] { // comment\n"
11549 " int i;\n"
11550 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011551 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11552 " return some_parameter.size();\n"
11553 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011554 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11555 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011556 verifyFormat("int i = aaaaaa ? 1 //\n"
11557 " : [] {\n"
11558 " return 2; //\n"
11559 " }();");
11560 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11561 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11562 " return x == 2; // force break\n"
11563 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011564 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11565 " [=](int iiiiiiiiiiii) {\n"
11566 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
11567 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
11568 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011569 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011570 verifyFormat("SomeFunction({[&] {\n"
11571 " // comment\n"
11572 " },\n"
11573 " [&] {\n"
11574 " // comment\n"
11575 " }});");
11576 verifyFormat("SomeFunction({[&] {\n"
11577 " // comment\n"
11578 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011579 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11580 " [&]() { return true; },\n"
11581 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011582
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011583 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011584 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011585 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011586 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11587 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011588 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011589 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011590 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11591 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011592 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011593 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11594 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011595 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011596 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011597 verifyFormat(
11598 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11599 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11600 " return aaaaaaaaaaaaaaaaa;\n"
11601 " });",
11602 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011603 verifyFormat("[]() //\n"
11604 " -> int {\n"
11605 " return 1; //\n"
11606 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011607
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011608 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011609 verifyFormat("SomeFunction(\n"
11610 " []() {\n"
11611 " int i = 42;\n"
11612 " return i;\n"
11613 " },\n"
11614 " []() {\n"
11615 " int j = 43;\n"
11616 " return j;\n"
11617 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011618
Daniel Jasperda18fd82014-06-10 06:39:03 +000011619 // More complex introducers.
11620 verifyFormat("return [i, args...] {};");
11621
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011622 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011623 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011624 verifyFormat("double &operator[](int i) { return 0; }\n"
11625 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011626 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011627 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011628 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011629
11630 // Other corner cases.
11631 verifyFormat("void f() {\n"
11632 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000011633 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000011634 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011635
11636 // Lambdas created through weird macros.
11637 verifyFormat("void f() {\n"
11638 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011639 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011640 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011641
11642 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11643 " doo_dah();\n"
11644 " doo_dah();\n"
11645 " })) {\n"
11646 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000011647 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
11648 " doo_dah();\n"
11649 " doo_dah();\n"
11650 " })) {\n"
11651 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011652 verifyFormat("auto lambda = []() {\n"
11653 " int a = 2\n"
11654 "#if A\n"
11655 " + 2\n"
11656 "#endif\n"
11657 " ;\n"
11658 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011659
11660 // Lambdas with complex multiline introducers.
11661 verifyFormat(
11662 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11663 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
11664 " -> ::std::unordered_set<\n"
11665 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
11666 " //\n"
11667 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011668}
11669
Martin Probsta004b3f2017-11-17 18:06:33 +000011670TEST_F(FormatTest, EmptyLinesInLambdas) {
11671 verifyFormat("auto lambda = []() {\n"
11672 " x(); //\n"
11673 "};",
11674 "auto lambda = []() {\n"
11675 "\n"
11676 " x(); //\n"
11677 "\n"
11678 "};");
11679}
11680
Manuel Klimek516e0542013-09-04 13:25:30 +000011681TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011682 FormatStyle ShortBlocks = getLLVMStyle();
11683 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11684 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11685 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11686 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11687 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11688 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11689 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011690
Daniel Jasper76284682014-10-22 09:12:44 +000011691 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11692 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11693 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011694
Daniel Jasper76284682014-10-22 09:12:44 +000011695 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011696 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011697 "}];");
11698 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011699 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011700 "}]};");
11701 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011702 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011703 "}];");
11704 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011705 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011706 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011707 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011708 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011709 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011710 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011711 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011712
11713 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011714 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011715 "}];",
11716 getLLVMStyleWithColumns(60));
11717 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011718 " NSString *path = [self sessionFilePath];\n"
11719 " if (path) {\n"
11720 " // ...\n"
11721 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011722 "});");
11723 verifyFormat("[[SessionService sharedService]\n"
11724 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011725 " if (window) {\n"
11726 " [self windowDidLoad:window];\n"
11727 " } else {\n"
11728 " [self errorLoadingWindow];\n"
11729 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011730 " }];");
11731 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011732 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011733 "};\n",
11734 getLLVMStyleWithColumns(40));
11735 verifyFormat("[[SessionService sharedService]\n"
11736 " loadWindowWithCompletionBlock: //\n"
11737 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011738 " if (window) {\n"
11739 " [self windowDidLoad:window];\n"
11740 " } else {\n"
11741 " [self errorLoadingWindow];\n"
11742 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011743 " }];",
11744 getLLVMStyleWithColumns(60));
11745 verifyFormat("[myObject doSomethingWith:arg1\n"
11746 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011747 " // ...\n"
11748 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011749 " }\n"
11750 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011751 " // ...\n"
11752 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011753 " }\n"
11754 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011755 " // ...\n"
11756 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011757 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011758 verifyFormat("[myObject doSomethingWith:arg1\n"
11759 " firstBlock:-1\n"
11760 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011761 " // ...\n"
11762 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011763 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011764
11765 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011766 " @autoreleasepool {\n"
11767 " if (a) {\n"
11768 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011769 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011770 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011771 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011772 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011773 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11774 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011775
11776 FormatStyle FourIndent = getLLVMStyle();
11777 FourIndent.ObjCBlockIndentWidth = 4;
11778 verifyFormat("[operation setCompletionBlock:^{\n"
11779 " [self onOperationDone];\n"
11780 "}];",
11781 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011782}
11783
Daniel Jasper289afc02015-04-23 09:23:17 +000011784TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11785 FormatStyle ZeroColumn = getLLVMStyle();
11786 ZeroColumn.ColumnLimit = 0;
11787
11788 verifyFormat("[[SessionService sharedService] "
11789 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11790 " if (window) {\n"
11791 " [self windowDidLoad:window];\n"
11792 " } else {\n"
11793 " [self errorLoadingWindow];\n"
11794 " }\n"
11795 "}];",
11796 ZeroColumn);
11797 EXPECT_EQ("[[SessionService sharedService]\n"
11798 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11799 " if (window) {\n"
11800 " [self windowDidLoad:window];\n"
11801 " } else {\n"
11802 " [self errorLoadingWindow];\n"
11803 " }\n"
11804 " }];",
11805 format("[[SessionService sharedService]\n"
11806 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11807 " if (window) {\n"
11808 " [self windowDidLoad:window];\n"
11809 " } else {\n"
11810 " [self errorLoadingWindow];\n"
11811 " }\n"
11812 "}];",
11813 ZeroColumn));
11814 verifyFormat("[myObject doSomethingWith:arg1\n"
11815 " firstBlock:^(Foo *a) {\n"
11816 " // ...\n"
11817 " int i;\n"
11818 " }\n"
11819 " secondBlock:^(Bar *b) {\n"
11820 " // ...\n"
11821 " int i;\n"
11822 " }\n"
11823 " thirdBlock:^Foo(Bar *b) {\n"
11824 " // ...\n"
11825 " int i;\n"
11826 " }];",
11827 ZeroColumn);
11828 verifyFormat("f(^{\n"
11829 " @autoreleasepool {\n"
11830 " if (a) {\n"
11831 " g();\n"
11832 " }\n"
11833 " }\n"
11834 "});",
11835 ZeroColumn);
11836 verifyFormat("void (^largeBlock)(void) = ^{\n"
11837 " // ...\n"
11838 "};",
11839 ZeroColumn);
11840
11841 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11842 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011843 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011844 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11845 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11846 " int i;\n"
11847 "};",
11848 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11849}
11850
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011851TEST_F(FormatTest, SupportsCRLF) {
11852 EXPECT_EQ("int a;\r\n"
11853 "int b;\r\n"
11854 "int c;\r\n",
11855 format("int a;\r\n"
11856 " int b;\r\n"
11857 " int c;\r\n",
11858 getLLVMStyle()));
11859 EXPECT_EQ("int a;\r\n"
11860 "int b;\r\n"
11861 "int c;\r\n",
11862 format("int a;\r\n"
11863 " int b;\n"
11864 " int c;\r\n",
11865 getLLVMStyle()));
11866 EXPECT_EQ("int a;\n"
11867 "int b;\n"
11868 "int c;\n",
11869 format("int a;\r\n"
11870 " int b;\n"
11871 " int c;\n",
11872 getLLVMStyle()));
11873 EXPECT_EQ("\"aaaaaaa \"\r\n"
11874 "\"bbbbbbb\";\r\n",
11875 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11876 EXPECT_EQ("#define A \\\r\n"
11877 " b; \\\r\n"
11878 " c; \\\r\n"
11879 " d;\r\n",
11880 format("#define A \\\r\n"
11881 " b; \\\r\n"
11882 " c; d; \r\n",
11883 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011884
11885 EXPECT_EQ("/*\r\n"
11886 "multi line block comments\r\n"
11887 "should not introduce\r\n"
11888 "an extra carriage return\r\n"
11889 "*/\r\n",
11890 format("/*\r\n"
11891 "multi line block comments\r\n"
11892 "should not introduce\r\n"
11893 "an extra carriage return\r\n"
11894 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011895}
11896
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011897TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11898 verifyFormat("MY_CLASS(C) {\n"
11899 " int i;\n"
11900 " int j;\n"
11901 "};");
11902}
11903
Daniel Jasper6633ab82013-10-18 10:38:14 +000011904TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11905 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11906 TwoIndent.ContinuationIndentWidth = 2;
11907
11908 EXPECT_EQ("int i =\n"
11909 " longFunction(\n"
11910 " arg);",
11911 format("int i = longFunction(arg);", TwoIndent));
11912
11913 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11914 SixIndent.ContinuationIndentWidth = 6;
11915
11916 EXPECT_EQ("int i =\n"
11917 " longFunction(\n"
11918 " arg);",
11919 format("int i = longFunction(arg);", SixIndent));
11920}
11921
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011922TEST_F(FormatTest, SpacesInAngles) {
11923 FormatStyle Spaces = getLLVMStyle();
11924 Spaces.SpacesInAngles = true;
11925
11926 verifyFormat("static_cast< int >(arg);", Spaces);
11927 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11928 verifyFormat("f< int, float >();", Spaces);
11929 verifyFormat("template <> g() {}", Spaces);
11930 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011931 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11932 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11933 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011934
11935 Spaces.Standard = FormatStyle::LS_Cpp03;
11936 Spaces.SpacesInAngles = true;
11937 verifyFormat("A< A< int > >();", Spaces);
11938
11939 Spaces.SpacesInAngles = false;
11940 verifyFormat("A<A<int> >();", Spaces);
11941
11942 Spaces.Standard = FormatStyle::LS_Cpp11;
11943 Spaces.SpacesInAngles = true;
11944 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011945
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011946 Spaces.SpacesInAngles = false;
11947 verifyFormat("A<A<int>>();", Spaces);
11948}
11949
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011950TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11951 FormatStyle Style = getLLVMStyle();
11952 Style.SpaceAfterTemplateKeyword = false;
11953 verifyFormat("template<int> void foo();", Style);
11954}
11955
Jacques Pienaarfc275112015-02-18 23:48:37 +000011956TEST_F(FormatTest, TripleAngleBrackets) {
11957 verifyFormat("f<<<1, 1>>>();");
11958 verifyFormat("f<<<1, 1, 1, s>>>();");
11959 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011960 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011961 verifyFormat("f<param><<<1, 1>>>();");
11962 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011963 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011964 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11965 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011966 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11967 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011968}
11969
11970TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011971 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011972 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011973 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11974 "aaallvm::outs() <<");
11975 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11976 "aaaallvm::outs()\n <<");
11977}
11978
Manuel Klimek819788d2014-03-18 11:22:45 +000011979TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11980 std::string code = "#if A\n"
11981 "#if B\n"
11982 "a.\n"
11983 "#endif\n"
11984 " a = 1;\n"
11985 "#else\n"
11986 "#endif\n"
11987 "#if C\n"
11988 "#else\n"
11989 "#endif\n";
11990 EXPECT_EQ(code, format(code));
11991}
11992
Manuel Klimek68b03042014-04-14 09:14:11 +000011993TEST_F(FormatTest, HandleConflictMarkers) {
11994 // Git/SVN conflict markers.
11995 EXPECT_EQ("int a;\n"
11996 "void f() {\n"
11997 " callme(some(parameter1,\n"
11998 "<<<<<<< text by the vcs\n"
11999 " parameter2),\n"
12000 "||||||| text by the vcs\n"
12001 " parameter2),\n"
12002 " parameter3,\n"
12003 "======= text by the vcs\n"
12004 " parameter2, parameter3),\n"
12005 ">>>>>>> text by the vcs\n"
12006 " otherparameter);\n",
12007 format("int a;\n"
12008 "void f() {\n"
12009 " callme(some(parameter1,\n"
12010 "<<<<<<< text by the vcs\n"
12011 " parameter2),\n"
12012 "||||||| text by the vcs\n"
12013 " parameter2),\n"
12014 " parameter3,\n"
12015 "======= text by the vcs\n"
12016 " parameter2,\n"
12017 " parameter3),\n"
12018 ">>>>>>> text by the vcs\n"
12019 " otherparameter);\n"));
12020
12021 // Perforce markers.
12022 EXPECT_EQ("void f() {\n"
12023 " function(\n"
12024 ">>>> text by the vcs\n"
12025 " parameter,\n"
12026 "==== text by the vcs\n"
12027 " parameter,\n"
12028 "==== text by the vcs\n"
12029 " parameter,\n"
12030 "<<<< text by the vcs\n"
12031 " parameter);\n",
12032 format("void f() {\n"
12033 " function(\n"
12034 ">>>> text by the vcs\n"
12035 " parameter,\n"
12036 "==== text by the vcs\n"
12037 " parameter,\n"
12038 "==== text by the vcs\n"
12039 " parameter,\n"
12040 "<<<< text by the vcs\n"
12041 " parameter);\n"));
12042
12043 EXPECT_EQ("<<<<<<<\n"
12044 "|||||||\n"
12045 "=======\n"
12046 ">>>>>>>",
12047 format("<<<<<<<\n"
12048 "|||||||\n"
12049 "=======\n"
12050 ">>>>>>>"));
12051
12052 EXPECT_EQ("<<<<<<<\n"
12053 "|||||||\n"
12054 "int i;\n"
12055 "=======\n"
12056 ">>>>>>>",
12057 format("<<<<<<<\n"
12058 "|||||||\n"
12059 "int i;\n"
12060 "=======\n"
12061 ">>>>>>>"));
12062
12063 // FIXME: Handle parsing of macros around conflict markers correctly:
12064 EXPECT_EQ("#define Macro \\\n"
12065 "<<<<<<<\n"
12066 "Something \\\n"
12067 "|||||||\n"
12068 "Else \\\n"
12069 "=======\n"
12070 "Other \\\n"
12071 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000012072 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000012073 format("#define Macro \\\n"
12074 "<<<<<<<\n"
12075 " Something \\\n"
12076 "|||||||\n"
12077 " Else \\\n"
12078 "=======\n"
12079 " Other \\\n"
12080 ">>>>>>>\n"
12081 " End\n"
12082 "int i;\n"));
12083}
12084
Daniel Jasper471894432014-08-06 13:40:26 +000012085TEST_F(FormatTest, DisableRegions) {
12086 EXPECT_EQ("int i;\n"
12087 "// clang-format off\n"
12088 " int j;\n"
12089 "// clang-format on\n"
12090 "int k;",
12091 format(" int i;\n"
12092 " // clang-format off\n"
12093 " int j;\n"
12094 " // clang-format on\n"
12095 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000012096 EXPECT_EQ("int i;\n"
12097 "/* clang-format off */\n"
12098 " int j;\n"
12099 "/* clang-format on */\n"
12100 "int k;",
12101 format(" int i;\n"
12102 " /* clang-format off */\n"
12103 " int j;\n"
12104 " /* clang-format on */\n"
12105 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000012106
12107 // Don't reflow comments within disabled regions.
12108 EXPECT_EQ(
12109 "// clang-format off\n"
12110 "// long long long long long long line\n"
12111 "/* clang-format on */\n"
12112 "/* long long long\n"
12113 " * long long long\n"
12114 " * line */\n"
12115 "int i;\n"
12116 "/* clang-format off */\n"
12117 "/* long long long long long long line */\n",
12118 format("// clang-format off\n"
12119 "// long long long long long long line\n"
12120 "/* clang-format on */\n"
12121 "/* long long long long long long line */\n"
12122 "int i;\n"
12123 "/* clang-format off */\n"
12124 "/* long long long long long long line */\n",
12125 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000012126}
12127
Manuel Klimekf0c95b32015-06-11 10:14:13 +000012128TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
12129 format("? ) =");
12130 verifyNoCrash("#define a\\\n /**/}");
12131}
Manuel Klimek5f594f82014-08-13 14:00:41 +000012132
Daniel Jasper498f5582015-12-25 08:53:31 +000012133TEST_F(FormatTest, FormatsTableGenCode) {
12134 FormatStyle Style = getLLVMStyle();
12135 Style.Language = FormatStyle::LK_TableGen;
12136 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
12137}
12138
Nico Weberb2673a12016-11-10 21:49:25 +000012139TEST_F(FormatTest, ArrayOfTemplates) {
12140 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
12141 format("auto a = new unique_ptr<int > [ 10];"));
12142
12143 FormatStyle Spaces = getLLVMStyle();
12144 Spaces.SpacesInSquareBrackets = true;
12145 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
12146 format("auto a = new unique_ptr<int > [10];", Spaces));
12147}
12148
12149TEST_F(FormatTest, ArrayAsTemplateType) {
12150 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
12151 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
12152
12153 FormatStyle Spaces = getLLVMStyle();
12154 Spaces.SpacesInSquareBrackets = true;
12155 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
12156 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
12157}
12158
Martin Probstc9c51c42017-03-16 10:21:35 +000012159TEST_F(FormatTest, NoSpaceAfterSuper) {
12160 verifyFormat("__super::FooBar();");
12161}
12162
Ben Hamilton07e58362018-02-21 21:27:27 +000012163TEST(FormatStyle, GetStyleWithEmptyFileName) {
Bjorn Pettersson0b2f7742018-02-26 14:14:11 +000012164 vfs::InMemoryFileSystem FS;
12165 auto Style1 = getStyle("file", "", "Google", "", &FS);
Ben Hamilton07e58362018-02-21 21:27:27 +000012166 ASSERT_TRUE((bool)Style1);
12167 ASSERT_EQ(*Style1, getGoogleStyle());
12168}
12169
Eric Liu547d8792016-03-24 13:22:42 +000012170TEST(FormatStyle, GetStyleOfFile) {
12171 vfs::InMemoryFileSystem FS;
12172 // Test 1: format file in the same directory.
12173 ASSERT_TRUE(
12174 FS.addFile("/a/.clang-format", 0,
12175 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
12176 ASSERT_TRUE(
12177 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012178 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012179 ASSERT_TRUE((bool)Style1);
12180 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000012181
Antonio Maiorano7eb75072017-01-20 01:22:42 +000012182 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000012183 ASSERT_TRUE(
12184 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012185 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012186 ASSERT_TRUE((bool)Style2);
12187 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000012188
Antonio Maiorano7eb75072017-01-20 01:22:42 +000012189 // Test 2.2: no format on 'none' fallback style.
12190 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
12191 ASSERT_TRUE((bool)Style2);
12192 ASSERT_EQ(*Style2, getNoStyle());
12193
12194 // Test 2.3: format if config is found with no based style while fallback is
12195 // 'none'.
12196 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
12197 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
12198 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
12199 ASSERT_TRUE((bool)Style2);
12200 ASSERT_EQ(*Style2, getLLVMStyle());
12201
12202 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
12203 Style2 = getStyle("{}", "a.h", "none", "", &FS);
12204 ASSERT_TRUE((bool)Style2);
12205 ASSERT_EQ(*Style2, getLLVMStyle());
12206
Eric Liu547d8792016-03-24 13:22:42 +000012207 // Test 3: format file in parent directory.
12208 ASSERT_TRUE(
12209 FS.addFile("/c/.clang-format", 0,
12210 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
12211 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
12212 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012213 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012214 ASSERT_TRUE((bool)Style3);
12215 ASSERT_EQ(*Style3, getGoogleStyle());
12216
12217 // Test 4: error on invalid fallback style
12218 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
12219 ASSERT_FALSE((bool)Style4);
12220 llvm::consumeError(Style4.takeError());
12221
12222 // Test 5: error on invalid yaml on command line
12223 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
12224 ASSERT_FALSE((bool)Style5);
12225 llvm::consumeError(Style5.takeError());
12226
12227 // Test 6: error on invalid style
12228 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
12229 ASSERT_FALSE((bool)Style6);
12230 llvm::consumeError(Style6.takeError());
12231
12232 // Test 7: found config file, error on parsing it
12233 ASSERT_TRUE(
12234 FS.addFile("/d/.clang-format", 0,
12235 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
12236 "InvalidKey: InvalidValue")));
12237 ASSERT_TRUE(
12238 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
12239 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
12240 ASSERT_FALSE((bool)Style7);
12241 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000012242}
12243
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012244TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
12245 // Column limit is 20.
12246 std::string Code = "Type *a =\n"
12247 " new Type();\n"
12248 "g(iiiii, 0, jjjjj,\n"
12249 " 0, kkkkk, 0, mm);\n"
12250 "int bad = format ;";
12251 std::string Expected = "auto a = new Type();\n"
12252 "g(iiiii, nullptr,\n"
12253 " jjjjj, nullptr,\n"
12254 " kkkkk, nullptr,\n"
12255 " mm);\n"
12256 "int bad = format ;";
12257 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000012258 tooling::Replacements Replaces = toReplacements(
12259 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
12260 "auto "),
12261 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
12262 "nullptr"),
12263 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
12264 "nullptr"),
12265 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
12266 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012267
12268 format::FormatStyle Style = format::getLLVMStyle();
12269 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000012270 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
12271 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
12272 << llvm::toString(FormattedReplaces.takeError()) << "\n";
12273 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12274 EXPECT_TRUE(static_cast<bool>(Result));
12275 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012276}
12277
Eric Liubaf58c22016-05-18 13:43:48 +000012278TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
12279 std::string Code = "#include \"a.h\"\n"
12280 "#include \"c.h\"\n"
12281 "\n"
12282 "int main() {\n"
12283 " return 0;\n"
12284 "}";
12285 std::string Expected = "#include \"a.h\"\n"
12286 "#include \"b.h\"\n"
12287 "#include \"c.h\"\n"
12288 "\n"
12289 "int main() {\n"
12290 " return 0;\n"
12291 "}";
12292 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000012293 tooling::Replacements Replaces = toReplacements(
12294 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
12295 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000012296
12297 format::FormatStyle Style = format::getLLVMStyle();
12298 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000012299 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
12300 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
12301 << llvm::toString(FormattedReplaces.takeError()) << "\n";
12302 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12303 EXPECT_TRUE(static_cast<bool>(Result));
12304 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000012305}
12306
Krasimir Georgievac16a202017-06-23 11:46:03 +000012307TEST_F(FormatTest, FormatSortsUsingDeclarations) {
12308 EXPECT_EQ("using std::cin;\n"
12309 "using std::cout;",
12310 format("using std::cout;\n"
12311 "using std::cin;", getGoogleStyle()));
12312}
12313
Nico Weberdc065182017-04-05 18:10:42 +000012314TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
12315 format::FormatStyle Style = format::getLLVMStyle();
12316 Style.Standard = FormatStyle::LS_Cpp03;
12317 // cpp03 recognize this string as identifier u8 and literal character 'a'
12318 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
12319}
12320
12321TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
12322 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
12323 // all modes, including C++11, C++14 and C++17
12324 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
12325}
12326
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000012327TEST_F(FormatTest, DoNotFormatLikelyXml) {
12328 EXPECT_EQ("<!-- ;> -->",
12329 format("<!-- ;> -->", getGoogleStyle()));
12330 EXPECT_EQ(" <!-- >; -->",
12331 format(" <!-- >; -->", getGoogleStyle()));
12332}
12333
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012334TEST_F(FormatTest, StructuredBindings) {
12335 // Structured bindings is a C++17 feature.
12336 // all modes, including C++11, C++14 and C++17
12337 verifyFormat("auto [a, b] = f();");
12338 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
12339 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();"));
12340 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();"));
12341 EXPECT_EQ("auto const volatile [a, b] = f();",
12342 format("auto const volatile[a, b] = f();"));
12343 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012344 EXPECT_EQ("auto &[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012345 format("auto &[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012346 EXPECT_EQ("auto &&[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012347 format("auto &&[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012348 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();"));
12349 EXPECT_EQ("auto const volatile &&[a, b] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012350 format("auto const volatile &&[a, b] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012351 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();"));
12352 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();"));
12353 EXPECT_EQ("const auto volatile &&[a, b] = f();",
12354 format("const auto volatile &&[a, b] = f();"));
12355 EXPECT_EQ("volatile const auto &&[a, b] = f();",
12356 format("volatile const auto &&[a, b] = f();"));
12357 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();"));
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012358
Manuel Klimeke411aa82017-09-20 09:29:37 +000012359 // Make sure we don't mistake structured bindings for lambdas.
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012360 FormatStyle PointerMiddle = getLLVMStyle();
12361 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
12362 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
12363 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
12364 verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
12365 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
12366 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
12367 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
12368 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
12369 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
12370 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
12371 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
12372 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
12373 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
12374
12375 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
12376 format("for (const auto && [a, b] : some_range) {\n}"));
12377 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
12378 format("for (const auto & [a, b] : some_range) {\n}"));
12379 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
12380 format("for (const auto[a, b] : some_range) {\n}"));
12381 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);"));
12382 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);"));
12383 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);"));
12384 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);"));
12385 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);"));
12386 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};"));
12387 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};"));
12388 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};"));
Manuel Klimeke411aa82017-09-20 09:29:37 +000012389
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012390 format::FormatStyle Spaces = format::getLLVMStyle();
12391 Spaces.SpacesInSquareBrackets = true;
12392 verifyFormat("auto [ a, b ] = f();", Spaces);
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012393 verifyFormat("auto &&[ a, b ] = f();", Spaces);
12394 verifyFormat("auto &[ a, b ] = f();", Spaces);
12395 verifyFormat("auto const &&[ a, b ] = f();", Spaces);
12396 verifyFormat("auto const &[ a, b ] = f();", Spaces);
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012397}
12398
Ben Hamilton6e066352018-02-27 15:56:40 +000012399TEST_F(FormatTest, FileAndCode) {
12400 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
12401 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
12402 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
12403 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
12404 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
Ben Hamiltonb1a79192018-04-12 15:11:53 +000012405 EXPECT_EQ(
12406 FormatStyle::LK_ObjC,
12407 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
12408 EXPECT_EQ(FormatStyle::LK_ObjC,
12409 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
12410 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
Ben Hamilton6e066352018-02-27 15:56:40 +000012411 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
12412 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
Ben Hamilton19c782d2018-03-22 03:25:22 +000012413 EXPECT_EQ(FormatStyle::LK_ObjC,
12414 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
12415 EXPECT_EQ(
12416 FormatStyle::LK_ObjC,
12417 guessLanguage("foo.h",
12418 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
Ben Hamilton9dc78162018-04-03 14:07:11 +000012419 EXPECT_EQ(
12420 FormatStyle::LK_Cpp,
12421 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
Ben Hamilton3b345c32018-02-21 15:54:31 +000012422}
12423
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012424TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
12425 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
12426 EXPECT_EQ(FormatStyle::LK_ObjC,
12427 guessLanguage("foo.h", "array[[calculator getIndex]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012428 EXPECT_EQ(FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012429 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012430 EXPECT_EQ(
12431 FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012432 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
12433 EXPECT_EQ(FormatStyle::LK_ObjC,
12434 guessLanguage("foo.h", "[[noreturn foo] bar];"));
12435 EXPECT_EQ(FormatStyle::LK_Cpp,
12436 guessLanguage("foo.h", "[[clang::fallthrough]];"));
12437 EXPECT_EQ(FormatStyle::LK_ObjC,
12438 guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
12439 EXPECT_EQ(FormatStyle::LK_Cpp,
12440 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
12441 EXPECT_EQ(FormatStyle::LK_Cpp,
12442 guessLanguage("foo.h", "[[using clang: fallthrough]];"));
12443 EXPECT_EQ(FormatStyle::LK_ObjC,
12444 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
12445 EXPECT_EQ(FormatStyle::LK_Cpp,
12446 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
12447 EXPECT_EQ(
12448 FormatStyle::LK_Cpp,
12449 guessLanguage("foo.h",
12450 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
12451 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012452}
12453
Ben Hamilton788a2222018-03-12 15:42:40 +000012454TEST_F(FormatTest, GuessLanguageWithCaret) {
12455 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
12456 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
12457 EXPECT_EQ(FormatStyle::LK_ObjC,
12458 guessLanguage("foo.h", "int(^)(char, float);"));
12459 EXPECT_EQ(FormatStyle::LK_ObjC,
12460 guessLanguage("foo.h", "int(^foo)(char, float);"));
12461 EXPECT_EQ(FormatStyle::LK_ObjC,
12462 guessLanguage("foo.h", "int(^foo[10])(char, float);"));
12463 EXPECT_EQ(FormatStyle::LK_ObjC,
12464 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
12465 EXPECT_EQ(
12466 FormatStyle::LK_ObjC,
12467 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
12468}
12469
Ben Hamilton6432afe2018-03-22 17:37:19 +000012470TEST_F(FormatTest, GuessLanguageWithChildLines) {
12471 EXPECT_EQ(FormatStyle::LK_Cpp,
12472 guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
12473 EXPECT_EQ(FormatStyle::LK_ObjC,
12474 guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
Ben Hamiltonea7a27b2018-03-27 15:01:21 +000012475 EXPECT_EQ(
12476 FormatStyle::LK_Cpp,
12477 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
12478 EXPECT_EQ(
12479 FormatStyle::LK_ObjC,
12480 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
Ben Hamilton6432afe2018-03-22 17:37:19 +000012481}
12482
Daniel Jasperd246a5a2015-06-15 15:25:11 +000012483} // end namespace
12484} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000012485} // end namespace clang