blob: 2b61a96a2198cbde7c46f98300b560b392736a9d [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()));
Daniel Jasper031e2402014-04-28 07:48:36 +00001002 verifyFormat("switch (a) {\n"
1003 "case (b):\n"
1004 " return;\n"
1005 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +00001006
1007 verifyFormat("switch (a) {\n"
1008 "case some_namespace::\n"
1009 " some_constant:\n"
1010 " return;\n"
1011 "}",
1012 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +00001013}
1014
Daniel Jasper2d0cd492013-10-20 16:56:16 +00001015TEST_F(FormatTest, CaseRanges) {
1016 verifyFormat("switch (x) {\n"
1017 "case 'A' ... 'Z':\n"
1018 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +00001019 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +00001020 " break;\n"
1021 "}");
1022}
1023
Daniel Jasperb87899b2014-09-10 13:11:45 +00001024TEST_F(FormatTest, ShortCaseLabels) {
1025 FormatStyle Style = getLLVMStyle();
1026 Style.AllowShortCaseLabelsOnASingleLine = true;
1027 verifyFormat("switch (a) {\n"
1028 "case 1: x = 1; break;\n"
1029 "case 2: return;\n"
1030 "case 3:\n"
1031 "case 4:\n"
1032 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +00001033 "case 6: // comment\n"
1034 " return;\n"
1035 "case 7:\n"
1036 " // comment\n"
1037 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +00001038 "case 8:\n"
1039 " x = 8; // comment\n"
1040 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001041 "default: y = 1; break;\n"
1042 "}",
1043 Style);
1044 verifyFormat("switch (a) {\n"
Francois Ferranda64ba702017-07-28 07:56:18 +00001045 "case 0: return; // comment\n"
1046 "case 1: break; // comment\n"
1047 "case 2: return;\n"
1048 "// comment\n"
1049 "case 3: return;\n"
1050 "// comment 1\n"
1051 "// comment 2\n"
1052 "// comment 3\n"
1053 "case 4: break; /* comment */\n"
1054 "case 5:\n"
1055 " // comment\n"
1056 " break;\n"
1057 "case 6: /* comment */ x = 1; break;\n"
1058 "case 7: x = /* comment */ 1; break;\n"
1059 "case 8:\n"
1060 " x = 1; /* comment */\n"
1061 " break;\n"
1062 "case 9:\n"
1063 " break; // comment line 1\n"
1064 " // comment line 2\n"
1065 "}",
1066 Style);
1067 EXPECT_EQ("switch (a) {\n"
1068 "case 1:\n"
1069 " x = 8;\n"
1070 " // fall through\n"
1071 "case 2: x = 8;\n"
1072 "// comment\n"
1073 "case 3:\n"
1074 " return; /* comment line 1\n"
1075 " * comment line 2 */\n"
1076 "case 4: i = 8;\n"
1077 "// something else\n"
1078 "#if FOO\n"
1079 "case 5: break;\n"
1080 "#endif\n"
1081 "}",
1082 format("switch (a) {\n"
1083 "case 1: x = 8;\n"
1084 " // fall through\n"
1085 "case 2:\n"
1086 " x = 8;\n"
1087 "// comment\n"
1088 "case 3:\n"
1089 " return; /* comment line 1\n"
1090 " * comment line 2 */\n"
1091 "case 4:\n"
1092 " i = 8;\n"
1093 "// something else\n"
1094 "#if FOO\n"
1095 "case 5: break;\n"
1096 "#endif\n"
1097 "}",
1098 Style));
1099 EXPECT_EQ("switch (a) {\n" "case 0:\n"
1100 " return; // long long long long long long long long long long long long comment\n"
1101 " // line\n" "}",
1102 format("switch (a) {\n"
1103 "case 0: return; // long long long long long long long long long long long long comment line\n"
1104 "}",
1105 Style));
1106 EXPECT_EQ("switch (a) {\n"
1107 "case 0:\n"
1108 " return; /* long long long long long long long long long long long long comment\n"
1109 " line */\n"
1110 "}",
1111 format("switch (a) {\n"
1112 "case 0: return; /* long long long long long long long long long long long long comment line */\n"
1113 "}",
1114 Style));
1115 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +00001116 "#if FOO\n"
1117 "case 0: return 0;\n"
1118 "#endif\n"
1119 "}",
1120 Style);
1121 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001122 "case 1: {\n"
1123 "}\n"
1124 "case 2: {\n"
1125 " return;\n"
1126 "}\n"
1127 "case 3: {\n"
1128 " x = 1;\n"
1129 " return;\n"
1130 "}\n"
1131 "case 4:\n"
1132 " if (x)\n"
1133 " return;\n"
1134 "}",
1135 Style);
1136 Style.ColumnLimit = 21;
1137 verifyFormat("switch (a) {\n"
1138 "case 1: x = 1; break;\n"
1139 "case 2: return;\n"
1140 "case 3:\n"
1141 "case 4:\n"
1142 "case 5: return;\n"
1143 "default:\n"
1144 " y = 1;\n"
1145 " break;\n"
1146 "}",
1147 Style);
1148}
1149
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001150TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +00001151 verifyFormat("void f() {\n"
1152 " some_code();\n"
1153 "test_label:\n"
1154 " some_other_code();\n"
1155 " {\n"
1156 " some_more_code();\n"
1157 " another_label:\n"
1158 " some_more_code();\n"
1159 " }\n"
1160 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +00001161 verifyFormat("{\n"
1162 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00001163 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +00001164 " some_other_code();\n"
1165 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +00001166 verifyFormat("{\n"
1167 " some_code();\n"
1168 "test_label:;\n"
1169 " int i = 0;\n"
1170 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00001171}
1172
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001173//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001174// Tests for classes, namespaces, etc.
1175//===----------------------------------------------------------------------===//
1176
1177TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001178 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001179}
1180
1181TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1182 verifyFormat("class A {\n"
1183 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001184 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001185 "protected:\n"
1186 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001187 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001188 "};");
1189 verifyGoogleFormat("class A {\n"
1190 " public:\n"
1191 " protected:\n"
1192 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001193 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001194 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001195 verifyFormat("class A {\n"
1196 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001197 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001198 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001199 " void f2() {}\n"
1200 "protected slots:\n"
1201 " void f3() {}\n"
1202 "protected Q_SLOTS:\n"
1203 " void f4() {}\n"
1204 "private slots:\n"
1205 " void f5() {}\n"
1206 "private Q_SLOTS:\n"
1207 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001208 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001209 " void g1();\n"
1210 "Q_SIGNALS:\n"
1211 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001212 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001213
1214 // Don't interpret 'signals' the wrong way.
1215 verifyFormat("signals.set();");
1216 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001217 verifyFormat("{\n"
1218 " signals.set(); // This needs indentation.\n"
1219 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001220 verifyFormat("void f() {\n"
1221 "label:\n"
1222 " signals.baz();\n"
1223 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001224}
1225
Alexander Kornienkofd433362013-03-27 17:08:02 +00001226TEST_F(FormatTest, SeparatesLogicalBlocks) {
1227 EXPECT_EQ("class A {\n"
1228 "public:\n"
1229 " void f();\n"
1230 "\n"
1231 "private:\n"
1232 " void g() {}\n"
1233 " // test\n"
1234 "protected:\n"
1235 " int h;\n"
1236 "};",
1237 format("class A {\n"
1238 "public:\n"
1239 "void f();\n"
1240 "private:\n"
1241 "void g() {}\n"
1242 "// test\n"
1243 "protected:\n"
1244 "int h;\n"
1245 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001246 EXPECT_EQ("class A {\n"
1247 "protected:\n"
1248 "public:\n"
1249 " void f();\n"
1250 "};",
1251 format("class A {\n"
1252 "protected:\n"
1253 "\n"
1254 "public:\n"
1255 "\n"
1256 " void f();\n"
1257 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00001258
1259 // Even ensure proper spacing inside macros.
1260 EXPECT_EQ("#define B \\\n"
1261 " class A { \\\n"
1262 " protected: \\\n"
1263 " public: \\\n"
1264 " void f(); \\\n"
1265 " };",
1266 format("#define B \\\n"
1267 " class A { \\\n"
1268 " protected: \\\n"
1269 " \\\n"
1270 " public: \\\n"
1271 " \\\n"
1272 " void f(); \\\n"
1273 " };",
1274 getGoogleStyle()));
1275 // But don't remove empty lines after macros ending in access specifiers.
1276 EXPECT_EQ("#define A private:\n"
1277 "\n"
1278 "int i;",
1279 format("#define A private:\n"
1280 "\n"
1281 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00001282}
1283
Daniel Jasper83193602013-04-05 17:22:09 +00001284TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001285 verifyFormat("class A : public B {};");
1286 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001287
1288 verifyFormat(
1289 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001290 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001291 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1292 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001293 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001294 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001295 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001296 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1297 " public C,\n"
1298 " public D,\n"
1299 " public E,\n"
1300 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001301 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001302
1303 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001304 " ReallyReallyLongClassName {\n"
1305 " int i;\n"
1306 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001307 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001308 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1309 " aaaaaaaaaaaaaaaa> {};");
1310 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1311 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1312 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001313 verifyFormat("template <class R, class C>\n"
1314 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1315 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001316 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001317}
1318
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001319TEST_F(FormatTest, BreakBeforeInheritanceComma) {
1320 FormatStyle StyleWithInheritanceBreak = getLLVMStyle();
1321 StyleWithInheritanceBreak.BreakBeforeInheritanceComma = true;
1322
1323 verifyFormat("class MyClass : public X {};", StyleWithInheritanceBreak);
1324 verifyFormat("class MyClass\n"
1325 " : public X\n"
1326 " , public Y {};",
1327 StyleWithInheritanceBreak);
1328}
1329
Manuel Klimek28cacc72013-01-07 18:10:23 +00001330TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001331 verifyFormat("class A {\n} a, b;");
1332 verifyFormat("struct A {\n} a, b;");
1333 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001334}
1335
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001336TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001337 verifyFormat("enum {\n"
1338 " Zero,\n"
1339 " One = 1,\n"
1340 " Two = One + 1,\n"
1341 " Three = (One + Two),\n"
1342 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1343 " Five = (One, Two, Three, Four, 5)\n"
1344 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001345 verifyGoogleFormat("enum {\n"
1346 " Zero,\n"
1347 " One = 1,\n"
1348 " Two = One + 1,\n"
1349 " Three = (One + Two),\n"
1350 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1351 " Five = (One, Two, Three, Four, 5)\n"
1352 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001353 verifyFormat("enum Enum {};");
1354 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001355 verifyFormat("enum X E {} d;");
1356 verifyFormat("enum __attribute__((...)) E {} d;");
1357 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001358 verifyFormat("enum {\n"
1359 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001360 "};",
1361 getLLVMStyleWithColumns(30));
1362
1363 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001364 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001365
1366 EXPECT_EQ("enum KeepEmptyLines {\n"
1367 " ONE,\n"
1368 "\n"
1369 " TWO,\n"
1370 "\n"
1371 " THREE\n"
1372 "}",
1373 format("enum KeepEmptyLines {\n"
1374 " ONE,\n"
1375 "\n"
1376 " TWO,\n"
1377 "\n"
1378 "\n"
1379 " THREE\n"
1380 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001381 verifyFormat("enum E { // comment\n"
1382 " ONE,\n"
1383 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001384 "};\n"
1385 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001386 // Not enums.
1387 verifyFormat("enum X f() {\n"
1388 " a();\n"
1389 " return 42;\n"
1390 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001391 verifyFormat("enum X Type::f() {\n"
1392 " a();\n"
1393 " return 42;\n"
1394 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001395 verifyFormat("enum ::X f() {\n"
1396 " a();\n"
1397 " return 42;\n"
1398 "}");
1399 verifyFormat("enum ns::X f() {\n"
1400 " a();\n"
1401 " return 42;\n"
1402 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001403}
1404
Daniel Jasperb7150872013-08-30 10:10:19 +00001405TEST_F(FormatTest, FormatsEnumsWithErrors) {
1406 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001407 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001408 " Two = 1;\n"
1409 "};");
1410 verifyFormat("namespace n {\n"
1411 "enum Type {\n"
1412 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001413 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001414 " int i;\n"
1415 "}\n"
1416 "void g() {}");
1417}
1418
Daniel Jasper2b41a822013-08-20 12:42:50 +00001419TEST_F(FormatTest, FormatsEnumStruct) {
1420 verifyFormat("enum struct {\n"
1421 " Zero,\n"
1422 " One = 1,\n"
1423 " Two = One + 1,\n"
1424 " Three = (One + Two),\n"
1425 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1426 " Five = (One, Two, Three, Four, 5)\n"
1427 "};");
1428 verifyFormat("enum struct Enum {};");
1429 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001430 verifyFormat("enum struct X E {} d;");
1431 verifyFormat("enum struct __attribute__((...)) E {} d;");
1432 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001433 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1434}
1435
1436TEST_F(FormatTest, FormatsEnumClass) {
1437 verifyFormat("enum class {\n"
1438 " Zero,\n"
1439 " One = 1,\n"
1440 " Two = One + 1,\n"
1441 " Three = (One + Two),\n"
1442 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1443 " Five = (One, Two, Three, Four, 5)\n"
1444 "};");
1445 verifyFormat("enum class Enum {};");
1446 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001447 verifyFormat("enum class X E {} d;");
1448 verifyFormat("enum class __attribute__((...)) E {} d;");
1449 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001450 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1451}
1452
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001453TEST_F(FormatTest, FormatsEnumTypes) {
1454 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001455 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001456 " B\n"
1457 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001458 verifyFormat("enum X : int { A, B };");
1459 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001460}
1461
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001462TEST_F(FormatTest, FormatsTypedefEnum) {
1463 FormatStyle Style = getLLVMStyle();
1464 Style.ColumnLimit = 40;
1465 verifyFormat("typedef enum {} EmptyEnum;");
1466 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1467 verifyFormat("typedef enum {\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001468 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001469 " ONE = 1,\n"
1470 " TWO = 2,\n"
1471 " THREE = 3\n"
1472 "} LongEnum;",
1473 Style);
1474 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1475 Style.BraceWrapping.AfterEnum = true;
1476 verifyFormat("typedef enum {} EmptyEnum;");
1477 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1478 verifyFormat("typedef enum\n"
1479 "{\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001480 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001481 " ONE = 1,\n"
1482 " TWO = 2,\n"
1483 " THREE = 3\n"
1484 "} LongEnum;",
1485 Style);
1486}
1487
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001488TEST_F(FormatTest, FormatsNSEnums) {
1489 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1490 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1491 " // Information about someDecentlyLongValue.\n"
1492 " someDecentlyLongValue,\n"
1493 " // Information about anotherDecentlyLongValue.\n"
1494 " anotherDecentlyLongValue,\n"
1495 " // Information about aThirdDecentlyLongValue.\n"
1496 " aThirdDecentlyLongValue\n"
1497 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001498 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1499 " a = 1,\n"
1500 " b = 2,\n"
1501 " c = 3,\n"
1502 "};");
1503 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1504 " a = 1,\n"
1505 " b = 2,\n"
1506 " c = 3,\n"
1507 "};");
1508 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1509 " a = 1,\n"
1510 " b = 2,\n"
1511 " c = 3,\n"
1512 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001513}
1514
Nico Weber7769a902013-01-14 05:49:49 +00001515TEST_F(FormatTest, FormatsBitfields) {
1516 verifyFormat("struct Bitfields {\n"
1517 " unsigned sClass : 8;\n"
1518 " unsigned ValueKind : 2;\n"
1519 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001520 verifyFormat("struct A {\n"
1521 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1522 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1523 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001524 verifyFormat("struct MyStruct {\n"
1525 " uchar data;\n"
1526 " uchar : 8;\n"
1527 " uchar : 8;\n"
1528 " uchar other;\n"
1529 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001530}
1531
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001532TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001533 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1534 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1535
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001536 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001537 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001538 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001539 "}",
1540 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001541 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001542 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001543 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001544 "}",
1545 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001546 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001547 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001548 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001549 "}",
1550 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001551 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001552 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001553 "void f() { f(); }",
1554 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001555
1556 // This code is more common than we thought; if we
1557 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001558 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001559 verifyFormat("namespace {};",
1560 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001561 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001562 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001563 "};",
1564 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001565
1566 verifyFormat("namespace {\n"
1567 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001568 "} // namespace",
1569 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001570 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1571 "#define HEADER_GUARD\n"
1572 "namespace my_namespace {\n"
1573 "int i;\n"
1574 "} // my_namespace\n"
1575 "#endif // HEADER_GUARD",
1576 format("#ifndef HEADER_GUARD\n"
1577 " #define HEADER_GUARD\n"
1578 " namespace my_namespace {\n"
1579 "int i;\n"
1580 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001581 "#endif // HEADER_GUARD",
1582 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001583
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001584 EXPECT_EQ("namespace A::B {\n"
1585 "class C {};\n"
1586 "}",
1587 format("namespace A::B {\n"
1588 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001589 "}",
1590 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001591
Daniel Jasper65ee3472013-07-31 23:16:02 +00001592 FormatStyle Style = getLLVMStyle();
1593 Style.NamespaceIndentation = FormatStyle::NI_All;
1594 EXPECT_EQ("namespace out {\n"
1595 " int i;\n"
1596 " namespace in {\n"
1597 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001598 " } // namespace in\n"
1599 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001600 format("namespace out {\n"
1601 "int i;\n"
1602 "namespace in {\n"
1603 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001604 "} // namespace in\n"
1605 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001606 Style));
1607
1608 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1609 EXPECT_EQ("namespace out {\n"
1610 "int i;\n"
1611 "namespace in {\n"
1612 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001613 "} // namespace in\n"
1614 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001615 format("namespace out {\n"
1616 "int i;\n"
1617 "namespace in {\n"
1618 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001619 "} // namespace in\n"
1620 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001621 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001622}
1623
Francois Ferrande56a8292017-06-14 12:29:47 +00001624TEST_F(FormatTest, FormatsCompactNamespaces) {
1625 FormatStyle Style = getLLVMStyle();
1626 Style.CompactNamespaces = true;
1627
1628 verifyFormat("namespace A { namespace B {\n"
1629 "}} // namespace A::B",
1630 Style);
1631
1632 EXPECT_EQ("namespace out { namespace in {\n"
1633 "}} // namespace out::in",
1634 format("namespace out {\n"
1635 "namespace in {\n"
1636 "} // namespace in\n"
1637 "} // namespace out",
1638 Style));
1639
1640 // Only namespaces which have both consecutive opening and end get compacted
1641 EXPECT_EQ("namespace out {\n"
1642 "namespace in1 {\n"
1643 "} // namespace in1\n"
1644 "namespace in2 {\n"
1645 "} // namespace in2\n"
1646 "} // namespace out",
1647 format("namespace out {\n"
1648 "namespace in1 {\n"
1649 "} // namespace in1\n"
1650 "namespace in2 {\n"
1651 "} // namespace in2\n"
1652 "} // namespace out",
1653 Style));
1654
1655 EXPECT_EQ("namespace out {\n"
1656 "int i;\n"
1657 "namespace in {\n"
1658 "int j;\n"
1659 "} // namespace in\n"
1660 "int k;\n"
1661 "} // namespace out",
1662 format("namespace out { int i;\n"
1663 "namespace in { int j; } // namespace in\n"
1664 "int k; } // namespace out",
1665 Style));
1666
1667 EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1668 "}}} // namespace A::B::C\n",
1669 format("namespace A { namespace B {\n"
1670 "namespace C {\n"
1671 "}} // namespace B::C\n"
1672 "} // namespace A\n",
1673 Style));
1674
1675 Style.ColumnLimit = 40;
1676 EXPECT_EQ("namespace aaaaaaaaaa {\n"
1677 "namespace bbbbbbbbbb {\n"
1678 "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1679 format("namespace aaaaaaaaaa {\n"
1680 "namespace bbbbbbbbbb {\n"
1681 "} // namespace bbbbbbbbbb\n"
1682 "} // namespace aaaaaaaaaa",
1683 Style));
1684
1685 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1686 "namespace cccccc {\n"
1687 "}}} // namespace aaaaaa::bbbbbb::cccccc",
1688 format("namespace aaaaaa {\n"
1689 "namespace bbbbbb {\n"
1690 "namespace cccccc {\n"
1691 "} // namespace cccccc\n"
1692 "} // namespace bbbbbb\n"
1693 "} // namespace aaaaaa",
1694 Style));
1695 Style.ColumnLimit = 80;
1696
1697 // Extra semicolon after 'inner' closing brace prevents merging
1698 EXPECT_EQ("namespace out { namespace in {\n"
1699 "}; } // namespace out::in",
1700 format("namespace out {\n"
1701 "namespace in {\n"
1702 "}; // namespace in\n"
1703 "} // namespace out",
1704 Style));
1705
1706 // Extra semicolon after 'outer' closing brace is conserved
1707 EXPECT_EQ("namespace out { namespace in {\n"
1708 "}}; // namespace out::in",
1709 format("namespace out {\n"
1710 "namespace in {\n"
1711 "} // namespace in\n"
1712 "}; // namespace out",
1713 Style));
1714
1715 Style.NamespaceIndentation = FormatStyle::NI_All;
1716 EXPECT_EQ("namespace out { namespace in {\n"
1717 " int i;\n"
1718 "}} // namespace out::in",
1719 format("namespace out {\n"
1720 "namespace in {\n"
1721 "int i;\n"
1722 "} // namespace in\n"
1723 "} // namespace out",
1724 Style));
1725 EXPECT_EQ("namespace out { namespace mid {\n"
1726 " namespace in {\n"
1727 " int j;\n"
1728 " } // namespace in\n"
1729 " int k;\n"
1730 "}} // namespace out::mid",
1731 format("namespace out { namespace mid {\n"
1732 "namespace in { int j; } // namespace in\n"
1733 "int k; }} // namespace out::mid",
1734 Style));
1735
1736 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1737 EXPECT_EQ("namespace out { namespace in {\n"
1738 " int i;\n"
1739 "}} // namespace out::in",
1740 format("namespace out {\n"
1741 "namespace in {\n"
1742 "int i;\n"
1743 "} // namespace in\n"
1744 "} // namespace out",
1745 Style));
1746 EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1747 " int i;\n"
1748 "}}} // namespace out::mid::in",
1749 format("namespace out {\n"
1750 "namespace mid {\n"
1751 "namespace in {\n"
1752 "int i;\n"
1753 "} // namespace in\n"
1754 "} // namespace mid\n"
1755 "} // namespace out",
1756 Style));
1757}
1758
Krasimir Georgievd6ce9372017-09-15 11:23:50 +00001759TEST_F(FormatTest, FormatsExternC) {
1760 verifyFormat("extern \"C\" {\nint a;");
1761 verifyFormat("extern \"C\" {}");
1762 verifyFormat("extern \"C\" {\n"
1763 "int foo();\n"
1764 "}");
1765 verifyFormat("extern \"C\" int foo() {}");
1766 verifyFormat("extern \"C\" int foo();");
1767 verifyFormat("extern \"C\" int foo() {\n"
1768 " int i = 42;\n"
1769 " return i;\n"
1770 "}");
1771
1772 FormatStyle Style = getLLVMStyle();
1773 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1774 Style.BraceWrapping.AfterFunction = true;
1775 verifyFormat("extern \"C\" int foo() {}", Style);
1776 verifyFormat("extern \"C\" int foo();", Style);
1777 verifyFormat("extern \"C\" int foo()\n"
1778 "{\n"
1779 " int i = 42;\n"
1780 " return i;\n"
1781 "}",
1782 Style);
1783
1784 Style.BraceWrapping.AfterExternBlock = true;
1785 Style.BraceWrapping.SplitEmptyRecord = false;
1786 verifyFormat("extern \"C\"\n"
1787 "{}",
1788 Style);
1789 verifyFormat("extern \"C\"\n"
1790 "{\n"
1791 " int foo();\n"
1792 "}",
1793 Style);
1794}
Manuel Klimekae610d12013-01-21 14:32:05 +00001795
Daniel Jasper40aacf42013-03-14 13:45:21 +00001796TEST_F(FormatTest, FormatsInlineASM) {
1797 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001798 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001799 verifyFormat(
1800 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1801 " \"cpuid\\n\\t\"\n"
1802 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001803 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001804 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001805 EXPECT_EQ(
1806 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001807 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001808 " mov edx,[that] // vtable in edx\n"
1809 " mov eax,methodIndex\n"
1810 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001811 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001812 "}",
1813 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1814 " __asm {\n"
1815 " mov edx,[that] // vtable in edx\n"
1816 " mov eax,methodIndex\n"
1817 " call [edx][eax*4] // stdcall\n"
1818 " }\n"
1819 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001820 EXPECT_EQ("_asm {\n"
1821 " xor eax, eax;\n"
1822 " cpuid;\n"
1823 "}",
1824 format("_asm {\n"
1825 " xor eax, eax;\n"
1826 " cpuid;\n"
1827 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001828 verifyFormat("void function() {\n"
1829 " // comment\n"
1830 " asm(\"\");\n"
1831 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001832 EXPECT_EQ("__asm {\n"
1833 "}\n"
1834 "int i;",
1835 format("__asm {\n"
1836 "}\n"
1837 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001838}
1839
Nico Weberd5650bd2013-01-07 16:36:17 +00001840TEST_F(FormatTest, FormatTryCatch) {
1841 verifyFormat("try {\n"
1842 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001843 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001844 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001845 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001846 " exit(42);\n"
1847 "}");
1848
1849 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001850 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001851 " return 5;\n"
1852 "}");
1853 verifyFormat("class A {\n"
1854 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001855 " A() try : a(0) {\n"
1856 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001857 " throw;\n"
1858 " }\n"
1859 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001860
1861 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001862 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001863}
1864
Nico Weberfac23712015-02-04 15:26:27 +00001865TEST_F(FormatTest, FormatSEHTryCatch) {
1866 verifyFormat("__try {\n"
1867 " int a = b * c;\n"
1868 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1869 " // Do nothing.\n"
1870 "}");
1871
1872 verifyFormat("__try {\n"
1873 " int a = b * c;\n"
1874 "} __finally {\n"
1875 " // Do nothing.\n"
1876 "}");
1877
1878 verifyFormat("DEBUG({\n"
1879 " __try {\n"
1880 " } __finally {\n"
1881 " }\n"
1882 "});\n");
1883}
1884
Daniel Jasper04a71a42014-05-08 11:58:24 +00001885TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1886 verifyFormat("try {\n"
1887 " f();\n"
1888 "} catch {\n"
1889 " g();\n"
1890 "}");
1891 verifyFormat("try {\n"
1892 " f();\n"
1893 "} catch (A a) MACRO(x) {\n"
1894 " g();\n"
1895 "} catch (B b) MACRO(x) {\n"
1896 " g();\n"
1897 "}");
1898}
1899
1900TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1901 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001902 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1903 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001904 Style.BreakBeforeBraces = BraceStyle;
1905 verifyFormat("try {\n"
1906 " // something\n"
1907 "} catch (...) {\n"
1908 " // something\n"
1909 "}",
1910 Style);
1911 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001912 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1913 verifyFormat("try {\n"
1914 " // something\n"
1915 "}\n"
1916 "catch (...) {\n"
1917 " // something\n"
1918 "}",
1919 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001920 verifyFormat("__try {\n"
1921 " // something\n"
1922 "}\n"
1923 "__finally {\n"
1924 " // something\n"
1925 "}",
1926 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001927 verifyFormat("@try {\n"
1928 " // something\n"
1929 "}\n"
1930 "@finally {\n"
1931 " // something\n"
1932 "}",
1933 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001934 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1935 verifyFormat("try\n"
1936 "{\n"
1937 " // something\n"
1938 "}\n"
1939 "catch (...)\n"
1940 "{\n"
1941 " // something\n"
1942 "}",
1943 Style);
1944 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1945 verifyFormat("try\n"
1946 " {\n"
1947 " // something\n"
1948 " }\n"
1949 "catch (...)\n"
1950 " {\n"
1951 " // something\n"
1952 " }",
1953 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001954 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1955 Style.BraceWrapping.BeforeCatch = true;
1956 verifyFormat("try {\n"
1957 " // something\n"
1958 "}\n"
1959 "catch (...) {\n"
1960 " // something\n"
1961 "}",
1962 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001963}
1964
Daniel Jaspere25509f2012-12-17 11:29:41 +00001965TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001966 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001967
Daniel Jaspera44991332015-04-29 13:06:49 +00001968 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1969 " 100000000, "
1970 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001971
Daniel Jasper473c62c2013-05-17 09:35:01 +00001972 // Here, everything other than the "}" would fit on a line.
1973 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001974 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001975 EXPECT_EQ("S s = {a,\n"
1976 "\n"
1977 " b};",
1978 format("S s = {\n"
1979 " a,\n"
1980 "\n"
1981 " b\n"
1982 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001983
1984 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1985 // line. However, the formatting looks a bit off and this probably doesn't
1986 // happen often in practice.
1987 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001988 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001989 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001990}
1991
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001992TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001993 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1994 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1995 " .bbbbbbbbbb = 2,\n"
1996 " .cccccccccc = 3,\n"
1997 " .dddddddddd = 4,\n"
1998 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001999 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002000 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2001 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2002 " .ccccccccccccccccccccccccccc = 3,\n"
2003 " .ddddddddddddddddddddddddddd = 4,\n"
2004 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002005
2006 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00002007
2008 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
2009 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
2010 " [2] = bbbbbbbbbb,\n"
2011 " [3] = cccccccccc,\n"
2012 " [4] = dddddddddd,\n"
2013 " [5] = eeeeeeeeee};");
2014 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2015 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2016 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2017 " [3] = cccccccccccccccccccccccccccccccccccccc,\n"
2018 " [4] = dddddddddddddddddddddddddddddddddddddd,\n"
2019 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002020}
2021
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002022TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002023 verifyFormat("static A x = {{{}}};\n");
2024 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2025 " {init1, init2, init3, init4}}};",
2026 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00002027
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002028 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002029 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2030 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2031 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2032 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00002033 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002034 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2035 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2036 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00002037 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2038 " {rect.fRight - rect.fLeft, rect.fBottom - "
2039 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002040
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002041 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00002042 "SomeArrayOfSomeType a = {\n"
2043 " {{1, 2, 3},\n"
2044 " {1, 2, 3},\n"
2045 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
2046 " 333333333333333333333333333333},\n"
2047 " {1, 2, 3},\n"
2048 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00002049 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00002050 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002051 " {{1, 2, 3}},\n"
2052 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002053 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2054 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002055 " {{1, 2, 3}},\n"
2056 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002057
Daniel Jaspera44991332015-04-29 13:06:49 +00002058 verifyFormat("struct {\n"
2059 " unsigned bit;\n"
2060 " const char *const name;\n"
2061 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2062 " {kOsWin, \"Windows\"},\n"
2063 " {kOsLinux, \"Linux\"},\n"
2064 " {kOsCrOS, \"Chrome OS\"}};");
2065 verifyFormat("struct {\n"
2066 " unsigned bit;\n"
2067 " const char *const name;\n"
2068 "} kBitsToOs[] = {\n"
2069 " {kOsMac, \"Mac\"},\n"
2070 " {kOsWin, \"Windows\"},\n"
2071 " {kOsLinux, \"Linux\"},\n"
2072 " {kOsCrOS, \"Chrome OS\"},\n"
2073 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002074}
2075
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002076TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2077 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2078 " \\\n"
2079 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2080}
2081
Daniel Jasperda16db32013-01-07 10:48:50 +00002082TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002083 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2084 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00002085
2086 // Do break defaulted and deleted functions.
2087 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2088 " default;",
2089 getLLVMStyleWithColumns(40));
2090 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2091 " delete;",
2092 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002093}
2094
2095TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2096 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2097 getLLVMStyleWithColumns(40));
2098 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2099 getLLVMStyleWithColumns(40));
2100 EXPECT_EQ("#define Q \\\n"
2101 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
2102 " \"aaaaaaaa.cpp\"",
2103 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2104 getLLVMStyleWithColumns(40)));
2105}
2106
2107TEST_F(FormatTest, UnderstandsLinePPDirective) {
2108 EXPECT_EQ("# 123 \"A string literal\"",
2109 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00002110}
2111
Manuel Klimek591b5802013-01-31 15:58:48 +00002112TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00002113 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00002114 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002115}
2116
2117TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2118 EXPECT_EQ("#line 42 \"test\"\n",
2119 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002120 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
2121 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002122}
2123
2124TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2125 EXPECT_EQ("#line 42 \"test\"",
2126 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002127 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002128}
2129
Daniel Jasper877615c2013-10-11 19:45:02 +00002130TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2131 verifyFormat("#define A \\x20");
2132 verifyFormat("#define A \\ x20");
2133 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
2134 verifyFormat("#define A ''");
2135 verifyFormat("#define A ''qqq");
2136 verifyFormat("#define A `qqq");
2137 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00002138 EXPECT_EQ("const char *c = STRINGIFY(\n"
2139 "\\na : b);",
2140 format("const char * c = STRINGIFY(\n"
2141 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00002142
2143 verifyFormat("a\r\\");
2144 verifyFormat("a\v\\");
2145 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00002146}
2147
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002148TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002149 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2150 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002151 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002152 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00002153 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00002154
2155 verifyFormat("#define A A\n#define A A");
2156 verifyFormat("#define A(X) A\n#define A A");
2157
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002158 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2159 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002160}
2161
2162TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002163 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002164 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002165 "#define A( \\\n"
2166 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002167 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002168 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002169 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002170 " #include \"a.h\"\n"
2171 "#define A(A,\\\n"
2172 " B)\n"
2173 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002174 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002175 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002176}
2177
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002178TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002179
2180TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2181 EXPECT_EQ("#define A \\\n"
2182 " c; \\\n"
2183 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002184 "f;",
2185 format("#define A c; e;\n"
2186 "f;",
2187 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002188}
2189
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002190TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002191
Manuel Klimek1abf7892013-01-04 23:34:14 +00002192TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002193 EXPECT_EQ("int x,\n"
2194 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002195 " y;",
2196 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002197}
2198
Manuel Klimek09e07972013-01-05 21:34:55 +00002199TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002200 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002201 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002202 verifyFormat("#define A \\\n"
2203 " { \\\n"
2204 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002205 " }",
2206 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002207
2208 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002209 " void function##X()",
2210 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002211
2212 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002213 " void a##b##c()",
2214 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002215
Daniel Jasper39825ea2013-01-14 15:40:57 +00002216 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002217}
2218
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002219TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002220 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2221 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002222}
2223
Manuel Klimek0c137952013-02-11 12:33:24 +00002224TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2225 EXPECT_EQ("#define A b;", format("#define A \\\n"
2226 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002227 " b;",
2228 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002229 EXPECT_EQ("#define A \\\n"
2230 " \\\n"
2231 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002232 " b;",
2233 format("#define A \\\n"
2234 " \\\n"
2235 " a; \\\n"
2236 " b;",
2237 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002238 EXPECT_EQ("#define A \\\n"
2239 " a; \\\n"
2240 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002241 " b;",
2242 format("#define A \\\n"
2243 " a; \\\n"
2244 " \\\n"
2245 " b;",
2246 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002247}
2248
Daniel Jasper00475962013-02-19 17:14:38 +00002249TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002250 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002251 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002252 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002253 " case 2\n",
2254 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002255 verifyFormat("#define MACRO(a) \\\n"
2256 " if (a) \\\n"
2257 " f(); \\\n"
2258 " else \\\n"
2259 " g()",
2260 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002261 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002262 verifyIncompleteFormat("#define STR(x) #x\n"
2263 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002264 verifyFormat("#pragma omp threadprivate( \\\n"
2265 " y)), // expected-warning",
2266 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002267 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002268 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002269 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002270 "#define b \\\n"
2271 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002272 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002273 "a",
2274 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002275 verifyFormat("#define A \\\n"
2276 " { \\\n"
2277 " {\n"
2278 "#define B \\\n"
2279 " } \\\n"
2280 " }",
2281 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002282 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002283 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002284 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002285 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002286}
2287
Daniel Jasper40e19212013-05-29 13:16:10 +00002288TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2289 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2290 EXPECT_EQ("class A : public QObject {\n"
2291 " Q_OBJECT\n"
2292 "\n"
2293 " A() {}\n"
2294 "};",
2295 format("class A : public QObject {\n"
2296 " Q_OBJECT\n"
2297 "\n"
2298 " A() {\n}\n"
2299 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002300 EXPECT_EQ("MACRO\n"
2301 "/*static*/ int i;",
2302 format("MACRO\n"
2303 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002304 EXPECT_EQ("SOME_MACRO\n"
2305 "namespace {\n"
2306 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002307 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00002308 format("SOME_MACRO\n"
2309 " namespace {\n"
2310 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002311 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002312 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002313 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2314 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002315 // Only if everything is upper case.
2316 EXPECT_EQ("class A : public QObject {\n"
2317 " Q_Object A() {}\n"
2318 "};",
2319 format("class A : public QObject {\n"
2320 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002321 " A() {\n}\n"
2322 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002323
2324 // Only if the next line can actually start an unwrapped line.
2325 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2326 format("SOME_WEIRD_LOG_MACRO\n"
2327 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002328
2329 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002330 "(n, buffers))\n",
2331 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002332}
2333
Alexander Kornienkode644272013-04-08 22:16:06 +00002334TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2335 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2336 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2337 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002338 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002339 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2340 "int *createScopDetectionPass() { return 0; }",
2341 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2342 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2343 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2344 " class X {};\n"
2345 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2346 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002347 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2348 // braces, so that inner block is indented one level more.
2349 EXPECT_EQ("int q() {\n"
2350 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2351 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2352 " IPC_END_MESSAGE_MAP()\n"
2353 "}",
2354 format("int q() {\n"
2355 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2356 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2357 " IPC_END_MESSAGE_MAP()\n"
2358 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002359
Daniel Jasper352dae12014-01-03 11:50:46 +00002360 // Same inside macros.
2361 EXPECT_EQ("#define LIST(L) \\\n"
2362 " L(A) \\\n"
2363 " L(B) \\\n"
2364 " L(C)",
2365 format("#define LIST(L) \\\n"
2366 " L(A) \\\n"
2367 " L(B) \\\n"
2368 " L(C)",
2369 getGoogleStyle()));
2370
Daniel Jasper545c6522013-09-17 09:26:07 +00002371 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002372 EXPECT_EQ("int q() {\n"
2373 " f(x);\n"
2374 " f(x) {}\n"
2375 " f(x)->g();\n"
2376 " f(x)->*g();\n"
2377 " f(x).g();\n"
2378 " f(x) = x;\n"
2379 " f(x) += x;\n"
2380 " f(x) -= x;\n"
2381 " f(x) *= x;\n"
2382 " f(x) /= x;\n"
2383 " f(x) %= x;\n"
2384 " f(x) &= x;\n"
2385 " f(x) |= x;\n"
2386 " f(x) ^= x;\n"
2387 " f(x) >>= x;\n"
2388 " f(x) <<= x;\n"
2389 " f(x)[y].z();\n"
2390 " LOG(INFO) << x;\n"
2391 " ifstream(x) >> x;\n"
2392 "}\n",
2393 format("int q() {\n"
2394 " f(x)\n;\n"
2395 " f(x)\n {}\n"
2396 " f(x)\n->g();\n"
2397 " f(x)\n->*g();\n"
2398 " f(x)\n.g();\n"
2399 " f(x)\n = x;\n"
2400 " f(x)\n += x;\n"
2401 " f(x)\n -= x;\n"
2402 " f(x)\n *= x;\n"
2403 " f(x)\n /= x;\n"
2404 " f(x)\n %= x;\n"
2405 " f(x)\n &= x;\n"
2406 " f(x)\n |= x;\n"
2407 " f(x)\n ^= x;\n"
2408 " f(x)\n >>= x;\n"
2409 " f(x)\n <<= x;\n"
2410 " f(x)\n[y].z();\n"
2411 " LOG(INFO)\n << x;\n"
2412 " ifstream(x)\n >> x;\n"
2413 "}\n"));
2414 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002415 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002416 " if (1) {\n"
2417 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002418 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002419 " while (1) {\n"
2420 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002421 " F(x)\n"
2422 " G(x);\n"
2423 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002424 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002425 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002426 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002427 " }\n"
2428 "}\n",
2429 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002430 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002431 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002432 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002433 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002434 "F(x)\n"
2435 "G(x);\n"
2436 "F(x)\n"
2437 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002438 "}\n"));
2439 EXPECT_EQ("class A {\n"
2440 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002441 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002442 " A(X x)\n" // FIXME: function-level try blocks are broken.
2443 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002444 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002445 " }\n"
2446 "};",
2447 format("class A {\n"
2448 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002449 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002450 " A(X x)\n"
2451 " try : t(0) {} catch (...) {}\n"
2452 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002453 EXPECT_EQ("class SomeClass {\n"
2454 "public:\n"
2455 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2456 "};",
2457 format("class SomeClass {\n"
2458 "public:\n"
2459 " SomeClass()\n"
2460 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2461 "};"));
2462 EXPECT_EQ("class SomeClass {\n"
2463 "public:\n"
2464 " SomeClass()\n"
2465 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2466 "};",
2467 format("class SomeClass {\n"
2468 "public:\n"
2469 " SomeClass()\n"
2470 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2471 "};",
2472 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002473
2474 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002475}
2476
Manuel Klimek4fe43002013-05-22 12:51:29 +00002477TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2478 verifyFormat("#define A \\\n"
2479 " f({ \\\n"
2480 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002481 " });",
2482 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002483}
2484
Krasimir Georgievad47c902017-08-30 14:34:57 +00002485TEST_F(FormatTest, IndentPreprocessorDirectives) {
2486 FormatStyle Style = getLLVMStyle();
2487 Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2488 Style.ColumnLimit = 40;
2489 verifyFormat("#ifdef _WIN32\n"
2490 "#define A 0\n"
2491 "#ifdef VAR2\n"
2492 "#define B 1\n"
2493 "#include <someheader.h>\n"
2494 "#define MACRO \\\n"
2495 " some_very_long_func_aaaaaaaaaa();\n"
2496 "#endif\n"
2497 "#else\n"
2498 "#define A 1\n"
2499 "#endif",
2500 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002501 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2502 verifyFormat("#ifdef _WIN32\n"
2503 "# define A 0\n"
2504 "# ifdef VAR2\n"
2505 "# define B 1\n"
2506 "# include <someheader.h>\n"
2507 "# define MACRO \\\n"
2508 " some_very_long_func_aaaaaaaaaa();\n"
2509 "# endif\n"
2510 "#else\n"
2511 "# define A 1\n"
2512 "#endif",
2513 Style);
2514 verifyFormat("#if A\n"
2515 "# define MACRO \\\n"
2516 " void a(int x) { \\\n"
2517 " b(); \\\n"
2518 " c(); \\\n"
2519 " d(); \\\n"
2520 " e(); \\\n"
2521 " f(); \\\n"
2522 " }\n"
2523 "#endif",
2524 Style);
2525 // Comments before include guard.
2526 verifyFormat("// file comment\n"
2527 "// file comment\n"
2528 "#ifndef HEADER_H\n"
2529 "#define HEADER_H\n"
2530 "code();\n"
2531 "#endif",
2532 Style);
2533 // Test with include guards.
Krasimir Georgievad47c902017-08-30 14:34:57 +00002534 verifyFormat("#ifndef HEADER_H\n"
2535 "#define HEADER_H\n"
2536 "code();\n"
2537 "#endif",
2538 Style);
2539 // Include guards must have a #define with the same variable immediately
2540 // after #ifndef.
2541 verifyFormat("#ifndef NOT_GUARD\n"
2542 "# define FOO\n"
2543 "code();\n"
2544 "#endif",
2545 Style);
2546
2547 // Include guards must cover the entire file.
2548 verifyFormat("code();\n"
2549 "code();\n"
2550 "#ifndef NOT_GUARD\n"
2551 "# define NOT_GUARD\n"
2552 "code();\n"
2553 "#endif",
2554 Style);
2555 verifyFormat("#ifndef NOT_GUARD\n"
2556 "# define NOT_GUARD\n"
2557 "code();\n"
2558 "#endif\n"
2559 "code();",
2560 Style);
2561 // Test with trailing blank lines.
2562 verifyFormat("#ifndef HEADER_H\n"
2563 "#define HEADER_H\n"
2564 "code();\n"
2565 "#endif\n",
2566 Style);
2567 // Include guards don't have #else.
2568 verifyFormat("#ifndef NOT_GUARD\n"
2569 "# define NOT_GUARD\n"
2570 "code();\n"
2571 "#else\n"
2572 "#endif",
2573 Style);
2574 verifyFormat("#ifndef NOT_GUARD\n"
2575 "# define NOT_GUARD\n"
2576 "code();\n"
2577 "#elif FOO\n"
2578 "#endif",
2579 Style);
Mark Zeren1c3afaf2018-02-05 15:59:00 +00002580 // Non-identifier #define after potential include guard.
2581 verifyFormat("#ifndef FOO\n"
2582 "# define 1\n"
2583 "#endif\n",
2584 Style);
2585 // #if closes past last non-preprocessor line.
2586 verifyFormat("#ifndef FOO\n"
2587 "#define FOO\n"
2588 "#if 1\n"
2589 "int i;\n"
2590 "# define A 0\n"
2591 "#endif\n"
2592 "#endif\n",
2593 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002594 // FIXME: This doesn't handle the case where there's code between the
2595 // #ifndef and #define but all other conditions hold. This is because when
2596 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2597 // previous code line yet, so we can't detect it.
2598 EXPECT_EQ("#ifndef NOT_GUARD\n"
2599 "code();\n"
2600 "#define NOT_GUARD\n"
2601 "code();\n"
2602 "#endif",
2603 format("#ifndef NOT_GUARD\n"
2604 "code();\n"
2605 "# define NOT_GUARD\n"
2606 "code();\n"
2607 "#endif",
2608 Style));
2609 // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2610 // be outside an include guard. Examples are #pragma once and
2611 // #pragma GCC diagnostic, or anything else that does not change the meaning
2612 // of the file if it's included multiple times.
2613 EXPECT_EQ("#ifdef WIN32\n"
2614 "# pragma once\n"
2615 "#endif\n"
2616 "#ifndef HEADER_H\n"
2617 "# define HEADER_H\n"
2618 "code();\n"
2619 "#endif",
2620 format("#ifdef WIN32\n"
2621 "# pragma once\n"
2622 "#endif\n"
2623 "#ifndef HEADER_H\n"
2624 "#define HEADER_H\n"
2625 "code();\n"
2626 "#endif",
2627 Style));
2628 // FIXME: This does not detect when there is a single non-preprocessor line
2629 // in front of an include-guard-like structure where other conditions hold
2630 // because ScopedLineState hides the line.
2631 EXPECT_EQ("code();\n"
2632 "#ifndef HEADER_H\n"
2633 "#define HEADER_H\n"
2634 "code();\n"
2635 "#endif",
2636 format("code();\n"
2637 "#ifndef HEADER_H\n"
2638 "# define HEADER_H\n"
2639 "code();\n"
2640 "#endif",
2641 Style));
Mark Zerend2b2ac62018-01-31 20:05:50 +00002642 // Keep comments aligned with #, otherwise indent comments normally. These
2643 // tests cannot use verifyFormat because messUp manipulates leading
2644 // whitespace.
2645 {
2646 const char *Expected = ""
2647 "void f() {\n"
2648 "#if 1\n"
2649 "// Preprocessor aligned.\n"
2650 "# define A 0\n"
2651 " // Code. Separated by blank line.\n"
2652 "\n"
2653 "# define B 0\n"
2654 " // Code. Not aligned with #\n"
2655 "# define C 0\n"
2656 "#endif";
2657 const char *ToFormat = ""
2658 "void f() {\n"
2659 "#if 1\n"
2660 "// Preprocessor aligned.\n"
2661 "# define A 0\n"
2662 "// Code. Separated by blank line.\n"
2663 "\n"
2664 "# define B 0\n"
2665 " // Code. Not aligned with #\n"
2666 "# define C 0\n"
2667 "#endif";
2668 EXPECT_EQ(Expected, format(ToFormat, Style));
2669 EXPECT_EQ(Expected, format(Expected, Style));
2670 }
2671 // Keep block quotes aligned.
2672 {
2673 const char *Expected = ""
2674 "void f() {\n"
2675 "#if 1\n"
2676 "/* Preprocessor aligned. */\n"
2677 "# define A 0\n"
2678 " /* Code. Separated by blank line. */\n"
2679 "\n"
2680 "# define B 0\n"
2681 " /* Code. Not aligned with # */\n"
2682 "# define C 0\n"
2683 "#endif";
2684 const char *ToFormat = ""
2685 "void f() {\n"
2686 "#if 1\n"
2687 "/* Preprocessor aligned. */\n"
2688 "# define A 0\n"
2689 "/* Code. Separated by blank line. */\n"
2690 "\n"
2691 "# define B 0\n"
2692 " /* Code. Not aligned with # */\n"
2693 "# define C 0\n"
2694 "#endif";
2695 EXPECT_EQ(Expected, format(ToFormat, Style));
2696 EXPECT_EQ(Expected, format(Expected, Style));
2697 }
2698 // Keep comments aligned with un-indented directives.
2699 {
2700 const char *Expected = ""
2701 "void f() {\n"
2702 "// Preprocessor aligned.\n"
2703 "#define A 0\n"
2704 " // Code. Separated by blank line.\n"
2705 "\n"
2706 "#define B 0\n"
2707 " // Code. Not aligned with #\n"
2708 "#define C 0\n";
2709 const char *ToFormat = ""
2710 "void f() {\n"
2711 "// Preprocessor aligned.\n"
2712 "#define A 0\n"
2713 "// Code. Separated by blank line.\n"
2714 "\n"
2715 "#define B 0\n"
2716 " // Code. Not aligned with #\n"
2717 "#define C 0\n";
2718 EXPECT_EQ(Expected, format(ToFormat, Style));
2719 EXPECT_EQ(Expected, format(Expected, Style));
2720 }
Krasimir Georgievad47c902017-08-30 14:34:57 +00002721 // Test with tabs.
2722 Style.UseTab = FormatStyle::UT_Always;
2723 Style.IndentWidth = 8;
2724 Style.TabWidth = 8;
2725 verifyFormat("#ifdef _WIN32\n"
2726 "#\tdefine A 0\n"
2727 "#\tifdef VAR2\n"
2728 "#\t\tdefine B 1\n"
2729 "#\t\tinclude <someheader.h>\n"
2730 "#\t\tdefine MACRO \\\n"
2731 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
2732 "#\tendif\n"
2733 "#else\n"
2734 "#\tdefine A 1\n"
2735 "#endif",
2736 Style);
Daniel Jasper4df130f2017-09-04 13:33:52 +00002737
2738 // Regression test: Multiline-macro inside include guards.
2739 verifyFormat("#ifndef HEADER_H\n"
2740 "#define HEADER_H\n"
2741 "#define A() \\\n"
2742 " int i; \\\n"
2743 " int j;\n"
2744 "#endif // HEADER_H",
2745 getLLVMStyleWithColumns(20));
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002746}
2747
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002748TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002749 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002750}
2751
Manuel Klimek1058d982013-01-06 20:07:31 +00002752TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2753 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2754 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2755 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2756 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2757}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002758
Daniel Jaspere2408e32015-05-06 11:16:43 +00002759TEST_F(FormatTest, EscapedNewlines) {
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002760 FormatStyle Narrow = getLLVMStyleWithColumns(11);
2761 EXPECT_EQ("#define A \\\n int i; \\\n int j;",
2762 format("#define A \\\nint i;\\\n int j;", Narrow));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002763 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002764 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002765 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002766 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002767
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002768 FormatStyle AlignLeft = getLLVMStyle();
2769 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
2770 EXPECT_EQ("#define MACRO(x) \\\n"
2771 "private: \\\n"
2772 " int x(int a);\n",
2773 format("#define MACRO(x) \\\n"
2774 "private: \\\n"
2775 " int x(int a);\n",
2776 AlignLeft));
2777
2778 // CRLF line endings
2779 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;",
2780 format("#define A \\\r\nint i;\\\r\n int j;", Narrow));
2781 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
2782 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
2783 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */"));
2784 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
2785 EXPECT_EQ("#define MACRO(x) \\\r\n"
2786 "private: \\\r\n"
2787 " int x(int a);\r\n",
2788 format("#define MACRO(x) \\\r\n"
2789 "private: \\\r\n"
2790 " int x(int a);\r\n",
2791 AlignLeft));
2792
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002793 FormatStyle DontAlign = getLLVMStyle();
2794 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
2795 DontAlign.MaxEmptyLinesToKeep = 3;
2796 // FIXME: can't use verifyFormat here because the newline before
2797 // "public:" is not inserted the first time it's reformatted
2798 EXPECT_EQ("#define A \\\n"
2799 " class Foo { \\\n"
2800 " void bar(); \\\n"
2801 "\\\n"
2802 "\\\n"
2803 "\\\n"
2804 " public: \\\n"
2805 " void baz(); \\\n"
2806 " };",
2807 format("#define A \\\n"
2808 " class Foo { \\\n"
2809 " void bar(); \\\n"
2810 "\\\n"
2811 "\\\n"
2812 "\\\n"
2813 " public: \\\n"
2814 " void baz(); \\\n"
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002815 " };",
2816 DontAlign));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002817}
2818
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002819TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2820 verifyFormat("#define A \\\n"
2821 " int v( \\\n"
2822 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002823 " int i;",
2824 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002825}
2826
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002827TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002828 EXPECT_EQ(
2829 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2830 " \\\n"
2831 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2832 "\n"
2833 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2834 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2835 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2836 "\\\n"
2837 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2838 " \n"
2839 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2840 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002841}
2842
Manuel Klimek52b15152013-01-09 15:25:02 +00002843TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2844 EXPECT_EQ("int\n"
2845 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002846 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002847 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002848 verifyFormat("functionCallTo(\n"
2849 " someOtherFunction(\n"
2850 " withSomeParameters, whichInSequence,\n"
2851 " areLongerThanALine(andAnotherCall,\n"
2852 "#define A B\n"
2853 " withMoreParamters,\n"
2854 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002855 " andMoreParameters),\n"
2856 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002857 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002858 verifyFormat("Foo::Foo()\n"
2859 "#ifdef BAR\n"
2860 " : baz(0)\n"
2861 "#endif\n"
2862 "{\n"
2863 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002864 verifyFormat("void f() {\n"
2865 " if (true)\n"
2866 "#ifdef A\n"
2867 " f(42);\n"
2868 " x();\n"
2869 "#else\n"
2870 " g();\n"
2871 " x();\n"
2872 "#endif\n"
2873 "}");
2874 verifyFormat("void f(param1, param2,\n"
2875 " param3,\n"
2876 "#ifdef A\n"
2877 " param4(param5,\n"
2878 "#ifdef A1\n"
2879 " param6,\n"
2880 "#ifdef A2\n"
2881 " param7),\n"
2882 "#else\n"
2883 " param8),\n"
2884 " param9,\n"
2885 "#endif\n"
2886 " param10,\n"
2887 "#endif\n"
2888 " param11)\n"
2889 "#else\n"
2890 " param12)\n"
2891 "#endif\n"
2892 "{\n"
2893 " x();\n"
2894 "}",
2895 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002896 verifyFormat("#if 1\n"
2897 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002898 verifyFormat("#if 1\n"
2899 "#endif\n"
2900 "#if 1\n"
2901 "#else\n"
2902 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002903 verifyFormat("DEBUG({\n"
2904 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2905 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2906 "});\n"
2907 "#if a\n"
2908 "#else\n"
2909 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002910
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002911 verifyIncompleteFormat("void f(\n"
2912 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00002913 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002914 "#else\n"
2915 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002916}
2917
Manuel Klimek14bd9172014-01-29 08:49:02 +00002918TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2919 verifyFormat("#endif\n"
2920 "#if B");
2921}
2922
Manuel Klimek88033d72013-10-21 08:11:15 +00002923TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2924 FormatStyle SingleLine = getLLVMStyle();
2925 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002926 verifyFormat("#if 0\n"
2927 "#elif 1\n"
2928 "#endif\n"
2929 "void foo() {\n"
2930 " if (test) foo2();\n"
2931 "}",
2932 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002933}
2934
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002935TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002936 verifyFormat("functionCall({ int i; });");
2937 verifyFormat("functionCall({\n"
2938 " int i;\n"
2939 " int j;\n"
2940 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002941 verifyFormat("functionCall(\n"
2942 " {\n"
2943 " int i;\n"
2944 " int j;\n"
2945 " },\n"
2946 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002947 verifyFormat("functionA(functionB({\n"
2948 " int i;\n"
2949 " int j;\n"
2950 " }),\n"
2951 " aaaa, bbbb, cccc);");
2952 verifyFormat("functionCall(\n"
2953 " {\n"
2954 " int i;\n"
2955 " int j;\n"
2956 " },\n"
2957 " aaaa, bbbb, // comment\n"
2958 " cccc);");
2959 verifyFormat("functionA(functionB({\n"
2960 " int i;\n"
2961 " int j;\n"
2962 " }),\n"
2963 " aaaa, bbbb, // comment\n"
2964 " cccc);");
2965 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2966 verifyFormat("functionCall(aaaa, bbbb, {\n"
2967 " int i;\n"
2968 " int j;\n"
2969 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002970 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002971 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002972 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002973 " int i; // break\n"
2974 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002975 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2976 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002977 verifyFormat("DEBUG({\n"
2978 " if (a)\n"
2979 " f();\n"
2980 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002981}
2982
2983TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002984 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002985 "int i;",
2986 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002987}
2988
2989TEST_F(FormatTest, LayoutNestedBlocks) {
2990 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2991 " struct s {\n"
2992 " int i;\n"
2993 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002994 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002995 " for (int i = 0; i < 10; ++i)\n"
2996 " return;\n"
2997 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002998 verifyFormat("call(parameter, {\n"
2999 " something();\n"
3000 " // Comment using all columns.\n"
3001 " somethingelse();\n"
3002 "});",
3003 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003004 verifyFormat("DEBUG( //\n"
3005 " { f(); }, a);");
3006 verifyFormat("DEBUG( //\n"
3007 " {\n"
3008 " f(); //\n"
3009 " },\n"
3010 " a);");
3011
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003012 EXPECT_EQ("call(parameter, {\n"
3013 " something();\n"
3014 " // Comment too\n"
3015 " // looooooooooong.\n"
3016 " somethingElse();\n"
3017 "});",
3018 format("call(parameter, {\n"
3019 " something();\n"
3020 " // Comment too looooooooooong.\n"
3021 " somethingElse();\n"
3022 "});",
3023 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003024 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003025 EXPECT_EQ("DEBUG({ // comment\n"
3026 " int i;\n"
3027 "});",
3028 format("DEBUG({ // comment\n"
3029 "int i;\n"
3030 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003031 EXPECT_EQ("DEBUG({\n"
3032 " int i;\n"
3033 "\n"
3034 " // comment\n"
3035 " int j;\n"
3036 "});",
3037 format("DEBUG({\n"
3038 " int i;\n"
3039 "\n"
3040 " // comment\n"
3041 " int j;\n"
3042 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003043
3044 verifyFormat("DEBUG({\n"
3045 " if (a)\n"
3046 " return;\n"
3047 "});");
3048 verifyGoogleFormat("DEBUG({\n"
3049 " if (a) return;\n"
3050 "});");
3051 FormatStyle Style = getGoogleStyle();
3052 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003053 verifyFormat("Debug(aaaaa,\n"
3054 " {\n"
3055 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3056 " },\n"
3057 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003058 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003059
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003060 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3061
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003062 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003063}
3064
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003065TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3066 EXPECT_EQ("#define MACRO() \\\n"
3067 " Debug(aaa, /* force line break */ \\\n"
3068 " { \\\n"
3069 " int i; \\\n"
3070 " int j; \\\n"
3071 " })",
3072 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3073 " { int i; int j; })",
3074 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003075
3076 EXPECT_EQ("#define A \\\n"
3077 " [] { \\\n"
3078 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3079 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3080 " }",
3081 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3082 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3083 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003084}
3085
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003086TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3087 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003088 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003089 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003090}
3091
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003092TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3093 FormatStyle Style = getLLVMStyle();
3094 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3095 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3096 verifyFormat("FOO_BEGIN\n"
3097 " FOO_ENTRY\n"
3098 "FOO_END", Style);
3099 verifyFormat("FOO_BEGIN\n"
3100 " NESTED_FOO_BEGIN\n"
3101 " NESTED_FOO_ENTRY\n"
3102 " NESTED_FOO_END\n"
3103 "FOO_END", Style);
3104 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3105 " int x;\n"
3106 " x = 1;\n"
3107 "FOO_END(Baz)", Style);
3108}
3109
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003110//===----------------------------------------------------------------------===//
3111// Line break tests.
3112//===----------------------------------------------------------------------===//
3113
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003114TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003115 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003116 "void f() {\n"
3117 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3118 " parameter, parameter, parameter)),\n"
3119 " SecondLongCall(parameter));\n"
3120 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003121 verifyFormat(
3122 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3123 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3124 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3125 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3126 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003127 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3128 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3129 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3130 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003131 verifyFormat(
3132 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3133 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3134 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3135 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003136 verifyFormat("int a = bbbb && ccc &&\n"
3137 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003138 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003139 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003140}
3141
Daniel Jasperd69fc772013-05-08 14:12:04 +00003142TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3143 verifyFormat(
3144 "bool aaaaaaa =\n"
3145 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3146 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003147 verifyFormat(
3148 "bool aaaaaaa =\n"
3149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3150 " bbbbbbbb();");
3151
Daniel Jasperd69fc772013-05-08 14:12:04 +00003152 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3153 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3154 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003155 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3156 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3157 " ccccccccc == ddddddddddd;");
3158 verifyFormat(
3159 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3160 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3161 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003162
3163 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3164 " aaaaaa) &&\n"
3165 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003166 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3167 " aaaaaa) >>\n"
3168 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003169 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003170 " SourceMgr.getSpellingColumnNumber(\n"
3171 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3172 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003173
Daniel Jasper68d888c2013-06-03 08:42:05 +00003174 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3175 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3176 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00003177 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3178 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3179 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003180 verifyFormat("b = a &&\n"
3181 " // Comment\n"
3182 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003183
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003184 // If the LHS of a comparison is not a binary expression itself, the
3185 // additional linebreak confuses many people.
3186 verifyFormat(
3187 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3188 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3189 "}");
3190 verifyFormat(
3191 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3192 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3193 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003194 verifyFormat(
3195 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3196 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3197 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003198 verifyFormat(
3199 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3200 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3201 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003202 // Even explicit parentheses stress the precedence enough to make the
3203 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003204 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3205 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3206 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003207 // This cases is borderline, but with the indentation it is still readable.
3208 verifyFormat(
3209 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3210 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3211 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3212 "}",
3213 getLLVMStyleWithColumns(75));
3214
3215 // If the LHS is a binary expression, we should still use the additional break
3216 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003217 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3218 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3219 " 5) {\n"
3220 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003221 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3222 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3223 " 5) {\n"
3224 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003225
Daniel Jasper571f1af2013-05-14 20:39:56 +00003226 FormatStyle OnePerLine = getLLVMStyle();
3227 OnePerLine.BinPackParameters = false;
3228 verifyFormat(
3229 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3230 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3231 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3232 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003233
3234 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3235 " .aaa(aaaaaaaaaaaaa) *\n"
3236 " aaaaaaa +\n"
3237 " aaaaaaa;",
3238 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003239}
3240
Daniel Jasper6bee6822013-04-08 20:33:42 +00003241TEST_F(FormatTest, ExpressionIndentation) {
3242 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3243 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3244 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3245 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3246 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3247 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3248 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3249 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3250 " ccccccccccccccccccccccccccccccccccccccccc;");
3251 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3252 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3253 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3254 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3255 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3256 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3257 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3258 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3259 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3260 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3261 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3262 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003263 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003264 "} else if (aaaaa && bbbbb > // break\n"
3265 " ccccc) {\n"
3266 "}");
3267 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003268 "} else if (aaaaa &&\n"
3269 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003270 " ccccc &&\n"
3271 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003272 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003273
3274 // Presence of a trailing comment used to change indentation of b.
3275 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3276 " b;\n"
3277 "return aaaaaaaaaaaaaaaaaaa +\n"
3278 " b; //",
3279 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003280}
3281
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003282TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3283 // Not sure what the best system is here. Like this, the LHS can be found
3284 // immediately above an operator (everything with the same or a higher
3285 // indent). The RHS is aligned right of the operator and so compasses
3286 // everything until something with the same indent as the operator is found.
3287 // FIXME: Is this a good system?
3288 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003289 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003290 verifyFormat(
3291 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003292 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3293 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3294 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3295 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3296 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003297 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003298 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3299 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003300 Style);
3301 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003302 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3303 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003304 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3305 Style);
3306 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003307 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3308 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003309 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3310 Style);
3311 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3312 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003313 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3314 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003315 Style);
3316 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003317 "} else if (aaaaa\n"
3318 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003319 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003320 "}",
3321 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003322 verifyFormat("return (a)\n"
3323 " // comment\n"
3324 " + b;",
3325 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003326 verifyFormat(
3327 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3328 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3329 " + cc;",
3330 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003331
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003332 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3333 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3334 Style);
3335
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003336 // Forced by comments.
3337 verifyFormat(
3338 "unsigned ContentSize =\n"
3339 " sizeof(int16_t) // DWARF ARange version number\n"
3340 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3341 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3342 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003343
3344 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3345 " == boost::fusion::at_c<1>(iiii).second;",
3346 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003347
3348 Style.ColumnLimit = 60;
3349 verifyFormat("zzzzzzzzzz\n"
3350 " = bbbbbbbbbbbbbbbbb\n"
3351 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3352 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003353}
3354
Daniel Jasperb1270392017-02-01 23:27:37 +00003355TEST_F(FormatTest, EnforcedOperatorWraps) {
3356 // Here we'd like to wrap after the || operators, but a comment is forcing an
3357 // earlier wrap.
3358 verifyFormat("bool x = aaaaa //\n"
3359 " || bbbbb\n"
3360 " //\n"
3361 " || cccc;");
3362}
3363
Daniel Jasper3219e432014-12-02 13:24:51 +00003364TEST_F(FormatTest, NoOperandAlignment) {
3365 FormatStyle Style = getLLVMStyle();
3366 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00003367 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3368 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3369 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3370 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003371 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003372 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3373 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3374 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3375 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3376 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3377 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3378 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3379 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3380 " > ccccccccccccccccccccccccccccccccccccccccc;",
3381 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003382
3383 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3384 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3385 " + cc;",
3386 Style);
3387 verifyFormat("int a = aa\n"
3388 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003389 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00003390 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003391
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003392 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003393 verifyFormat("return (a > b\n"
3394 " // comment1\n"
3395 " // comment2\n"
3396 " || c);",
3397 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003398}
3399
Daniel Jasperac043c92014-09-15 11:11:00 +00003400TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3401 FormatStyle Style = getLLVMStyle();
3402 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3403 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3404 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003405 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3406 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003407}
3408
Daniel Jasper988e7e42017-05-08 15:07:52 +00003409TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3410 FormatStyle Style = getLLVMStyle();
3411 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3412 Style.BinPackArguments = false;
3413 Style.ColumnLimit = 40;
3414 verifyFormat("void test() {\n"
3415 " someFunction(\n"
3416 " this + argument + is + quite\n"
3417 " + long + so + it + gets + wrapped\n"
3418 " + but + remains + bin - packed);\n"
3419 "}",
3420 Style);
3421 verifyFormat("void test() {\n"
3422 " someFunction(arg1,\n"
3423 " this + argument + is\n"
3424 " + quite + long + so\n"
3425 " + it + gets + wrapped\n"
3426 " + but + remains + bin\n"
3427 " - packed,\n"
3428 " arg3);\n"
3429 "}",
3430 Style);
3431 verifyFormat("void test() {\n"
3432 " someFunction(\n"
3433 " arg1,\n"
3434 " this + argument + has\n"
3435 " + anotherFunc(nested,\n"
3436 " calls + whose\n"
3437 " + arguments\n"
3438 " + are + also\n"
3439 " + wrapped,\n"
3440 " in + addition)\n"
3441 " + to + being + bin - packed,\n"
3442 " arg3);\n"
3443 "}",
3444 Style);
3445
3446 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3447 verifyFormat("void test() {\n"
3448 " someFunction(\n"
3449 " arg1,\n"
3450 " this + argument + has +\n"
3451 " anotherFunc(nested,\n"
3452 " calls + whose +\n"
3453 " arguments +\n"
3454 " are + also +\n"
3455 " wrapped,\n"
3456 " in + addition) +\n"
3457 " to + being + bin - packed,\n"
3458 " arg3);\n"
3459 "}",
3460 Style);
3461}
3462
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003463TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003464 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003465 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3466 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003467 verifyFormat("Constructor()\n"
3468 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003469 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003470 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003471 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003472 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003473
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003474 verifyFormat("template <typename T>\n"
3475 "Constructor() : Initializer(FitsOnTheLine) {}",
3476 getLLVMStyleWithColumns(45));
3477
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003478 verifyFormat(
3479 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003480 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003481
3482 verifyFormat(
3483 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003484 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003485 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003486 verifyFormat(
3487 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003488 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003489 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003490 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3491 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3492 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003493
3494 verifyFormat("Constructor()\n"
3495 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3496 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3497 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003498 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003499
Daniel Jasper65585ed2013-01-28 13:31:35 +00003500 verifyFormat("Constructor()\n"
3501 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003502 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003503
Daniel Jasper62e68172013-02-25 15:59:54 +00003504 verifyFormat("Constructor(int Parameter = 0)\n"
3505 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3506 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003507 verifyFormat("Constructor()\n"
3508 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3509 "}",
3510 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003511 verifyFormat("Constructor()\n"
3512 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3513 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003514
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003515 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003516 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003517 verifyFormat("Constructor()\n"
3518 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3519 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3520 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003521
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003522 FormatStyle OnePerLine = getLLVMStyle();
3523 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003524 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003525 verifyFormat("SomeClass::Constructor()\n"
3526 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3527 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003528 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003529 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003530 verifyFormat("SomeClass::Constructor()\n"
3531 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3532 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003533 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003534 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003535 verifyFormat("MyClass::MyClass(int var)\n"
3536 " : some_var_(var), // 4 space indent\n"
3537 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003538 "}",
3539 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003540 verifyFormat("Constructor()\n"
3541 " : aaaaa(aaaaaa),\n"
3542 " aaaaa(aaaaaa),\n"
3543 " aaaaa(aaaaaa),\n"
3544 " aaaaa(aaaaaa),\n"
3545 " aaaaa(aaaaaa) {}",
3546 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003547 verifyFormat("Constructor()\n"
3548 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3549 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3550 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003551 OnePerLine.BinPackParameters = false;
3552 verifyFormat(
3553 "Constructor()\n"
3554 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3555 " aaaaaaaaaaa().aaa(),\n"
3556 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3557 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003558 OnePerLine.ColumnLimit = 60;
3559 verifyFormat("Constructor()\n"
3560 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3561 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3562 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003563
3564 EXPECT_EQ("Constructor()\n"
3565 " : // Comment forcing unwanted break.\n"
3566 " aaaa(aaaa) {}",
3567 format("Constructor() :\n"
3568 " // Comment forcing unwanted break.\n"
3569 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003570}
3571
Francois Ferranda6b6d512017-05-24 11:36:58 +00003572TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3573 FormatStyle Style = getLLVMStyle();
3574 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3575
3576 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3577 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3578 getStyleWithColumns(Style, 45));
3579 verifyFormat("Constructor() :\n"
3580 " Initializer(FitsOnTheLine) {}",
3581 getStyleWithColumns(Style, 44));
3582 verifyFormat("Constructor() :\n"
3583 " Initializer(FitsOnTheLine) {}",
3584 getStyleWithColumns(Style, 43));
3585
3586 verifyFormat("template <typename T>\n"
3587 "Constructor() : Initializer(FitsOnTheLine) {}",
3588 getStyleWithColumns(Style, 50));
3589
3590 verifyFormat(
3591 "SomeClass::Constructor() :\n"
3592 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3593 Style);
3594
3595 verifyFormat(
3596 "SomeClass::Constructor() :\n"
3597 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3598 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3599 Style);
3600 verifyFormat(
3601 "SomeClass::Constructor() :\n"
3602 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3603 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3604 Style);
3605 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3606 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3607 " aaaaaaaaaa(aaaaaa) {}",
3608 Style);
3609
3610 verifyFormat("Constructor() :\n"
3611 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3612 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3613 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3614 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3615 Style);
3616
3617 verifyFormat("Constructor() :\n"
3618 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3619 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3620 Style);
3621
3622 verifyFormat("Constructor(int Parameter = 0) :\n"
3623 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3624 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3625 Style);
3626 verifyFormat("Constructor() :\n"
3627 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3628 "}",
3629 getStyleWithColumns(Style, 60));
3630 verifyFormat("Constructor() :\n"
3631 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3632 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3633 Style);
3634
3635 // Here a line could be saved by splitting the second initializer onto two
3636 // lines, but that is not desirable.
3637 verifyFormat("Constructor() :\n"
3638 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3639 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3640 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3641 Style);
3642
3643 FormatStyle OnePerLine = Style;
3644 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3645 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3646 verifyFormat("SomeClass::Constructor() :\n"
3647 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3648 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3649 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3650 OnePerLine);
3651 verifyFormat("SomeClass::Constructor() :\n"
3652 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3653 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3654 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3655 OnePerLine);
3656 verifyFormat("MyClass::MyClass(int var) :\n"
3657 " some_var_(var), // 4 space indent\n"
3658 " some_other_var_(var + 1) { // lined up\n"
3659 "}",
3660 OnePerLine);
3661 verifyFormat("Constructor() :\n"
3662 " aaaaa(aaaaaa),\n"
3663 " aaaaa(aaaaaa),\n"
3664 " aaaaa(aaaaaa),\n"
3665 " aaaaa(aaaaaa),\n"
3666 " aaaaa(aaaaaa) {}",
3667 OnePerLine);
3668 verifyFormat("Constructor() :\n"
3669 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3670 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3671 OnePerLine);
3672 OnePerLine.BinPackParameters = false;
3673 verifyFormat(
3674 "Constructor() :\n"
3675 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3676 " aaaaaaaaaaa().aaa(),\n"
3677 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3678 OnePerLine);
3679 OnePerLine.ColumnLimit = 60;
3680 verifyFormat("Constructor() :\n"
3681 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3682 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3683 OnePerLine);
3684
3685 EXPECT_EQ("Constructor() :\n"
3686 " // Comment forcing unwanted break.\n"
3687 " aaaa(aaaa) {}",
3688 format("Constructor() :\n"
3689 " // Comment forcing unwanted break.\n"
3690 " aaaa(aaaa) {}",
3691 Style));
3692
3693 Style.ColumnLimit = 0;
3694 verifyFormat("SomeClass::Constructor() :\n"
3695 " a(a) {}",
3696 Style);
3697 verifyFormat("SomeClass::Constructor() noexcept :\n"
3698 " a(a) {}",
3699 Style);
3700 verifyFormat("SomeClass::Constructor() :\n"
3701 " a(a), b(b), c(c) {}",
3702 Style);
3703 verifyFormat("SomeClass::Constructor() :\n"
3704 " a(a) {\n"
3705 " foo();\n"
3706 " bar();\n"
3707 "}",
3708 Style);
3709
3710 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3711 verifyFormat("SomeClass::Constructor() :\n"
3712 " a(a), b(b), c(c) {\n"
3713 "}",
3714 Style);
3715 verifyFormat("SomeClass::Constructor() :\n"
3716 " a(a) {\n"
3717 "}",
3718 Style);
3719
3720 Style.ColumnLimit = 80;
3721 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3722 Style.ConstructorInitializerIndentWidth = 2;
3723 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3724 Style);
3725 verifyFormat("SomeClass::Constructor() :\n"
3726 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3727 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3728 Style);
3729}
3730
David Blaikieea95dd72017-08-31 18:49:34 +00003731#ifndef EXPENSIVE_CHECKS
3732// Expensive checks enables libstdc++ checking which includes validating the
3733// state of ranges used in std::priority_queue - this blows out the
3734// runtime/scalability of the function and makes this test unacceptably slow.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003735TEST_F(FormatTest, MemoizationTests) {
3736 // This breaks if the memoization lookup does not take \c Indent and
3737 // \c LastSpace into account.
3738 verifyFormat(
3739 "extern CFRunLoopTimerRef\n"
3740 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3741 " CFTimeInterval interval, CFOptionFlags flags,\n"
3742 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003743 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003744
3745 // Deep nesting somewhat works around our memoization.
3746 verifyFormat(
3747 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3748 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3749 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3750 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3751 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3752 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003753 verifyFormat(
3754 "aaaaa(\n"
3755 " aaaaa,\n"
3756 " aaaaa(\n"
3757 " aaaaa,\n"
3758 " aaaaa(\n"
3759 " aaaaa,\n"
3760 " aaaaa(\n"
3761 " aaaaa,\n"
3762 " aaaaa(\n"
3763 " aaaaa,\n"
3764 " aaaaa(\n"
3765 " aaaaa,\n"
3766 " aaaaa(\n"
3767 " aaaaa,\n"
3768 " aaaaa(\n"
3769 " aaaaa,\n"
3770 " aaaaa(\n"
3771 " aaaaa,\n"
3772 " aaaaa(\n"
3773 " aaaaa,\n"
3774 " aaaaa(\n"
3775 " aaaaa,\n"
3776 " aaaaa(\n"
3777 " aaaaa,\n"
3778 " aaaaa))))))))))));",
3779 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003780 verifyFormat(
3781 "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"
3782 " a),\n"
3783 " a),\n"
3784 " a),\n"
3785 " a),\n"
3786 " a),\n"
3787 " a),\n"
3788 " a),\n"
3789 " a),\n"
3790 " a),\n"
3791 " a),\n"
3792 " a),\n"
3793 " a),\n"
3794 " a),\n"
3795 " a),\n"
3796 " a),\n"
3797 " a),\n"
3798 " a)",
3799 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003800
3801 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003802 FormatStyle OnePerLine = getLLVMStyle();
3803 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003804 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003805 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003806 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003807 for (unsigned i = 0, e = 80; i != e; ++i) {
3808 input += " a,\n";
3809 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003810 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003811 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003812}
David Blaikieea95dd72017-08-31 18:49:34 +00003813#endif
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003814
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003815TEST_F(FormatTest, BreaksAsHighAsPossible) {
3816 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003817 "void f() {\n"
3818 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3819 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3820 " f();\n"
3821 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003822 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003823 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003824}
3825
Daniel Jasper6728fc12013-04-11 14:29:13 +00003826TEST_F(FormatTest, BreaksFunctionDeclarations) {
3827 // Principially, we break function declarations in a certain order:
3828 // 1) break amongst arguments.
3829 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3830 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003831 verifyFormat("template <class TemplateIt>\n"
3832 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3833 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003834
3835 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003836 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003837 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003838 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003839 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003840
3841 // 3) break after (.
3842 verifyFormat(
3843 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003844 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3845 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003846
3847 // 4) break before after nested name specifiers.
3848 verifyFormat(
3849 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003850 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3851 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003852 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003853
3854 // However, there are exceptions, if a sufficient amount of lines can be
3855 // saved.
3856 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3857 // more adjusting.
3858 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3859 " Cccccccccccccc cccccccccc,\n"
3860 " Cccccccccccccc cccccccccc,\n"
3861 " Cccccccccccccc cccccccccc,\n"
3862 " Cccccccccccccc cccccccccc);");
3863 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003864 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003865 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3866 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3867 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003868 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003869 verifyFormat(
3870 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3871 " Cccccccccccccc cccccccccc,\n"
3872 " Cccccccccccccc cccccccccc,\n"
3873 " Cccccccccccccc cccccccccc,\n"
3874 " Cccccccccccccc cccccccccc,\n"
3875 " Cccccccccccccc cccccccccc,\n"
3876 " Cccccccccccccc cccccccccc);");
3877 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3878 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3879 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3880 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3881 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003882
3883 // Break after multi-line parameters.
3884 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3885 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3886 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3887 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003888 verifyFormat("void SomeLoooooooooooongFunction(\n"
3889 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3890 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3891 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003892
3893 // Treat overloaded operators like other functions.
3894 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3895 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003896 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3897 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003898 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3899 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3900 verifyGoogleFormat(
3901 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3902 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003903 verifyGoogleFormat(
3904 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3905 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003906 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3907 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3908 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3909 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003910 verifyGoogleFormat(
3911 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3912 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3913 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003914 verifyGoogleFormat(
3915 "template <typename T>\n"
3916 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3917 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3918 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003919
3920 FormatStyle Style = getLLVMStyle();
3921 Style.PointerAlignment = FormatStyle::PAS_Left;
3922 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3923 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3924 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003925 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3926 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3927 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003928}
3929
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003930TEST_F(FormatTest, TrailingReturnType) {
3931 verifyFormat("auto foo() -> int;\n");
3932 verifyFormat("struct S {\n"
3933 " auto bar() const -> int;\n"
3934 "};");
3935 verifyFormat("template <size_t Order, typename T>\n"
3936 "auto load_img(const std::string &filename)\n"
3937 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003938 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3939 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003940 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003941 verifyFormat("template <typename T>\n"
3942 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3943 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003944
3945 // Not trailing return types.
3946 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003947}
3948
Daniel Jasper5be31f72013-05-21 09:16:31 +00003949TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003950 // Avoid breaking before trailing 'const' or other trailing annotations, if
3951 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003952 FormatStyle Style = getGoogleStyle();
3953 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003954 verifyFormat("void someLongFunction(\n"
3955 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003956 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003957 verifyFormat("LoooooongReturnType\n"
3958 "someLoooooooongFunction() const {}",
3959 getLLVMStyleWithColumns(47));
3960 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3961 " const {}",
3962 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003963 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3964 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3965 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3966 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3967 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3968 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003969 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3970 " aaaaaaaaaaa aaaaa) const override;");
3971 verifyGoogleFormat(
3972 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3973 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003974
Daniel Jasper5550de62014-02-17 07:57:46 +00003975 // Even if the first parameter has to be wrapped.
3976 verifyFormat("void someLongFunction(\n"
3977 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003978 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003979 verifyFormat("void someLongFunction(\n"
3980 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003981 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003982 verifyFormat("void someLongFunction(\n"
3983 " int someLongParameter) override {}",
3984 Style);
3985 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003986 " int someLongParameter) OVERRIDE {}",
3987 Style);
3988 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003989 " int someLongParameter) final {}",
3990 Style);
3991 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003992 " int someLongParameter) FINAL {}",
3993 Style);
3994 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003995 " int parameter) const override {}",
3996 Style);
3997
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003998 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3999 verifyFormat("void someLongFunction(\n"
4000 " int someLongParameter) const\n"
4001 "{\n"
4002 "}",
4003 Style);
4004
Daniel Jasper5550de62014-02-17 07:57:46 +00004005 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004006 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4007 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4008 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00004009
4010 // Breaking before function-like trailing annotations is fine to keep them
4011 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004012 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4013 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4014 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4015 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4016 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4017 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004018 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4019 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004020 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004021
4022 verifyFormat(
4023 "void aaaaaaaaaaaaaaaaaa()\n"
4024 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4025 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4026 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4027 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004028 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004029 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004030 " GUARDED_BY(aaaaaaaaaaaa);");
4031 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004032 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004033 " GUARDED_BY(aaaaaaaaaaaa);");
4034 verifyGoogleFormat(
4035 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4036 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004037 verifyGoogleFormat(
4038 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4039 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004040}
4041
Daniel Jasperf090f032015-05-18 09:47:22 +00004042TEST_F(FormatTest, FunctionAnnotations) {
4043 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004044 "int OldFunction(const string &parameter) {}");
4045 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004046 "string OldFunction(const string &parameter) {}");
4047 verifyFormat("template <typename T>\n"
4048 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4049 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004050
4051 // Not function annotations.
4052 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4053 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004054 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4055 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004056 verifyFormat("MACRO(abc).function() // wrap\n"
4057 " << abc;");
4058 verifyFormat("MACRO(abc)->function() // wrap\n"
4059 " << abc;");
4060 verifyFormat("MACRO(abc)::function() // wrap\n"
4061 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004062}
4063
Daniel Jasperf7935112012-12-03 18:12:45 +00004064TEST_F(FormatTest, BreaksDesireably) {
4065 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4066 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004067 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004068 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4069 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4070 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004071
4072 verifyFormat(
4073 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004074 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004075
4076 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4077 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4078 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004079
4080 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004081 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4082 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4083 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004084 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4085 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004086
4087 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4088 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4089
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004090 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004091 "void f() {\n"
4092 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4093 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4094 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004095 verifyFormat(
4096 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4097 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4098 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004099 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4100 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4101 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004102 "aaaaaa(aaa,\n"
4103 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004104 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4105 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004106 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4107 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4108 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004109
Daniel Jasper739b85f2015-06-29 10:42:59 +00004110 // Indent consistently independent of call expression and unary operator.
4111 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4112 " dddddddddddddddddddddddddddddd));");
4113 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4114 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004115 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004116 " dddddddddddddddddddddddddddddd));");
4117
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004118 // This test case breaks on an incorrect memoization, i.e. an optimization not
4119 // taking into account the StopAt value.
4120 verifyFormat(
4121 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004122 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4123 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4124 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004125
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004126 verifyFormat("{\n {\n {\n"
4127 " Annotation.SpaceRequiredBefore =\n"
4128 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4129 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4130 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004131
4132 // Break on an outer level if there was a break on an inner level.
4133 EXPECT_EQ("f(g(h(a, // comment\n"
4134 " b, c),\n"
4135 " d, e),\n"
4136 " x, y);",
4137 format("f(g(h(a, // comment\n"
4138 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004139
4140 // Prefer breaking similar line breaks.
4141 verifyFormat(
4142 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4143 " NSTrackingMouseEnteredAndExited |\n"
4144 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004145}
4146
Daniel Jasper18210d72014-10-09 09:52:05 +00004147TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4148 FormatStyle NoBinPacking = getGoogleStyle();
4149 NoBinPacking.BinPackParameters = false;
4150 NoBinPacking.BinPackArguments = true;
4151 verifyFormat("void f() {\n"
4152 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4153 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4154 "}",
4155 NoBinPacking);
4156 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4157 " int aaaaaaaaaaaaaaaaaaaa,\n"
4158 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4159 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004160
Daniel Jasper00693b082016-01-09 15:56:47 +00004161 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4162 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4163 " vector<int> bbbbbbbbbbbbbbb);",
4164 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004165 // FIXME: This behavior difference is probably not wanted. However, currently
4166 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4167 // template arguments from BreakBeforeParameter being set because of the
4168 // one-per-line formatting.
4169 verifyFormat(
4170 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4171 " aaaaaaaaaa> aaaaaaaaaa);",
4172 NoBinPacking);
4173 verifyFormat(
4174 "void fffffffffff(\n"
4175 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4176 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004177}
4178
Daniel Jasper9278eb92013-01-16 14:59:02 +00004179TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004180 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004181 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004182 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004183 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4184 " aaaaaaaaaaaaaaaaaaaa,\n"
4185 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4186 NoBinPacking);
4187 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4188 " aaaaaaaaaaaaa,\n"
4189 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4190 NoBinPacking);
4191 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004192 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4193 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4194 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4195 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004196 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4197 NoBinPacking);
4198 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4199 " .aaaaaaaaaaaaaaaaaa();",
4200 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004201 verifyFormat("void f() {\n"
4202 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4203 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4204 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004205 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004206
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004207 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004208 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4209 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004210 " aaaaaaaaaaaa);",
4211 NoBinPacking);
4212 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004213 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4214 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004215 " test);",
4216 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004217
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004218 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4219 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004220 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4221 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004222 NoBinPacking);
4223 verifyFormat("a(\"a\"\n"
4224 " \"a\",\n"
4225 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004226
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004227 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004228 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004229 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004230 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004231 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004232 verifyFormat(
4233 "void f() {\n"
4234 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4235 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004236 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004237 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004238 verifyFormat(
4239 "template <class SomeType, class SomeOtherType>\n"
4240 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4241 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004242}
4243
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004244TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4245 FormatStyle Style = getLLVMStyleWithColumns(15);
4246 Style.ExperimentalAutoDetectBinPacking = true;
4247 EXPECT_EQ("aaa(aaaa,\n"
4248 " aaaa,\n"
4249 " aaaa);\n"
4250 "aaa(aaaa,\n"
4251 " aaaa,\n"
4252 " aaaa);",
4253 format("aaa(aaaa,\n" // one-per-line
4254 " aaaa,\n"
4255 " aaaa );\n"
4256 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4257 Style));
4258 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4259 " aaaa);\n"
4260 "aaa(aaaa, aaaa,\n"
4261 " aaaa);",
4262 format("aaa(aaaa, aaaa,\n" // bin-packed
4263 " aaaa );\n"
4264 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4265 Style));
4266}
4267
Daniel Jasper04468962013-01-18 10:56:38 +00004268TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004269 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4270 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4271 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4272 " .StartsWith(\".init\", ORDER_INIT)\n"
4273 " .StartsWith(\".fini\", ORDER_FINI)\n"
4274 " .StartsWith(\".hash\", ORDER_HASH)\n"
4275 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004276
Daniel Jaspereb50c672013-02-15 20:33:06 +00004277 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004278 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004279 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004280 "aaaaaaa->aaaaaaa\n"
4281 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4282 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004283 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004284 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004285 "aaaaaaa->aaaaaaa\n"
4286 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4287 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4288 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004289 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004290 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004291 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004292 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4293 " aaaaaa->aaaaaaaaaaaa()\n"
4294 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004295 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004296 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004297 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004298 "void f() {\n"
4299 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004300 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004301 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004302 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004303 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004304 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004305 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004306 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004307 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004308 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004309 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004310 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004311
4312 verifyFormat(
4313 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4314 verifyFormat("aaaaaaaaaaaaaaa()\n"
4315 " .aaaaaaaaaaaaaaa()\n"
4316 " .aaaaaaaaaaaaaaa()\n"
4317 " .aaaaaaaaaaaaaaa()\n"
4318 " .aaaaaaaaaaaaaaa();");
4319 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4320 " .aaaaaaaaaaaaaaa()\n"
4321 " .aaaaaaaaaaaaaaa()\n"
4322 " .aaaaaaaaaaaaaaa();");
4323 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4324 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4325 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004326 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4327 " ->aaaaaaaaaaaaaae(0)\n"
4328 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004329
Daniel Jasper775954b2015-04-24 10:08:09 +00004330 // Don't linewrap after very short segments.
4331 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4332 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4333 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4334 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4335 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4336 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4337 verifyFormat("aaa()\n"
4338 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4339 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4340 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4341
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004342 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4343 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4344 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4345 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4346 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004347 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004348
Daniel Jaspera41aa532014-09-19 08:01:25 +00004349 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004350 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4351 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004352
4353 // Prefer not to create "hanging" indents.
4354 verifyFormat(
4355 "return !soooooooooooooome_map\n"
4356 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4357 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004358 verifyFormat(
4359 "return aaaaaaaaaaaaaaaa\n"
4360 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4361 " .aaaa(aaaaaaaaaaaaaa);");
4362 // No hanging indent here.
4363 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4364 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4365 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4366 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004367 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4368 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4369 getLLVMStyleWithColumns(60));
4370 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4371 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4372 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4373 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004374 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4375 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4376 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004377}
4378
Daniel Jasperde5c2072012-12-24 00:13:23 +00004379TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4380 verifyFormat(
4381 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004382 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004383 verifyFormat(
4384 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4385 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4386
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004387 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004388 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004389 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4390 " ccccccccccccccccccccccccc) {\n}");
4391
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004392 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004393 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004394 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4395 " ccccccccccccccccccccccccc) {\n}");
4396
Daniel Jasperde5c2072012-12-24 00:13:23 +00004397 verifyFormat(
4398 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004399 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004400 verifyFormat(
4401 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4402 " ccccccccccccccccccccccccc) {\n}");
4403
Daniel Jasper400adc62013-02-08 15:28:42 +00004404 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4405 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4406 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4407 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004408 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4409 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4410 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4411 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4412
Daniel Jasper400adc62013-02-08 15:28:42 +00004413 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4414 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4415 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004416 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4417 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4418 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004419}
4420
Daniel Jasper43b65482013-01-23 12:27:43 +00004421TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004422 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004423 "unsigned Cost =\n"
4424 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4425 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004426 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004427 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4428 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004429
4430 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004431 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4432 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004433 verifyFormat("unsigned OriginalStartColumn =\n"
4434 " SourceMgr.getSpellingColumnNumber(\n"
4435 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4436 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004437}
4438
Francois Ferrand9976efa2017-05-22 08:28:17 +00004439TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4440 FormatStyle Style = getLLVMStyle();
4441 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4442 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4443 Style);
4444
4445 Style.PenaltyBreakAssignment = 20;
4446 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4447 " cccccccccccccccccccccccccc;",
4448 Style);
4449}
4450
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004451TEST_F(FormatTest, AlignsAfterAssignments) {
4452 verifyFormat(
4453 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004454 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004455 verifyFormat(
4456 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004457 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004458 verifyFormat(
4459 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004460 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004461 verifyFormat(
4462 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004463 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004464 verifyFormat(
4465 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4466 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4467 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004468}
4469
4470TEST_F(FormatTest, AlignsAfterReturn) {
4471 verifyFormat(
4472 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4473 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4474 verifyFormat(
4475 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4476 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004477 verifyFormat(
4478 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004479 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004480 verifyFormat(
4481 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004482 " aaaaaaaaaaaaaaaaaaaaaa());");
4483 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4484 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4485 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4486 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4487 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004488 verifyFormat("return\n"
4489 " // true if code is one of a or b.\n"
4490 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004491}
4492
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004493TEST_F(FormatTest, AlignsAfterOpenBracket) {
4494 verifyFormat(
4495 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4496 " aaaaaaaaa aaaaaaa) {}");
4497 verifyFormat(
4498 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4499 " aaaaaaaaaaa aaaaaaaaa);");
4500 verifyFormat(
4501 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4502 " aaaaaaaaaaaaaaaaaaaaa));");
4503 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004504 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004505 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4506 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4507 Style);
4508 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4509 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4510 Style);
4511 verifyFormat("SomeLongVariableName->someFunction(\n"
4512 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4513 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004514 verifyFormat(
4515 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4516 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4517 Style);
4518 verifyFormat(
4519 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4520 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4521 Style);
4522 verifyFormat(
4523 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4524 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4525 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004526
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004527 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4528 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4529 " b));",
4530 Style);
4531
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004532 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4533 Style.BinPackArguments = false;
4534 Style.BinPackParameters = false;
4535 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4536 " aaaaaaaaaaa aaaaaaaa,\n"
4537 " aaaaaaaaa aaaaaaa,\n"
4538 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4539 Style);
4540 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4541 " aaaaaaaaaaa aaaaaaaaa,\n"
4542 " aaaaaaaaaaa aaaaaaaaa,\n"
4543 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4544 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004545 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4546 " aaaaaaaaaaaaaaa,\n"
4547 " aaaaaaaaaaaaaaaaaaaaa,\n"
4548 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004549 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004550 verifyFormat(
4551 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4552 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4553 Style);
4554 verifyFormat(
4555 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4556 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4557 Style);
4558 verifyFormat(
4559 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4560 " aaaaaaaaaaaaaaaaaaaaa(\n"
4561 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4562 " aaaaaaaaaaaaaaaa);",
4563 Style);
4564 verifyFormat(
4565 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4566 " aaaaaaaaaaaaaaaaaaaaa(\n"
4567 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4568 " aaaaaaaaaaaaaaaa);",
4569 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004570}
4571
Daniel Jasper3219e432014-12-02 13:24:51 +00004572TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4573 FormatStyle Style = getLLVMStyleWithColumns(40);
4574 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4575 " bbbbbbbbbbbbbbbbbbbbbb);",
4576 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004577 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004578 Style.AlignOperands = false;
4579 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4580 " bbbbbbbbbbbbbbbbbbbbbb);",
4581 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004582 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004583 Style.AlignOperands = true;
4584 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4585 " bbbbbbbbbbbbbbbbbbbbbb);",
4586 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004587 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004588 Style.AlignOperands = false;
4589 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4590 " bbbbbbbbbbbbbbbbbbbbbb);",
4591 Style);
4592}
4593
Daniel Jasper399d24b2013-01-09 07:06:56 +00004594TEST_F(FormatTest, BreaksConditionalExpressions) {
4595 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004596 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4597 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4598 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4599 verifyFormat(
4600 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004601 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4602 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004603 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004604 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4605 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4606 verifyFormat(
4607 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004608 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4609 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004610 verifyFormat(
4611 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4612 " : aaaaaaaaaaaaa);");
4613 verifyFormat(
4614 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004615 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004616 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4617 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004618 verifyFormat(
4619 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4620 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4621 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004622 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4623 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4624 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4625 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4626 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4627 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4628 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4629 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4630 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4631 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4632 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4633 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004634 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4635 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4636 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4637 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4638 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004639 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4640 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4641 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004642 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4643 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4644 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4645 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004646 verifyFormat(
4647 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4648 " ? aaaaaaaaaaaaaaa\n"
4649 " : aaaaaaaaaaaaaaa;");
4650 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004651 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004652 " ? b\n"
4653 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004654 verifyFormat("return aaaa == bbbb\n"
4655 " // comment\n"
4656 " ? aaaa\n"
4657 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004658 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004659 " format(TheLine.First,\n"
4660 " IndentForLevel[TheLine.Level] >= 0\n"
4661 " ? IndentForLevel[TheLine.Level]\n"
4662 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004663 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004664 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004665 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4666 " ? aaaaaaaaaaaaaaa\n"
4667 " : bbbbbbbbbbbbbbb //\n"
4668 " ? ccccccccccccccc\n"
4669 " : ddddddddddddddd;");
4670 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4671 " ? aaaaaaaaaaaaaaa\n"
4672 " : (bbbbbbbbbbbbbbb //\n"
4673 " ? ccccccccccccccc\n"
4674 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004675 verifyFormat(
4676 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4677 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4678 " aaaaaaaaaaaaaaaaaaaaa +\n"
4679 " aaaaaaaaaaaaaaaaaaaaa\n"
4680 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004681 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004682 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4683 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4684 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004685
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004686 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004687 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004688 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004689 "void f() {\n"
4690 " g(aaa,\n"
4691 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4692 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4693 " ? aaaaaaaaaaaaaaa\n"
4694 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004695 "}",
4696 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004697 verifyFormat(
4698 "void f() {\n"
4699 " g(aaa,\n"
4700 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4701 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4702 " ?: aaaaaaaaaaaaaaa);\n"
4703 "}",
4704 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004705
4706 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4707 " // comment.\n"
4708 " ccccccccccccccccccccccccccccccccccccccc\n"
4709 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4710 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004711
4712 // Assignments in conditional expressions. Apparently not uncommon :-(.
4713 verifyFormat("return a != b\n"
4714 " // comment\n"
4715 " ? a = b\n"
4716 " : a = b;");
4717 verifyFormat("return a != b\n"
4718 " // comment\n"
4719 " ? a = a != b\n"
4720 " // comment\n"
4721 " ? a = b\n"
4722 " : a\n"
4723 " : a;\n");
4724 verifyFormat("return a != b\n"
4725 " // comment\n"
4726 " ? a\n"
4727 " : a = a != b\n"
4728 " // comment\n"
4729 " ? a = b\n"
4730 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004731}
4732
Daniel Jasper165b29e2013-11-08 00:57:11 +00004733TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4734 FormatStyle Style = getLLVMStyle();
4735 Style.BreakBeforeTernaryOperators = false;
4736 Style.ColumnLimit = 70;
4737 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004738 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4739 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4740 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4741 Style);
4742 verifyFormat(
4743 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004744 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4745 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004746 Style);
4747 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004748 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4749 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4750 Style);
4751 verifyFormat(
4752 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004753 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4754 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004755 Style);
4756 verifyFormat(
4757 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4758 " aaaaaaaaaaaaa);",
4759 Style);
4760 verifyFormat(
4761 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4762 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4763 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4764 " aaaaaaaaaaaaa);",
4765 Style);
4766 verifyFormat(
4767 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4768 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4769 " aaaaaaaaaaaaa);",
4770 Style);
4771 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4772 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4773 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4774 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4775 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4776 Style);
4777 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4778 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4779 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4780 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4781 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4782 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4783 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4784 Style);
4785 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4786 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4787 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4788 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4789 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4790 Style);
4791 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4792 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4793 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4794 Style);
4795 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004796 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004797 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4798 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4799 Style);
4800 verifyFormat(
4801 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4802 " aaaaaaaaaaaaaaa :\n"
4803 " aaaaaaaaaaaaaaa;",
4804 Style);
4805 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4806 " aaaaaaaaa ?\n"
4807 " b :\n"
4808 " c);",
4809 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004810 verifyFormat("unsigned Indent =\n"
4811 " format(TheLine.First,\n"
4812 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4813 " IndentForLevel[TheLine.Level] :\n"
4814 " TheLine * 2,\n"
4815 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4816 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004817 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4818 " aaaaaaaaaaaaaaa :\n"
4819 " bbbbbbbbbbbbbbb ? //\n"
4820 " ccccccccccccccc :\n"
4821 " ddddddddddddddd;",
4822 Style);
4823 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4824 " aaaaaaaaaaaaaaa :\n"
4825 " (bbbbbbbbbbbbbbb ? //\n"
4826 " ccccccccccccccc :\n"
4827 " ddddddddddddddd);",
4828 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004829 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4830 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4831 " ccccccccccccccccccccccccccc;",
4832 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004833 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4834 " aaaaa :\n"
4835 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4836 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004837}
4838
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004839TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4840 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4841 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4842 verifyFormat("bool a = true, b = false;");
4843
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004844 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004845 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004846 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004847 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004848 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004849 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004850 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004851 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004852 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4853 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4854 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4855 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4856 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4857 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004858
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004859 FormatStyle Style = getGoogleStyle();
4860 Style.PointerAlignment = FormatStyle::PAS_Left;
4861 Style.DerivePointerAlignment = false;
4862 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4863 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4864 " *b = bbbbbbbbbbbbbbbbbbb;",
4865 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004866 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4867 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4868 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004869 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004870 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004871}
4872
Nico Weber4a5030c2013-01-12 01:28:06 +00004873TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4874 verifyFormat("arr[foo ? bar : baz];");
4875 verifyFormat("f()[foo ? bar : baz];");
4876 verifyFormat("(a + b)[foo ? bar : baz];");
4877 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4878}
4879
Daniel Jasperf7935112012-12-03 18:12:45 +00004880TEST_F(FormatTest, AlignsStringLiterals) {
4881 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4882 " \"short literal\");");
4883 verifyFormat(
4884 "looooooooooooooooooooooooongFunction(\n"
4885 " \"short literal\"\n"
4886 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004887 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4888 " \" string literals\",\n"
4889 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004890 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4891 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004892 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004893 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004894 getLLVMStyleWithColumns(28)));
4895 EXPECT_EQ(
4896 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4897 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4898 " \"aaaaaaaaaaaaaaaa\";",
4899 format("aaaaaa ="
4900 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4901 "aaaaaaaaaaaaaaaaaaaaa\" "
4902 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004903 verifyFormat("a = a + \"a\"\n"
4904 " \"a\"\n"
4905 " \"a\";");
4906 verifyFormat("f(\"a\", \"b\"\n"
4907 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004908
4909 verifyFormat(
4910 "#define LL_FORMAT \"ll\"\n"
4911 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4912 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004913
4914 verifyFormat("#define A(X) \\\n"
4915 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4916 " \"ccccc\"",
4917 getLLVMStyleWithColumns(23));
4918 verifyFormat("#define A \"def\"\n"
4919 "f(\"abc\" A \"ghi\"\n"
4920 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004921
4922 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004923 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004924 verifyFormat("#define A(X) \\\n"
4925 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4926 " L\"ccccc\"",
4927 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004928
4929 verifyFormat("f(@\"a\"\n"
4930 " @\"b\");");
4931 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004932 " @\"b\"\n"
4933 " @\"c\";");
4934 verifyFormat("NSString s = @\"a\"\n"
4935 " \"b\"\n"
4936 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004937}
4938
Zachary Turner448592e2015-12-18 22:20:15 +00004939TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004940 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004941 // No declarations or definitions should be moved to own line.
4942 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4943 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004944 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004945 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004946 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004947 "int f() { return 1; }\n"
4948 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004949 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004950
4951 // All declarations and definitions should have the return type moved to its
4952 // own
4953 // line.
4954 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4955 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004956 " int\n"
4957 " f() {\n"
4958 " return 1;\n"
4959 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004960 " int\n"
4961 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004962 "};\n"
4963 "int\n"
4964 "f() {\n"
4965 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004966 "}\n"
4967 "int\n"
4968 "g();\n",
4969 Style);
4970
4971 // Top-level definitions, and no kinds of declarations should have the
4972 // return type moved to its own line.
4973 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4974 verifyFormat("class B {\n"
4975 " int f() { return 1; }\n"
4976 " int g();\n"
4977 "};\n"
4978 "int\n"
4979 "f() {\n"
4980 " return 1;\n"
4981 "}\n"
4982 "int g();\n",
4983 Style);
4984
4985 // Top-level definitions and declarations should have the return type moved
4986 // to its own line.
4987 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4988 verifyFormat("class C {\n"
4989 " int f() { return 1; }\n"
4990 " int g();\n"
4991 "};\n"
4992 "int\n"
4993 "f() {\n"
4994 " return 1;\n"
4995 "}\n"
4996 "int\n"
4997 "g();\n",
4998 Style);
4999
5000 // All definitions should have the return type moved to its own line, but no
5001 // kinds of declarations.
5002 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5003 verifyFormat("class D {\n"
5004 " int\n"
5005 " f() {\n"
5006 " return 1;\n"
5007 " }\n"
5008 " int g();\n"
5009 "};\n"
5010 "int\n"
5011 "f() {\n"
5012 " return 1;\n"
5013 "}\n"
5014 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005015 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005016 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005017 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005018 " return \"\";\n"
5019 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005020 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005021 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005022 verifyFormat("template <class T>\n"
5023 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005024 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005025 " return NULL;\n"
5026 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005027 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005028 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005029 verifyFormat("class C {\n"
5030 " int\n"
5031 " operator+() {\n"
5032 " return 1;\n"
5033 " }\n"
5034 " int\n"
5035 " operator()() {\n"
5036 " return 1;\n"
5037 " }\n"
5038 "};\n",
5039 Style);
5040 verifyFormat("void\n"
5041 "A::operator()() {}\n"
5042 "void\n"
5043 "A::operator>>() {}\n"
5044 "void\n"
5045 "A::operator+() {}\n",
5046 Style);
5047 verifyFormat("void *operator new(std::size_t s);", // No break here.
5048 Style);
5049 verifyFormat("void *\n"
5050 "operator new(std::size_t s) {}",
5051 Style);
5052 verifyFormat("void *\n"
5053 "operator delete[](void *ptr) {}",
5054 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005055 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005056 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005057 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005058 "{\n"
5059 " return \"\";\n"
5060 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005061 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005062 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005063 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005064 "T *\n" // Problem here: no line break
5065 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005066 "{\n"
5067 " return NULL;\n"
5068 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005069 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005070 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005071}
5072
Alexander Kornienko58611712013-07-04 12:02:44 +00005073TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5074 FormatStyle NoBreak = getLLVMStyle();
5075 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5076 FormatStyle Break = getLLVMStyle();
5077 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005078 verifyFormat("aaaa = \"bbbb\"\n"
5079 " \"cccc\";",
5080 NoBreak);
5081 verifyFormat("aaaa =\n"
5082 " \"bbbb\"\n"
5083 " \"cccc\";",
5084 Break);
5085 verifyFormat("aaaa(\"bbbb\"\n"
5086 " \"cccc\");",
5087 NoBreak);
5088 verifyFormat("aaaa(\n"
5089 " \"bbbb\"\n"
5090 " \"cccc\");",
5091 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005092 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5093 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005094 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005095 verifyFormat("aaaa(qqq,\n"
5096 " \"bbbb\"\n"
5097 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005098 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005099 verifyFormat("aaaa(qqq,\n"
5100 " L\"bbbb\"\n"
5101 " L\"cccc\");",
5102 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005103 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5104 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005105 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005106 verifyFormat("string s = someFunction(\n"
5107 " \"abc\"\n"
5108 " \"abc\");",
5109 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005110
Daniel Jasper3251fff2014-06-10 06:27:23 +00005111 // As we break before unary operators, breaking right after them is bad.
5112 verifyFormat("string foo = abc ? \"x\"\n"
5113 " \"blah blah blah blah blah blah\"\n"
5114 " : \"y\";",
5115 Break);
5116
Daniel Jasperc834c702013-07-17 15:38:19 +00005117 // Don't break if there is no column gain.
5118 verifyFormat("f(\"aaaa\"\n"
5119 " \"bbbb\");",
5120 Break);
5121
5122 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005123 EXPECT_EQ("x = \"a\\\n"
5124 "b\\\n"
5125 "c\";",
5126 format("x = \"a\\\n"
5127 "b\\\n"
5128 "c\";",
5129 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005130 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005131 " \"a\\\n"
5132 "b\\\n"
5133 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005134 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005135 "b\\\n"
5136 "c\";",
5137 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005138
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00005139 EXPECT_EQ("NSString *const kString =\n"
5140 " @\"aaaa\"\n"
5141 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005142 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005143 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005144 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005145
5146 Break.ColumnLimit = 0;
5147 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005148}
5149
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005150TEST_F(FormatTest, AlignsPipes) {
5151 verifyFormat(
5152 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5153 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5154 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5155 verifyFormat(
5156 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5157 " << aaaaaaaaaaaaaaaaaaaa;");
5158 verifyFormat(
5159 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5160 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5161 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005162 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5163 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5164 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005165 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5166 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5167 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5168 verifyFormat(
5169 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5170 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5171 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005172 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5173 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5175 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005176 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5177 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005178 verifyFormat(
5179 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5180 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00005181 verifyFormat(
5182 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5183 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005184
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005185 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5186 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005187 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5188 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5189 " aaaaaaaaaaaaaaaaaaaaa)\n"
5190 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005191 verifyFormat("LOG_IF(aaa == //\n"
5192 " bbb)\n"
5193 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005194
Daniel Jasper467ddb12013-08-12 12:58:05 +00005195 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005196 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5197 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005198 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5199 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5200 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005201 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5202 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005203 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5204 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5205 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5206 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5207 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5208 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5209 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005210
Daniel Jasperc238c872013-04-02 14:33:13 +00005211 verifyFormat(
5212 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5213 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005214
5215 // Incomplete string literal.
5216 EXPECT_EQ("llvm::errs() << \"\n"
5217 " << a;",
5218 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005219
5220 verifyFormat("void f() {\n"
5221 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5222 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5223 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005224
5225 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005226 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5227 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5228 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005229
5230 // Handle '\n'.
5231 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5232 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5233 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5234 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5235 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5236 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5237 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005238}
5239
Daniel Jasper7209bb92016-12-13 11:16:42 +00005240TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5241 verifyFormat("return out << \"somepacket = {\\n\"\n"
5242 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5243 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5244 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5245 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5246 " << \"}\";");
5247
5248 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5249 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5250 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5251 verifyFormat(
5252 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5253 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5254 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5255 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5256 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5257 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5258 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5259 verifyFormat(
5260 "void f() {\n"
5261 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5262 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5263 "}");
5264
5265 // Breaking before the first "<<" is generally not desirable.
5266 verifyFormat(
5267 "llvm::errs()\n"
5268 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5269 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5270 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5271 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5272 getLLVMStyleWithColumns(70));
5273 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5274 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5275 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5276 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5277 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5278 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5279 getLLVMStyleWithColumns(70));
5280
5281 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5282 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5283 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5284 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5285 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5286 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005287 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5288 " (aaaa + aaaa);",
5289 getLLVMStyleWithColumns(40));
5290 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5291 " (aaaaaaa + aaaaa));",
5292 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005293 verifyFormat(
5294 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5295 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5296 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005297}
5298
Daniel Jasperf7935112012-12-03 18:12:45 +00005299TEST_F(FormatTest, UnderstandsEquals) {
5300 verifyFormat(
5301 "aaaaaaaaaaaaaaaaa =\n"
5302 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5303 verifyFormat(
5304 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005305 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005306 verifyFormat(
5307 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005308 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005309 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005310 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5311 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005312
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005313 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5314 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005315}
5316
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005317TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005318 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5319 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005320
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005321 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5322 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005323
5324 verifyFormat(
5325 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5326 " Parameter2);");
5327
5328 verifyFormat(
5329 "ShortObject->shortFunction(\n"
5330 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5331 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5332
5333 verifyFormat("loooooooooooooongFunction(\n"
5334 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5335
5336 verifyFormat(
5337 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5338 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5339
Daniel Jasper687af3b2013-02-14 14:26:07 +00005340 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5341 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005342 verifyFormat("void f() {\n"
5343 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5344 " .Times(2)\n"
5345 " .WillRepeatedly(Return(SomeValue));\n"
5346 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005347 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5348 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005349 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005350 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5351 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005352 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005353 verifyFormat("void f() {\n"
5354 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5355 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5356 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005357 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5358 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5359 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5360 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5361 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005362 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5363 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5364 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5365 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5366 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005367
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005368 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005369 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005370 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005371 verifyFormat(
5372 "aaaaaaaaaaa->aaaaaaaaa(\n"
5373 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5374 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005375
5376 verifyFormat(
5377 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5378 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005379 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5380 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5381 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5382 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005383
Daniel Jasper9b334242013-03-15 14:57:30 +00005384 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005385 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5386 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005387
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005388 FormatStyle NoBinPacking = getLLVMStyle();
5389 NoBinPacking.BinPackParameters = false;
5390 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5391 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5392 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5393 " aaaaaaaaaaaaaaaaaaa,\n"
5394 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5395 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005396
5397 // If there is a subsequent call, change to hanging indentation.
5398 verifyFormat(
5399 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5400 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5401 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5402 verifyFormat(
5403 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5404 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005405 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5406 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5407 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5408 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5409 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5410 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005411}
5412
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005413TEST_F(FormatTest, WrapsTemplateDeclarations) {
5414 verifyFormat("template <typename T>\n"
5415 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005416 verifyFormat("template <typename T>\n"
5417 "// T should be one of {A, B}.\n"
5418 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005419 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005420 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005421 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005422 verifyFormat("template <typename T>\n"
5423 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5424 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005425 verifyFormat(
5426 "template <typename T>\n"
5427 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5428 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005429 verifyFormat(
5430 "template <typename T>\n"
5431 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5432 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5433 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005434 verifyFormat("template <typename T>\n"
5435 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005436 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005437 verifyFormat(
5438 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5439 " typename T4 = char>\n"
5440 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005441 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5442 " template <typename> class cccccccccccccccccccccc,\n"
5443 " typename ddddddddddddd>\n"
5444 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005445 verifyFormat(
5446 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5447 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005448
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005449 verifyFormat("void f() {\n"
5450 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5451 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5452 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005453
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005454 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005455 verifyFormat("template <typename T> void f();");
5456 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005457 verifyFormat(
5458 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5459 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5460 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5461 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5462 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5463 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5464 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5465 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005466 EXPECT_EQ("static_cast<A< //\n"
5467 " B> *>(\n"
5468 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00005469 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00005470 format("static_cast<A<//\n"
5471 " B>*>(\n"
5472 "\n"
5473 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005474 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5475 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005476
5477 FormatStyle AlwaysBreak = getLLVMStyle();
5478 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5479 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5480 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5481 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5482 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5483 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5484 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5485 verifyFormat("template <template <typename> class Fooooooo,\n"
5486 " template <typename> class Baaaaaaar>\n"
5487 "struct C {};",
5488 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005489 verifyFormat("template <typename T> // T can be A, B or C.\n"
5490 "struct C {};",
5491 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005492 verifyFormat("template <enum E> class A {\n"
5493 "public:\n"
5494 " E *f();\n"
5495 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005496}
5497
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005498TEST_F(FormatTest, WrapsTemplateParameters) {
5499 FormatStyle Style = getLLVMStyle();
5500 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5501 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5502 verifyFormat(
5503 "template <typename... a> struct q {};\n"
5504 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5505 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5506 " y;",
5507 Style);
5508 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5509 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5510 verifyFormat(
5511 "template <typename... a> struct r {};\n"
5512 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5513 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5514 " y;",
5515 Style);
5516 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5517 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5518 verifyFormat(
5519 "template <typename... a> struct s {};\n"
5520 "extern s<\n"
5521 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5522 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5523 " y;",
5524 Style);
5525 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5526 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5527 verifyFormat(
5528 "template <typename... a> struct t {};\n"
5529 "extern t<\n"
5530 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5531 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5532 " y;",
5533 Style);
5534}
5535
Daniel Jasper45797022013-01-25 10:57:27 +00005536TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5537 verifyFormat(
5538 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5539 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5540 verifyFormat(
5541 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5542 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5543 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5544
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005545 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005546 verifyFormat(
5547 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5548 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005549 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005550
Daniel Jasper45797022013-01-25 10:57:27 +00005551 verifyFormat(
5552 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005553 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005554
5555 // Breaking at nested name specifiers is generally not desirable.
5556 verifyFormat(
5557 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5558 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005559
5560 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005561 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5562 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5563 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005564 " aaaaaaaaaaaaaaaaaaaaa);",
5565 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005566
5567 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5568 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5569 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005570}
5571
Daniel Jasperf7935112012-12-03 18:12:45 +00005572TEST_F(FormatTest, UnderstandsTemplateParameters) {
5573 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005574 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005575 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5576 verifyFormat("bool x = a < 1 || 2 > a;");
5577 verifyFormat("bool x = 5 < f<int>();");
5578 verifyFormat("bool x = f<int>() > 5;");
5579 verifyFormat("bool x = 5 < a<int>::x;");
5580 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5581 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5582
5583 verifyGoogleFormat("A<A<int>> a;");
5584 verifyGoogleFormat("A<A<A<int>>> a;");
5585 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005586 verifyGoogleFormat("A<A<int> > a;");
5587 verifyGoogleFormat("A<A<A<int> > > a;");
5588 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005589 verifyGoogleFormat("A<::A<int>> a;");
5590 verifyGoogleFormat("A<::A> a;");
5591 verifyGoogleFormat("A< ::A> a;");
5592 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005593 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5594 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005595 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5596 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005597 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5598 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005599
Nico Weber7533b4d2014-09-24 17:17:32 +00005600 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5601
Daniel Jasperf7935112012-12-03 18:12:45 +00005602 verifyFormat("test >> a >> b;");
5603 verifyFormat("test << a >> b;");
5604
5605 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005606 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005607 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005608 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5609 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005610 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005611 verifyFormat("f(a.operator()<A>());");
5612 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5613 " .template operator()<A>());",
5614 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005615
5616 // Not template parameters.
5617 verifyFormat("return a < b && c > d;");
5618 verifyFormat("void f() {\n"
5619 " while (a < b && c > d) {\n"
5620 " }\n"
5621 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005622 verifyFormat("template <typename... Types>\n"
5623 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005624
5625 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5626 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5627 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005628 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005629 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005630 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005631}
5632
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005633TEST_F(FormatTest, BitshiftOperatorWidth) {
5634 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5635 " bar */",
5636 format("int a=1<<2; /* foo\n"
5637 " bar */"));
5638
5639 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5640 " bar */",
5641 format("int b =256>>1 ; /* foo\n"
5642 " bar */"));
5643}
5644
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005645TEST_F(FormatTest, UnderstandsBinaryOperators) {
5646 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005647 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005648}
5649
5650TEST_F(FormatTest, UnderstandsPointersToMembers) {
5651 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005652 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005653 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005654 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005655 verifyFormat("void f() {\n"
5656 " (a->*f)();\n"
5657 " a->*x;\n"
5658 " (a.*f)();\n"
5659 " ((*a).*f)();\n"
5660 " a.*x;\n"
5661 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005662 verifyFormat("void f() {\n"
5663 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5664 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5665 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005666 verifyFormat(
5667 "(aaaaaaaaaa->*bbbbbbb)(\n"
5668 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005669 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005670 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005671 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005672}
5673
Daniel Jasper8dd40472012-12-21 09:41:31 +00005674TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005675 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005676 verifyFormat("f(-1, -2, -3);");
5677 verifyFormat("a[-1] = 5;");
5678 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005679 verifyFormat("if (i == -1) {\n}");
5680 verifyFormat("if (i != -1) {\n}");
5681 verifyFormat("if (i > -1) {\n}");
5682 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005683 verifyFormat("++(a->f());");
5684 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005685 verifyFormat("(a->f())++;");
5686 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005687 verifyFormat("if (!(a->f())) {\n}");
Krasimir Georgiev446d6ec2018-03-06 13:56:28 +00005688 verifyFormat("if (!+i) {\n}");
5689 verifyFormat("~&a;");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005690
5691 verifyFormat("a-- > b;");
5692 verifyFormat("b ? -a : c;");
5693 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005694 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005695 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005696 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005697
5698 verifyFormat("return -1;");
5699 verifyFormat("switch (a) {\n"
5700 "case -1:\n"
5701 " break;\n"
5702 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005703 verifyFormat("#define X -1");
5704 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005705
Chandler Carruthf8b72662014-03-02 12:37:31 +00005706 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5707 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005708
5709 verifyFormat("int a = /* confusing comment */ -1;");
5710 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5711 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005712}
5713
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005714TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005715 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005716 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005717 "}");
5718 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005719 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005720 verifyFormat("*aaa = aaaaaaa( // break\n"
5721 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005722}
5723
Daniel Jasper8863ada2013-08-26 08:10:17 +00005724TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005725 verifyFormat("bool operator<();");
5726 verifyFormat("bool operator>();");
5727 verifyFormat("bool operator=();");
5728 verifyFormat("bool operator==();");
5729 verifyFormat("bool operator!=();");
5730 verifyFormat("int operator+();");
5731 verifyFormat("int operator++();");
Daniel Jasperbbf5f4e2017-11-06 12:11:51 +00005732 verifyFormat("int operator++(int) volatile noexcept;");
Daniel Jasper804a2762016-01-09 15:56:40 +00005733 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005734 verifyFormat("bool operator();");
5735 verifyFormat("bool operator()();");
5736 verifyFormat("bool operator[]();");
5737 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005738 verifyFormat("operator int();");
5739 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005740 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005741 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005742 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005743 verifyFormat("void *operator new(std::size_t size);");
5744 verifyFormat("void *operator new[](std::size_t size);");
5745 verifyFormat("void operator delete(void *ptr);");
5746 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005747 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5748 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005749 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005750 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005751
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005752 verifyFormat(
5753 "ostream &operator<<(ostream &OutputStream,\n"
5754 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005755 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5756 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5757 " return left.group < right.group;\n"
5758 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005759 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005760 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005761
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005762 verifyGoogleFormat("operator void*();");
5763 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005764 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005765
5766 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005767 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5768 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005769}
5770
Daniel Jasper1c220482015-02-25 10:30:06 +00005771TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005772 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5773 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5774 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5775 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5776 verifyFormat("Deleted &operator=(const Deleted &) &;");
5777 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5778 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5779 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5780 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5781 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5782 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005783 verifyFormat("void Fn(T const &) const &;");
5784 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005785 verifyFormat("template <typename T>\n"
5786 "void F(T) && = delete;",
5787 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005788
Daniel Jasperaf642c62015-08-25 13:40:51 +00005789 FormatStyle AlignLeft = getLLVMStyle();
5790 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005791 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005792 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5793 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5794 AlignLeft);
5795 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5796 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005797 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5798 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5799 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5800 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00005801 verifyFormat("void Fn(T const&) const&;", AlignLeft);
5802 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005803
5804 FormatStyle Spaces = getLLVMStyle();
5805 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005806 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5807 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5808 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5809 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005810
5811 Spaces.SpacesInCStyleCastParentheses = false;
5812 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005813 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5814 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5815 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5816 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005817}
5818
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005819TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005820 verifyFormat("void f() {\n"
5821 " A *a = new A;\n"
5822 " A *a = new (placement) A;\n"
5823 " delete a;\n"
5824 " delete (A *)a;\n"
5825 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005826 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5827 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005828 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5829 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5830 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005831 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005832}
5833
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005834TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005835 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005836 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005837 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005838 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005839 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005840 verifyIndependentOfContext("int a = b * 10;");
5841 verifyIndependentOfContext("int a = 10 * b;");
5842 verifyIndependentOfContext("int a = b * c;");
5843 verifyIndependentOfContext("int a += b * c;");
5844 verifyIndependentOfContext("int a -= b * c;");
5845 verifyIndependentOfContext("int a *= b * c;");
5846 verifyIndependentOfContext("int a /= b * c;");
5847 verifyIndependentOfContext("int a = *b;");
5848 verifyIndependentOfContext("int a = *b * c;");
5849 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005850 verifyIndependentOfContext("int a = b * (10);");
5851 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005852 verifyIndependentOfContext("return 10 * b;");
5853 verifyIndependentOfContext("return *b * *c;");
5854 verifyIndependentOfContext("return a & ~b;");
5855 verifyIndependentOfContext("f(b ? *c : *d);");
5856 verifyIndependentOfContext("int a = b ? *c : *d;");
5857 verifyIndependentOfContext("*b = a;");
5858 verifyIndependentOfContext("a * ~b;");
5859 verifyIndependentOfContext("a * !b;");
5860 verifyIndependentOfContext("a * +b;");
5861 verifyIndependentOfContext("a * -b;");
5862 verifyIndependentOfContext("a * ++b;");
5863 verifyIndependentOfContext("a * --b;");
5864 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005865 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005866 verifyIndependentOfContext("f() * b;");
5867 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005868 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005869 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005870 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005871 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005872 verifyIndependentOfContext("return sizeof(int **);");
5873 verifyIndependentOfContext("return sizeof(int ******);");
5874 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005875 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005876 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005877 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005878 verifyGoogleFormat("return sizeof(int**);");
5879 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5880 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005881 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005882 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005883 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005884 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005885 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005886 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005887 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005888 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005889 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005890 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005891 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005892 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005893 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005894 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005895 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005896 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00005897 verifyFormat("void f(const MyOverride &override);");
5898 verifyFormat("void f(const MyFinal &final);");
5899 verifyIndependentOfContext("bool a = f() && override.f();");
5900 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00005901
Daniel Jasper5b49f472013-01-23 12:10:53 +00005902 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005903
Daniel Jasper5b49f472013-01-23 12:10:53 +00005904 verifyIndependentOfContext("A<int *> a;");
5905 verifyIndependentOfContext("A<int **> a;");
5906 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005907 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005908 verifyIndependentOfContext(
5909 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005910 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005911 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005912 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005913 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005914 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005915
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005916 verifyFormat(
5917 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5918 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5919
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005920 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005921 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005922 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005923 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005924 verifyGoogleFormat("A<int*> a;");
5925 verifyGoogleFormat("A<int**> a;");
5926 verifyGoogleFormat("A<int*, int*> a;");
5927 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005928 verifyGoogleFormat("f(b ? *c : *d);");
5929 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005930 verifyGoogleFormat("Type* t = **x;");
5931 verifyGoogleFormat("Type* t = *++*x;");
5932 verifyGoogleFormat("*++*x;");
5933 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5934 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005935 verifyGoogleFormat(
5936 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005937 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005938 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5939 verifyGoogleFormat("template <typename T>\n"
5940 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005941
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005942 FormatStyle Left = getLLVMStyle();
5943 Left.PointerAlignment = FormatStyle::PAS_Left;
5944 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005945 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005946 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00005947 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00005948 verifyFormat("delete *x;", Left);
5949 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
5950 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
5951 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005952
Daniel Jasper5b49f472013-01-23 12:10:53 +00005953 verifyIndependentOfContext("a = *(x + y);");
5954 verifyIndependentOfContext("a = &(x + y);");
5955 verifyIndependentOfContext("*(x + y).call();");
5956 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005957 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005958
Daniel Jasper5b49f472013-01-23 12:10:53 +00005959 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005960 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005961 "int *MyValues = {\n"
5962 " *A, // Operator detection might be confused by the '{'\n"
5963 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005964 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005965
Daniel Jasper5b49f472013-01-23 12:10:53 +00005966 verifyIndependentOfContext("if (int *a = &b)");
5967 verifyIndependentOfContext("if (int &a = *b)");
5968 verifyIndependentOfContext("if (a & b[i])");
5969 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5970 verifyIndependentOfContext("if (*b[i])");
5971 verifyIndependentOfContext("if (int *a = (&b))");
5972 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005973 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005974 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005975 verifyFormat("void f() {\n"
5976 " for (const int &v : Values) {\n"
5977 " }\n"
5978 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005979 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5980 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005981 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005982
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005983 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005984 verifyFormat("#define MACRO \\\n"
5985 " int *i = a * b; \\\n"
5986 " void f(a *b);",
5987 getLLVMStyleWithColumns(19));
5988
Daniel Jasper97b89482013-03-13 07:49:51 +00005989 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005990 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005991 verifyIndependentOfContext("T **t = new T *;");
5992 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005993 verifyGoogleFormat("A = new SomeType*[Length]();");
5994 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005995 verifyGoogleFormat("T** t = new T*;");
5996 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005997
Daniel Jaspera65e8872014-03-25 10:52:45 +00005998 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5999 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006000 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006001 "typename t::if<x && y>::type f() {}");
6002 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006003 verifyFormat("vector<int *> v;");
6004 verifyFormat("vector<int *const> v;");
6005 verifyFormat("vector<int *const **const *> v;");
6006 verifyFormat("vector<int *volatile> v;");
6007 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006008 verifyFormat("foo<b && false>();");
6009 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00006010 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00006011 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006012 "template <class T, class = typename std::enable_if<\n"
6013 " std::is_integral<T>::value &&\n"
6014 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
6015 "void F();",
6016 getLLVMStyleWithColumns(70));
6017 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006018 "template <class T,\n"
6019 " class = typename std::enable_if<\n"
6020 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006021 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
6022 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006023 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006024 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006025 verifyFormat(
6026 "template <class T,\n"
6027 " class = typename ::std::enable_if<\n"
6028 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6029 "void F();",
6030 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006031
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006032 verifyIndependentOfContext("MACRO(int *i);");
6033 verifyIndependentOfContext("MACRO(auto *a);");
6034 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00006035 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006036 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006037 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006038 // FIXME: Is there a way to make this work?
6039 // verifyIndependentOfContext("MACRO(A *a);");
6040
Daniel Jasper32ccb032014-06-23 07:36:18 +00006041 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006042 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006043
Daniel Jasper866468a2014-04-14 13:15:29 +00006044 EXPECT_EQ("#define OP(x) \\\n"
6045 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6046 " return s << a.DebugString(); \\\n"
6047 " }",
6048 format("#define OP(x) \\\n"
6049 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6050 " return s << a.DebugString(); \\\n"
6051 " }",
6052 getLLVMStyleWithColumns(50)));
6053
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006054 // FIXME: We cannot handle this case yet; we might be able to figure out that
6055 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006056 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006057
6058 FormatStyle PointerMiddle = getLLVMStyle();
6059 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6060 verifyFormat("delete *x;", PointerMiddle);
6061 verifyFormat("int * x;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006062 verifyFormat("int *[] x;", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006063 verifyFormat("template <int * y> f() {}", PointerMiddle);
6064 verifyFormat("int * f(int * a) {}", PointerMiddle);
6065 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6066 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6067 verifyFormat("A<int *> a;", PointerMiddle);
6068 verifyFormat("A<int **> a;", PointerMiddle);
6069 verifyFormat("A<int *, int *> a;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006070 verifyFormat("A<int *[]> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006071 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6072 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006073 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006074
6075 // Member function reference qualifiers aren't binary operators.
6076 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006077 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006078 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006079 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006080 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006081 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006082}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006083
Daniel Jasperee6d6502013-07-17 20:25:02 +00006084TEST_F(FormatTest, UnderstandsAttributes) {
6085 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006086 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6087 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006088 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006089 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006090 verifyFormat("__attribute__((nodebug)) void\n"
6091 "foo() {}\n",
6092 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006093}
6094
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006095TEST_F(FormatTest, UnderstandsSquareAttributes) {
6096 verifyFormat("SomeType s [[unused]] (InitValue);");
6097 verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
6098 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
6099 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
6100 verifyFormat("void f() [[deprecated(\"so sorry\")]];");
6101 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6102 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Manuel Klimekd0f3fe52018-04-11 14:51:54 +00006103
6104 // Make sure we do not mistake attributes for array subscripts.
6105 verifyFormat("int a() {}\n"
6106 "[[unused]] int b() {}\n");
6107
6108 // On the other hand, we still need to correctly find array subscripts.
6109 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
6110
6111 // Make sure we do not parse attributes as lambda introducers.
6112 FormatStyle MultiLineFunctions = getLLVMStyle();
6113 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6114 verifyFormat("[[unused]] int b() {\n"
6115 " return 42;\n"
6116 "}\n",
6117 MultiLineFunctions);
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006118}
6119
Daniel Jasper10cd5812013-05-06 06:35:44 +00006120TEST_F(FormatTest, UnderstandsEllipsis) {
6121 verifyFormat("int printf(const char *fmt, ...);");
6122 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006123 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6124
6125 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006126 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006127 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006128}
6129
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006130TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006131 EXPECT_EQ("int *a;\n"
6132 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006133 "int *a;",
6134 format("int *a;\n"
6135 "int* a;\n"
6136 "int *a;",
6137 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006138 EXPECT_EQ("int* a;\n"
6139 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006140 "int* a;",
6141 format("int* a;\n"
6142 "int* a;\n"
6143 "int *a;",
6144 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006145 EXPECT_EQ("int *a;\n"
6146 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006147 "int *a;",
6148 format("int *a;\n"
6149 "int * a;\n"
6150 "int * a;",
6151 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006152 EXPECT_EQ("auto x = [] {\n"
6153 " int *a;\n"
6154 " int *a;\n"
6155 " int *a;\n"
6156 "};",
6157 format("auto x=[]{int *a;\n"
6158 "int * a;\n"
6159 "int * a;};",
6160 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006161}
6162
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006163TEST_F(FormatTest, UnderstandsRvalueReferences) {
6164 verifyFormat("int f(int &&a) {}");
6165 verifyFormat("int f(int a, char &&b) {}");
6166 verifyFormat("void f() { int &&a = b; }");
6167 verifyGoogleFormat("int f(int a, char&& b) {}");
6168 verifyGoogleFormat("void f() { int&& a = b; }");
6169
Daniel Jasper1eff9082013-05-27 16:36:33 +00006170 verifyIndependentOfContext("A<int &&> a;");
6171 verifyIndependentOfContext("A<int &&, int &&> a;");
6172 verifyGoogleFormat("A<int&&> a;");
6173 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006174
6175 // Not rvalue references:
6176 verifyFormat("template <bool B, bool C> class A {\n"
6177 " static_assert(B && C, \"Something is wrong\");\n"
6178 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006179 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6180 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006181 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006182}
6183
Manuel Klimekc1237a82013-01-23 14:08:21 +00006184TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6185 verifyFormat("void f() {\n"
6186 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006187 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006188 "}",
6189 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006190}
6191
Daniel Jasperef906a92013-01-13 08:01:36 +00006192TEST_F(FormatTest, FormatsCasts) {
6193 verifyFormat("Type *A = static_cast<Type *>(P);");
6194 verifyFormat("Type *A = (Type *)P;");
6195 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6196 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006197 verifyFormat("int a = (int)2.0f;");
6198 verifyFormat("x[(int32)y];");
6199 verifyFormat("x = (int32)y;");
6200 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6201 verifyFormat("int a = (int)*b;");
6202 verifyFormat("int a = (int)2.0f;");
6203 verifyFormat("int a = (int)~0;");
6204 verifyFormat("int a = (int)++a;");
6205 verifyFormat("int a = (int)sizeof(int);");
6206 verifyFormat("int a = (int)+2;");
6207 verifyFormat("my_int a = (my_int)2.0f;");
6208 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006209 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006210 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006211 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006212 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006213 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006214
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006215 verifyFormat("void f() { my_int a = (my_int)*b; }");
6216 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6217 verifyFormat("my_int a = (my_int)~0;");
6218 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006219 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006220 verifyFormat("my_int a = (my_int)1;");
6221 verifyFormat("my_int a = (my_int *)1;");
6222 verifyFormat("my_int a = (const my_int)-1;");
6223 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006224 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006225 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006226 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006227 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006228
6229 // FIXME: single value wrapped with paren will be treated as cast.
6230 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006231
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006232 verifyFormat("{ (void)F; }");
6233
Daniel Jasper998cabc2013-07-18 14:46:07 +00006234 // Don't break after a cast's
6235 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6236 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6237 " bbbbbbbbbbbbbbbbbbbbbb);");
6238
Daniel Jasperef906a92013-01-13 08:01:36 +00006239 // These are not casts.
6240 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006241 verifyFormat("f(foo)->b;");
6242 verifyFormat("f(foo).b;");
6243 verifyFormat("f(foo)(b);");
6244 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006245 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006246 verifyFormat("(*funptr)(foo)[4];");
6247 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006248 verifyFormat("void f(int *);");
6249 verifyFormat("void f(int *) = 0;");
6250 verifyFormat("void f(SmallVector<int>) {}");
6251 verifyFormat("void f(SmallVector<int>);");
6252 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006253 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006254 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006255 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006256 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6257 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006258 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006259
Daniel Jasperba0bda92013-02-23 08:07:18 +00006260 // These are not casts, but at some point were confused with casts.
6261 verifyFormat("virtual void foo(int *) override;");
6262 verifyFormat("virtual void foo(char &) const;");
6263 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006264 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006265 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006266 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006267 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006268
6269 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6270 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006271 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006272 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006273 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6274 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6275 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006276}
6277
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006278TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006279 verifyFormat("A<bool()> a;");
6280 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006281 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006282 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006283 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006284 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006285 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006286 verifyFormat("template <class CallbackClass>\n"
6287 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006288
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006289 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6290 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006291 verifyGoogleFormat(
6292 "template <class CallbackClass>\n"
6293 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006294
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006295 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006296 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006297 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006298 verifyFormat("some_var = function(*some_pointer_var)[0];");
6299 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006300 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006301 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00006302 verifyFormat("std::function<\n"
6303 " LooooooooooongTemplatedType<\n"
6304 " SomeType>*(\n"
6305 " LooooooooooooooooongType type)>\n"
6306 " function;",
6307 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006308}
6309
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006310TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6311 verifyFormat("A (*foo_)[6];");
6312 verifyFormat("vector<int> (*foo_)[6];");
6313}
6314
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006315TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6316 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6317 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6318 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6319 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006320 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6321 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006322
6323 // Different ways of ()-initializiation.
6324 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6325 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6326 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6327 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6328 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6329 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006330 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6331 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006332
6333 // Lambdas should not confuse the variable declaration heuristic.
6334 verifyFormat("LooooooooooooooooongType\n"
6335 " variable(nullptr, [](A *a) {});",
6336 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006337}
6338
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006339TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006340 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006341 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006342 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006343 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006344 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006345 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006346 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6347 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006348 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6349 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006350 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6351 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006352 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6353 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006354 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6355 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006356 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6357 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6358 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6359 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006360 FormatStyle Indented = getLLVMStyle();
6361 Indented.IndentWrappedFunctionNames = true;
6362 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6363 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6364 Indented);
6365 verifyFormat(
6366 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6367 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6368 Indented);
6369 verifyFormat(
6370 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6371 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6372 Indented);
6373 verifyFormat(
6374 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6375 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6376 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006377
6378 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006379 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6380 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6381 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006382
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006383 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006384 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006385 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006386 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6387 " SourceLocation L, IdentifierIn *II,\n"
6388 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006389 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006390 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006391 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006392 " const SomeType<string, SomeOtherTemplateParameter>\n"
6393 " &ReallyReallyLongParameterName,\n"
6394 " const SomeType<string, SomeOtherTemplateParameter>\n"
6395 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006396 verifyFormat("template <typename A>\n"
6397 "SomeLoooooooooooooooooooooongType<\n"
6398 " typename some_namespace::SomeOtherType<A>::Type>\n"
6399 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006400
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006401 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006402 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6403 " aaaaaaaaaaaaaaaaaaaaaaa;");
6404 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006405 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6406 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006407 verifyGoogleFormat(
6408 "some_namespace::LongReturnType\n"
6409 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006410 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006411
6412 verifyGoogleFormat("template <typename T>\n"
6413 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006414 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006415 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6416 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006417
6418 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006419 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6420 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006421 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6422 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6423 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6424 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6425 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6426 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6427 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006428
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006429 verifyFormat("template <typename T> // Templates on own line.\n"
6430 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006431 "MyFunction(int a);",
6432 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006433}
6434
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006435TEST_F(FormatTest, FormatsArrays) {
6436 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6437 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006438 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6439 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006440 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6441 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006442 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6443 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6444 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6445 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6446 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6447 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6448 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6449 verifyFormat(
6450 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6451 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6452 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006453 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6454 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006455
6456 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6457 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006458 verifyFormat(
6459 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6460 " .aaaaaaa[0]\n"
6461 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006462 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006463
6464 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006465
6466 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6467 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006468}
6469
Daniel Jaspere9de2602012-12-06 09:56:08 +00006470TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6471 verifyFormat("(a)->b();");
6472 verifyFormat("--a;");
6473}
6474
Daniel Jasper8b529712012-12-04 13:02:32 +00006475TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006476 verifyFormat("#include <string>\n"
6477 "#include <a/b/c.h>\n"
6478 "#include \"a/b/string\"\n"
6479 "#include \"string.h\"\n"
6480 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006481 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006482 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006483 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006484 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006485 "#include \"some long include\" // with a comment\n"
Manuel Klimek45ab5592017-11-14 09:19:53 +00006486 "#include \"some very long include path\"\n"
6487 "#include <some/very/long/include/path>\n",
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006488 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006489 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6490 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006491
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006492 verifyFormat("#import <string>");
6493 verifyFormat("#import <a/b/c.h>");
6494 verifyFormat("#import \"a/b/string\"");
6495 verifyFormat("#import \"string.h\"");
6496 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006497 verifyFormat("#if __has_include(<strstream>)\n"
6498 "#include <strstream>\n"
6499 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006500
Daniel Jasper343643b2014-08-13 08:29:18 +00006501 verifyFormat("#define MY_IMPORT <a/b>");
6502
Nico Weber21088802017-02-10 19:36:52 +00006503 verifyFormat("#if __has_include(<a/b>)");
6504 verifyFormat("#if __has_include_next(<a/b>)");
6505 verifyFormat("#define F __has_include(<a/b>)");
6506 verifyFormat("#define F __has_include_next(<a/b>)");
6507
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006508 // Protocol buffer definition or missing "#".
6509 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6510 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006511
6512 FormatStyle Style = getLLVMStyle();
6513 Style.AlwaysBreakBeforeMultilineStrings = true;
6514 Style.ColumnLimit = 0;
6515 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006516
6517 // But 'import' might also be a regular C++ namespace.
6518 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6519 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006520}
6521
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006522//===----------------------------------------------------------------------===//
6523// Error recovery tests.
6524//===----------------------------------------------------------------------===//
6525
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006526TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006527 FormatStyle NoBinPacking = getLLVMStyle();
6528 NoBinPacking.BinPackParameters = false;
6529 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6530 " double *min_x,\n"
6531 " double *max_x,\n"
6532 " double *min_y,\n"
6533 " double *max_y,\n"
6534 " double *min_z,\n"
6535 " double *max_z, ) {}",
6536 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006537}
6538
Daniel Jasper83a54d22013-01-10 09:26:47 +00006539TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006540 verifyFormat("void f() { return; }\n42");
6541 verifyFormat("void f() {\n"
6542 " if (0)\n"
6543 " return;\n"
6544 "}\n"
6545 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006546 verifyFormat("void f() { return }\n42");
6547 verifyFormat("void f() {\n"
6548 " if (0)\n"
6549 " return\n"
6550 "}\n"
6551 "42");
6552}
6553
6554TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6555 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6556 EXPECT_EQ("void f() {\n"
6557 " if (a)\n"
6558 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006559 "}",
6560 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006561 EXPECT_EQ("namespace N {\n"
6562 "void f()\n"
6563 "}",
6564 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006565 EXPECT_EQ("namespace N {\n"
6566 "void f() {}\n"
6567 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006568 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006569 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006570}
6571
Daniel Jasper2df93312013-01-09 10:16:05 +00006572TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6573 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006574 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006575 " b;",
6576 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006577 verifyFormat("function(\n"
6578 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006579 " LoooooooooooongArgument);\n",
6580 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006581}
6582
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006583TEST_F(FormatTest, IncorrectAccessSpecifier) {
6584 verifyFormat("public:");
6585 verifyFormat("class A {\n"
6586 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006587 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006588 "};");
6589 verifyFormat("public\n"
6590 "int qwerty;");
6591 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006592 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006593 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006594 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006595 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006596 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006597}
Daniel Jasperf7935112012-12-03 18:12:45 +00006598
Daniel Jasper291f9362013-03-20 15:58:10 +00006599TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6600 verifyFormat("{");
6601 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006602 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006603}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006604
6605TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006606 verifyFormat("do {\n}");
6607 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006608 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006609 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006610 "wheeee(fun);");
6611 verifyFormat("do {\n"
6612 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006613 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006614}
6615
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006616TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006617 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006618 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006619 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006620 verifyFormat("while {\n foo;\n foo();\n}");
6621 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006622}
6623
Daniel Jasperc0880a92013-01-04 18:52:56 +00006624TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006625 verifyIncompleteFormat("namespace {\n"
6626 "class Foo { Foo (\n"
6627 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006628 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006629}
6630
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006631TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006632 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006633 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6634 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006635 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006636
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006637 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006638 " {\n"
6639 " breakme(\n"
6640 " qwe);\n"
6641 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006642 format("{\n"
6643 " {\n"
6644 " breakme(qwe);\n"
6645 "}\n",
6646 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006647}
6648
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006649TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006650 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006651 " avariable,\n"
6652 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006653 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006654}
6655
Manuel Klimek762dd182013-01-21 10:07:49 +00006656TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006657 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006658}
6659
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006660TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006661 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006662 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006663 " 1,\n"
6664 " 2,\n"
6665 " 3,\n"
6666 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006667 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006668 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6669 verifyFormat("f({1, 2});");
6670 verifyFormat("auto v = Foo{-1};");
6671 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6672 verifyFormat("Class::Class : member{1, 2, 3} {}");
6673 verifyFormat("new vector<int>{1, 2, 3};");
6674 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006675 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006676 verifyFormat("return {arg1, arg2};");
6677 verifyFormat("return {arg1, SomeType{parameter}};");
6678 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6679 verifyFormat("new T{arg1, arg2};");
6680 verifyFormat("f(MyMap[{composite, key}]);");
6681 verifyFormat("class Class {\n"
6682 " T member = {arg1, arg2};\n"
6683 "};");
6684 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006685 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6686 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006687 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6688 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006689
Daniel Jasper438059e2014-05-22 12:11:13 +00006690 verifyFormat("int foo(int i) { return fo1{}(i); }");
6691 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006692 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006693 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006694 verifyFormat("Node n{1, Node{1000}, //\n"
6695 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006696 verifyFormat("Aaaa aaaaaaa{\n"
6697 " {\n"
6698 " aaaa,\n"
6699 " },\n"
6700 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006701 verifyFormat("class C : public D {\n"
6702 " SomeClass SC{2};\n"
6703 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006704 verifyFormat("class C : public A {\n"
6705 " class D : public B {\n"
6706 " void f() { int i{2}; }\n"
6707 " };\n"
6708 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006709 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006710
Francois Ferrandf92f8062018-05-16 08:03:52 +00006711 // Avoid breaking between equal sign and opening brace
6712 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
6713 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
6714 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
6715 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
6716 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
6717 " {\"ccccccccccccccccccccc\", 2}};",
6718 AvoidBreakingFirstArgument);
6719
Francois Ferrandd2130f52017-06-30 20:00:02 +00006720 // Binpacking only if there is no trailing comma
6721 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6722 " cccccccccc, dddddddddd};",
6723 getLLVMStyleWithColumns(50));
6724 verifyFormat("const Aaaaaa aaaaa = {\n"
6725 " aaaaaaaaaaa,\n"
6726 " bbbbbbbbbbb,\n"
6727 " ccccccccccc,\n"
6728 " ddddddddddd,\n"
6729 "};", getLLVMStyleWithColumns(50));
6730
Daniel Jaspere4ada022016-12-13 10:05:03 +00006731 // Cases where distinguising braced lists and blocks is hard.
6732 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6733 verifyFormat("void f() {\n"
6734 " return; // comment\n"
6735 "}\n"
6736 "SomeType t;");
6737 verifyFormat("void f() {\n"
6738 " if (a) {\n"
6739 " f();\n"
6740 " }\n"
6741 "}\n"
6742 "SomeType t;");
6743
Daniel Jasper08434342015-05-26 07:26:26 +00006744 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006745 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006746 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006747 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6748 " bbbbb,\n"
6749 " ccccc,\n"
6750 " ddddd,\n"
6751 " eeeee,\n"
6752 " ffffff,\n"
6753 " ggggg,\n"
6754 " hhhhhh,\n"
6755 " iiiiii,\n"
6756 " jjjjjj,\n"
6757 " kkkkkk};",
6758 NoBinPacking);
6759 verifyFormat("const Aaaaaa aaaaa = {\n"
6760 " aaaaa,\n"
6761 " bbbbb,\n"
6762 " ccccc,\n"
6763 " ddddd,\n"
6764 " eeeee,\n"
6765 " ffffff,\n"
6766 " ggggg,\n"
6767 " hhhhhh,\n"
6768 " iiiiii,\n"
6769 " jjjjjj,\n"
6770 " kkkkkk,\n"
6771 "};",
6772 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006773 verifyFormat(
6774 "const Aaaaaa aaaaa = {\n"
6775 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6776 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6777 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6778 "};",
6779 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006780
Chandler Carruthf8b72662014-03-02 12:37:31 +00006781 // FIXME: The alignment of these trailing comments might be bad. Then again,
6782 // this might be utterly useless in real code.
6783 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006784 " : some_value{ //\n"
6785 " aaaaaaa, //\n"
6786 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006787
Chandler Carruthf8b72662014-03-02 12:37:31 +00006788 // In braced lists, the first comment is always assumed to belong to the
6789 // first element. Thus, it can be moved to the next or previous line as
6790 // appropriate.
6791 EXPECT_EQ("function({// First element:\n"
6792 " 1,\n"
6793 " // Second element:\n"
6794 " 2});",
6795 format("function({\n"
6796 " // First element:\n"
6797 " 1,\n"
6798 " // Second element:\n"
6799 " 2});"));
6800 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6801 " // First element:\n"
6802 " 1,\n"
6803 " // Second element:\n"
6804 " 2};",
6805 format("std::vector<int> MyNumbers{// First element:\n"
6806 " 1,\n"
6807 " // Second element:\n"
6808 " 2};",
6809 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00006810 // A trailing comma should still lead to an enforced line break and no
6811 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00006812 EXPECT_EQ("vector<int> SomeVector = {\n"
6813 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006814 " 1,\n"
6815 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006816 "};",
6817 format("vector<int> SomeVector = { // aaa\n"
6818 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006819
Chandler Carruthf8b72662014-03-02 12:37:31 +00006820 FormatStyle ExtraSpaces = getLLVMStyle();
6821 ExtraSpaces.Cpp11BracedListStyle = false;
6822 ExtraSpaces.ColumnLimit = 75;
6823 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6824 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6825 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6826 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6827 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6828 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6829 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6830 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6831 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6832 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6833 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6834 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6835 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6836 verifyFormat("class Class {\n"
6837 " T member = { arg1, arg2 };\n"
6838 "};",
6839 ExtraSpaces);
6840 verifyFormat(
6841 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6842 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6843 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6844 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6845 ExtraSpaces);
6846 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006847 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006848 ExtraSpaces);
6849 verifyFormat(
6850 "someFunction(OtherParam,\n"
6851 " BracedList{ // comment 1 (Forcing interesting break)\n"
6852 " param1, param2,\n"
6853 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006854 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006855 ExtraSpaces);
6856 verifyFormat(
6857 "std::this_thread::sleep_for(\n"
6858 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6859 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006860 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006861 " aaaaaaa,\n"
6862 " aaaaaaaaaa,\n"
6863 " aaaaa,\n"
6864 " aaaaaaaaaaaaaaa,\n"
6865 " aaa,\n"
6866 " aaaaaaaaaa,\n"
6867 " a,\n"
6868 " aaaaaaaaaaaaaaaaaaaaa,\n"
6869 " aaaaaaaaaaaa,\n"
6870 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6871 " aaaaaaa,\n"
6872 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006873 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00006874 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
6875 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Francois Ferrandf92f8062018-05-16 08:03:52 +00006876
6877 // Avoid breaking between initializer/equal sign and opening brace
6878 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
6879 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
6880 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
6881 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
6882 " { \"ccccccccccccccccccccc\", 2 }\n"
6883 "};",
6884 ExtraSpaces);
6885 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
6886 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
6887 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
6888 " { \"ccccccccccccccccccccc\", 2 }\n"
6889 "};",
6890 ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006891}
6892
Daniel Jasper33b909c2013-10-25 14:29:37 +00006893TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006894 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6895 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6896 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6897 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6898 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6899 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006900 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006901 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006902 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006903 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6904 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006905 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006906 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6907 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6908 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6909 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6910 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6911 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6912 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006913 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006914 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6915 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006916 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6917 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6918 " // Separating comment.\n"
6919 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6920 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6921 " // Leading comment\n"
6922 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6923 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006924 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6925 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006926 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006927 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6928 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006929 getLLVMStyleWithColumns(38));
6930 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006931 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6932 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006933 verifyFormat(
6934 "static unsigned SomeValues[10][3] = {\n"
6935 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6936 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6937 verifyFormat("static auto fields = new vector<string>{\n"
6938 " \"aaaaaaaaaaaaa\",\n"
6939 " \"aaaaaaaaaaaaa\",\n"
6940 " \"aaaaaaaaaaaa\",\n"
6941 " \"aaaaaaaaaaaaaa\",\n"
6942 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6943 " \"aaaaaaaaaaaa\",\n"
6944 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6945 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006946 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6947 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6948 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6949 " 3, cccccccccccccccccccccc};",
6950 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006951
6952 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006953 verifyFormat("vector<int> x = {\n"
6954 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6955 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006956 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006957 verifyFormat("vector<int> x = {\n"
6958 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006959 "};",
6960 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006961 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6962 " 1, 1, 1, 1,\n"
6963 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006964 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006965
Daniel Jasper60c27072015-05-13 08:16:00 +00006966 // Trailing comment in the first line.
6967 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6968 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6969 " 111111111, 222222222, 3333333333, 444444444, //\n"
6970 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006971 // Trailing comment in the last line.
6972 verifyFormat("int aaaaa[] = {\n"
6973 " 1, 2, 3, // comment\n"
6974 " 4, 5, 6 // comment\n"
6975 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006976
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006977 // With nested lists, we should either format one item per line or all nested
6978 // lists one on line.
6979 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006980 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6981 " {aaaaaaaaaaaaaaaaaaa},\n"
6982 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6983 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006984 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006985 verifyFormat(
6986 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006987 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6988 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6989 " {aaa, aaa},\n"
6990 " {aaa, aaa},\n"
6991 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6992 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6993 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006994
6995 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00006996 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006997 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006998
6999 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00007000
Daniel Jaspereb65e912015-12-21 18:31:15 +00007001 // No braced initializer here.
7002 verifyFormat("void f() {\n"
7003 " struct Dummy {};\n"
7004 " f(v);\n"
7005 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00007006
7007 // Long lists should be formatted in columns even if they are nested.
7008 verifyFormat(
7009 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7010 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7011 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7012 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7013 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7014 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00007015
7016 // Allow "single-column" layout even if that violates the column limit. There
7017 // isn't going to be a better way.
7018 verifyFormat("std::vector<int> a = {\n"
7019 " aaaaaaaa,\n"
7020 " aaaaaaaa,\n"
7021 " aaaaaaaa,\n"
7022 " aaaaaaaa,\n"
7023 " aaaaaaaaaa,\n"
7024 " aaaaaaaa,\n"
7025 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7026 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00007027 verifyFormat("vector<int> aaaa = {\n"
7028 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7029 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7030 " aaaaaa.aaaaaaa,\n"
7031 " aaaaaa.aaaaaaa,\n"
7032 " aaaaaa.aaaaaaa,\n"
7033 " aaaaaa.aaaaaaa,\n"
7034 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007035
7036 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00007037 verifyFormat("someFunction(Param, {List1, List2,\n"
7038 " List3});",
7039 getLLVMStyleWithColumns(35));
7040 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007041 " {List1, List2,\n"
7042 " List3});",
7043 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00007044 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7045 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007046}
7047
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007048TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007049 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007050 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007051
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007052 verifyFormat("void f() { return 42; }");
7053 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007054 " return 42;\n"
7055 "}",
7056 DoNotMerge);
7057 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007058 " // Comment\n"
7059 "}");
7060 verifyFormat("{\n"
7061 "#error {\n"
7062 " int a;\n"
7063 "}");
7064 verifyFormat("{\n"
7065 " int a;\n"
7066 "#error {\n"
7067 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007068 verifyFormat("void f() {} // comment");
7069 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007070 verifyFormat("void f() {\n"
7071 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007072 DoNotMerge);
7073 verifyFormat("void f() {\n"
7074 " int a;\n"
7075 "} // comment",
7076 DoNotMerge);
7077 verifyFormat("void f() {\n"
7078 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007079 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007080
7081 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7082 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7083
7084 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7085 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007086 verifyFormat("class C {\n"
7087 " C()\n"
7088 " : iiiiiiii(nullptr),\n"
7089 " kkkkkkk(nullptr),\n"
7090 " mmmmmmm(nullptr),\n"
7091 " nnnnnnn(nullptr) {}\n"
7092 "};",
7093 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007094
7095 FormatStyle NoColumnLimit = getLLVMStyle();
7096 NoColumnLimit.ColumnLimit = 0;
7097 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7098 EXPECT_EQ("class C {\n"
7099 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007100 "};",
7101 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007102 EXPECT_EQ("A()\n"
7103 " : b(0) {\n"
7104 "}",
7105 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7106
7107 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007108 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7109 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007110 EXPECT_EQ("A()\n"
7111 " : b(0) {\n"
7112 "}",
7113 format("A():b(0){}", DoNotMergeNoColumnLimit));
7114 EXPECT_EQ("A()\n"
7115 " : b(0) {\n"
7116 "}",
7117 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007118
7119 verifyFormat("#define A \\\n"
7120 " void f() { \\\n"
7121 " int i; \\\n"
7122 " }",
7123 getLLVMStyleWithColumns(20));
7124 verifyFormat("#define A \\\n"
7125 " void f() { int i; }",
7126 getLLVMStyleWithColumns(21));
7127 verifyFormat("#define A \\\n"
7128 " void f() { \\\n"
7129 " int i; \\\n"
7130 " } \\\n"
7131 " int j;",
7132 getLLVMStyleWithColumns(22));
7133 verifyFormat("#define A \\\n"
7134 " void f() { int i; } \\\n"
7135 " int j;",
7136 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007137}
7138
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007139TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
7140 FormatStyle MergeEmptyOnly = getLLVMStyle();
7141 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7142 verifyFormat("class C {\n"
7143 " int f() {}\n"
7144 "};",
7145 MergeEmptyOnly);
7146 verifyFormat("class C {\n"
7147 " int f() {\n"
7148 " return 42;\n"
7149 " }\n"
7150 "};",
7151 MergeEmptyOnly);
7152 verifyFormat("int f() {}", MergeEmptyOnly);
7153 verifyFormat("int f() {\n"
7154 " return 42;\n"
7155 "}",
7156 MergeEmptyOnly);
7157
7158 // Also verify behavior when BraceWrapping.AfterFunction = true
7159 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7160 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
7161 verifyFormat("int f() {}", MergeEmptyOnly);
7162 verifyFormat("class C {\n"
7163 " int f() {}\n"
7164 "};",
7165 MergeEmptyOnly);
7166}
7167
Daniel Jasperd74cf402014-04-08 12:46:38 +00007168TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7169 FormatStyle MergeInlineOnly = getLLVMStyle();
7170 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7171 verifyFormat("class C {\n"
7172 " int f() { return 42; }\n"
7173 "};",
7174 MergeInlineOnly);
7175 verifyFormat("int f() {\n"
7176 " return 42;\n"
7177 "}",
7178 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007179
7180 // SFS_Inline implies SFS_Empty
7181 verifyFormat("class C {\n"
7182 " int f() {}\n"
7183 "};",
7184 MergeInlineOnly);
7185 verifyFormat("int f() {}", MergeInlineOnly);
7186
7187 // Also verify behavior when BraceWrapping.AfterFunction = true
7188 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7189 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7190 verifyFormat("class C {\n"
7191 " int f() { return 42; }\n"
7192 "};",
7193 MergeInlineOnly);
7194 verifyFormat("int f()\n"
7195 "{\n"
7196 " return 42;\n"
7197 "}",
7198 MergeInlineOnly);
7199
7200 // SFS_Inline implies SFS_Empty
7201 verifyFormat("int f() {}", MergeInlineOnly);
7202 verifyFormat("class C {\n"
7203 " int f() {}\n"
7204 "};",
7205 MergeInlineOnly);
7206}
7207
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00007208TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
7209 FormatStyle MergeInlineOnly = getLLVMStyle();
7210 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
7211 FormatStyle::SFS_InlineOnly;
7212 verifyFormat("class C {\n"
7213 " int f() { return 42; }\n"
7214 "};",
7215 MergeInlineOnly);
7216 verifyFormat("int f() {\n"
7217 " return 42;\n"
7218 "}",
7219 MergeInlineOnly);
7220
7221 // SFS_InlineOnly does not imply SFS_Empty
7222 verifyFormat("class C {\n"
7223 " int f() {}\n"
7224 "};",
7225 MergeInlineOnly);
7226 verifyFormat("int f() {\n"
7227 "}",
7228 MergeInlineOnly);
7229
7230 // Also verify behavior when BraceWrapping.AfterFunction = true
7231 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7232 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7233 verifyFormat("class C {\n"
7234 " int f() { return 42; }\n"
7235 "};",
7236 MergeInlineOnly);
7237 verifyFormat("int f()\n"
7238 "{\n"
7239 " return 42;\n"
7240 "}",
7241 MergeInlineOnly);
7242
7243 // SFS_InlineOnly does not imply SFS_Empty
7244 verifyFormat("int f()\n"
7245 "{\n"
7246 "}",
7247 MergeInlineOnly);
7248 verifyFormat("class C {\n"
7249 " int f() {}\n"
7250 "};",
7251 MergeInlineOnly);
7252}
7253
Francois Ferrandad722562017-06-30 20:25:55 +00007254TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007255 FormatStyle Style = getLLVMStyle();
7256 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7257 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7258 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00007259 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007260 Style.ColumnLimit = 40;
7261
7262 verifyFormat("int f()\n"
7263 "{}",
7264 Style);
7265 verifyFormat("int f()\n"
7266 "{\n"
7267 " return 42;\n"
7268 "}",
7269 Style);
7270 verifyFormat("int f()\n"
7271 "{\n"
7272 " // some comment\n"
7273 "}",
7274 Style);
7275
7276 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7277 verifyFormat("int f() {}", Style);
7278 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7279 "{}",
7280 Style);
7281 verifyFormat("int f()\n"
7282 "{\n"
7283 " return 0;\n"
7284 "}",
7285 Style);
7286
7287 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7288 verifyFormat("class Foo {\n"
7289 " int f() {}\n"
7290 "};\n",
7291 Style);
7292 verifyFormat("class Foo {\n"
7293 " int f() { return 0; }\n"
7294 "};\n",
7295 Style);
7296 verifyFormat("class Foo {\n"
7297 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7298 " {}\n"
7299 "};\n",
7300 Style);
7301 verifyFormat("class Foo {\n"
7302 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7303 " {\n"
7304 " return 0;\n"
7305 " }\n"
7306 "};\n",
7307 Style);
7308
7309 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7310 verifyFormat("int f() {}", Style);
7311 verifyFormat("int f() { return 0; }", Style);
7312 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7313 "{}",
7314 Style);
7315 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7316 "{\n"
7317 " return 0;\n"
7318 "}",
7319 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00007320}
Krasimir Georgiev6a1c9d52017-10-02 15:53:37 +00007321TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
7322 FormatStyle Style = getLLVMStyle();
7323 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7324 verifyFormat("#ifdef A\n"
7325 "int f() {}\n"
7326 "#else\n"
7327 "int g() {}\n"
7328 "#endif",
7329 Style);
7330}
Daniel Jasperd74cf402014-04-08 12:46:38 +00007331
Francois Ferrandad722562017-06-30 20:25:55 +00007332TEST_F(FormatTest, SplitEmptyClass) {
7333 FormatStyle Style = getLLVMStyle();
7334 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7335 Style.BraceWrapping.AfterClass = true;
7336 Style.BraceWrapping.SplitEmptyRecord = false;
7337
7338 verifyFormat("class Foo\n"
7339 "{};",
7340 Style);
7341 verifyFormat("/* something */ class Foo\n"
7342 "{};",
7343 Style);
7344 verifyFormat("template <typename X> class Foo\n"
7345 "{};",
7346 Style);
7347 verifyFormat("class Foo\n"
7348 "{\n"
7349 " Foo();\n"
7350 "};",
7351 Style);
7352 verifyFormat("typedef class Foo\n"
7353 "{\n"
7354 "} Foo_t;",
7355 Style);
7356}
7357
7358TEST_F(FormatTest, SplitEmptyStruct) {
7359 FormatStyle Style = getLLVMStyle();
7360 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7361 Style.BraceWrapping.AfterStruct = true;
7362 Style.BraceWrapping.SplitEmptyRecord = false;
7363
7364 verifyFormat("struct Foo\n"
7365 "{};",
7366 Style);
7367 verifyFormat("/* something */ struct Foo\n"
7368 "{};",
7369 Style);
7370 verifyFormat("template <typename X> struct Foo\n"
7371 "{};",
7372 Style);
7373 verifyFormat("struct Foo\n"
7374 "{\n"
7375 " Foo();\n"
7376 "};",
7377 Style);
7378 verifyFormat("typedef struct Foo\n"
7379 "{\n"
7380 "} Foo_t;",
7381 Style);
7382 //typedef struct Bar {} Bar_t;
7383}
7384
7385TEST_F(FormatTest, SplitEmptyUnion) {
7386 FormatStyle Style = getLLVMStyle();
7387 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7388 Style.BraceWrapping.AfterUnion = true;
7389 Style.BraceWrapping.SplitEmptyRecord = false;
7390
7391 verifyFormat("union Foo\n"
7392 "{};",
7393 Style);
7394 verifyFormat("/* something */ union Foo\n"
7395 "{};",
7396 Style);
7397 verifyFormat("union Foo\n"
7398 "{\n"
7399 " A,\n"
7400 "};",
7401 Style);
7402 verifyFormat("typedef union Foo\n"
7403 "{\n"
7404 "} Foo_t;",
7405 Style);
7406}
7407
7408TEST_F(FormatTest, SplitEmptyNamespace) {
7409 FormatStyle Style = getLLVMStyle();
7410 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7411 Style.BraceWrapping.AfterNamespace = true;
7412 Style.BraceWrapping.SplitEmptyNamespace = false;
7413
7414 verifyFormat("namespace Foo\n"
7415 "{};",
7416 Style);
7417 verifyFormat("/* something */ namespace Foo\n"
7418 "{};",
7419 Style);
7420 verifyFormat("inline namespace Foo\n"
7421 "{};",
7422 Style);
7423 verifyFormat("namespace Foo\n"
7424 "{\n"
7425 "void Bar();\n"
7426 "};",
7427 Style);
7428}
7429
7430TEST_F(FormatTest, NeverMergeShortRecords) {
7431 FormatStyle Style = getLLVMStyle();
7432
7433 verifyFormat("class Foo {\n"
7434 " Foo();\n"
7435 "};",
7436 Style);
7437 verifyFormat("typedef class Foo {\n"
7438 " Foo();\n"
7439 "} Foo_t;",
7440 Style);
7441 verifyFormat("struct Foo {\n"
7442 " Foo();\n"
7443 "};",
7444 Style);
7445 verifyFormat("typedef struct Foo {\n"
7446 " Foo();\n"
7447 "} Foo_t;",
7448 Style);
7449 verifyFormat("union Foo {\n"
7450 " A,\n"
7451 "};",
7452 Style);
7453 verifyFormat("typedef union Foo {\n"
7454 " A,\n"
7455 "} Foo_t;",
7456 Style);
7457 verifyFormat("namespace Foo {\n"
7458 "void Bar();\n"
7459 "};",
7460 Style);
7461
7462 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7463 Style.BraceWrapping.AfterClass = true;
7464 Style.BraceWrapping.AfterStruct = true;
7465 Style.BraceWrapping.AfterUnion = true;
7466 Style.BraceWrapping.AfterNamespace = true;
7467 verifyFormat("class Foo\n"
7468 "{\n"
7469 " Foo();\n"
7470 "};",
7471 Style);
7472 verifyFormat("typedef class Foo\n"
7473 "{\n"
7474 " Foo();\n"
7475 "} Foo_t;",
7476 Style);
7477 verifyFormat("struct Foo\n"
7478 "{\n"
7479 " Foo();\n"
7480 "};",
7481 Style);
7482 verifyFormat("typedef struct Foo\n"
7483 "{\n"
7484 " Foo();\n"
7485 "} Foo_t;",
7486 Style);
7487 verifyFormat("union Foo\n"
7488 "{\n"
7489 " A,\n"
7490 "};",
7491 Style);
7492 verifyFormat("typedef union Foo\n"
7493 "{\n"
7494 " A,\n"
7495 "} Foo_t;",
7496 Style);
7497 verifyFormat("namespace Foo\n"
7498 "{\n"
7499 "void Bar();\n"
7500 "};",
7501 Style);
7502}
7503
Manuel Klimeke01bab52013-01-15 13:38:33 +00007504TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7505 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007506 verifyFormat("struct foo a = {bar};\nint n;");
7507 verifyFormat("class foo a = {bar};\nint n;");
7508 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007509
7510 // Elaborate types inside function definitions.
7511 verifyFormat("struct foo f() {}\nint n;");
7512 verifyFormat("class foo f() {}\nint n;");
7513 verifyFormat("union foo f() {}\nint n;");
7514
7515 // Templates.
7516 verifyFormat("template <class X> void f() {}\nint n;");
7517 verifyFormat("template <struct X> void f() {}\nint n;");
7518 verifyFormat("template <union X> void f() {}\nint n;");
7519
7520 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007521 verifyFormat("struct {\n} n;");
7522 verifyFormat(
7523 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007524 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007525 verifyFormat("class MACRO Z {\n} n;");
7526 verifyFormat("class MACRO(X) Z {\n} n;");
7527 verifyFormat("class __attribute__(X) Z {\n} n;");
7528 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007529 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007530 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007531 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7532 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007533
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007534 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007535 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007536
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007537 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007538 verifyFormat(
7539 "template <typename F>\n"
7540 "Matcher(const Matcher<F> &Other,\n"
7541 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7542 " !is_same<F, T>::value>::type * = 0)\n"
7543 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7544
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007545 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007546 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007547 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007548
7549 // FIXME:
7550 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007551 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007552
Manuel Klimeke01bab52013-01-15 13:38:33 +00007553 // Elaborate types where incorrectly parsing the structural element would
7554 // break the indent.
7555 verifyFormat("if (true)\n"
7556 " class X x;\n"
7557 "else\n"
7558 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007559
7560 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007561 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007562}
7563
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007564TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007565 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7566 format("#error Leave all white!!!!! space* alone!\n"));
7567 EXPECT_EQ(
7568 "#warning Leave all white!!!!! space* alone!\n",
7569 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007570 EXPECT_EQ("#error 1", format(" # error 1"));
7571 EXPECT_EQ("#warning 1", format(" # warning 1"));
7572}
7573
Daniel Jasper4431aa92013-04-23 13:54:04 +00007574TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007575 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007576 verifyFormat("#if (AAAA && BBBB)");
7577 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007578 // FIXME: Come up with a better indentation for #elif.
7579 verifyFormat(
7580 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7581 " defined(BBBBBBBB)\n"
7582 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7583 " defined(BBBBBBBB)\n"
7584 "#endif",
7585 getLLVMStyleWithColumns(65));
7586}
7587
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007588TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7589 FormatStyle AllowsMergedIf = getGoogleStyle();
7590 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7591 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7592 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007593 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7594 EXPECT_EQ("if (true) return 42;",
7595 format("if (true)\nreturn 42;", AllowsMergedIf));
7596 FormatStyle ShortMergedIf = AllowsMergedIf;
7597 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007598 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007599 " if (true) return 42;",
7600 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007601 verifyFormat("#define A \\\n"
7602 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007603 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007604 "#define B",
7605 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007606 verifyFormat("#define A \\\n"
7607 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007608 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007609 "g();",
7610 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007611 verifyFormat("{\n"
7612 "#ifdef A\n"
7613 " // Comment\n"
7614 " if (true) continue;\n"
7615 "#endif\n"
7616 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007617 " if (true) continue;\n"
7618 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007619 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007620 ShortMergedIf.ColumnLimit = 33;
7621 verifyFormat("#define A \\\n"
7622 " if constexpr (true) return 42;",
7623 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007624 ShortMergedIf.ColumnLimit = 29;
7625 verifyFormat("#define A \\\n"
7626 " if (aaaaaaaaaa) return 1; \\\n"
7627 " return 2;",
7628 ShortMergedIf);
7629 ShortMergedIf.ColumnLimit = 28;
7630 verifyFormat("#define A \\\n"
7631 " if (aaaaaaaaaa) \\\n"
7632 " return 1; \\\n"
7633 " return 2;",
7634 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007635 verifyFormat("#define A \\\n"
7636 " if constexpr (aaaaaaa) \\\n"
7637 " return 1; \\\n"
7638 " return 2;",
7639 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007640}
7641
Manuel Klimekd33516e2013-01-23 10:09:28 +00007642TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007643 verifyFormat("void f(int *a);");
7644 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007645 verifyFormat("class A {\n void f(int *a);\n};");
7646 verifyFormat("class A {\n int *a;\n};");
7647 verifyFormat("namespace a {\n"
7648 "namespace b {\n"
7649 "class A {\n"
7650 " void f() {}\n"
7651 " int *a;\n"
7652 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00007653 "} // namespace b\n"
7654 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007655}
7656
Manuel Klimekd33516e2013-01-23 10:09:28 +00007657TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7658 verifyFormat("while");
7659 verifyFormat("operator");
7660}
7661
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007662TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7663 // This code would be painfully slow to format if we didn't skip it.
7664 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
7665 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7666 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7667 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7668 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7669 "A(1, 1)\n"
7670 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7671 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7672 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7673 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7674 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7675 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7676 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7677 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7678 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7679 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7680 // Deeply nested part is untouched, rest is formatted.
7681 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7682 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00007683 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007684}
7685
Nico Weber7e6a7a12013-01-08 17:56:31 +00007686//===----------------------------------------------------------------------===//
7687// Objective-C tests.
7688//===----------------------------------------------------------------------===//
7689
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007690TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7691 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7692 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7693 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007694 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007695 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7696 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7697 format("-(NSInteger)Method3:(id)anObject;"));
7698 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7699 format("-(NSInteger)Method4:(id)anObject;"));
7700 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7701 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7702 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7703 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007704 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7705 "forAllCells:(BOOL)flag;",
7706 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7707 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007708
7709 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007710 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7711 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007712 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7713 " inRange:(NSRange)range\n"
7714 " outRange:(NSRange)out_range\n"
7715 " outRange1:(NSRange)out_range1\n"
7716 " outRange2:(NSRange)out_range2\n"
7717 " outRange3:(NSRange)out_range3\n"
7718 " outRange4:(NSRange)out_range4\n"
7719 " outRange5:(NSRange)out_range5\n"
7720 " outRange6:(NSRange)out_range6\n"
7721 " outRange7:(NSRange)out_range7\n"
7722 " outRange8:(NSRange)out_range8\n"
7723 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007724
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007725 // When the function name has to be wrapped.
7726 FormatStyle Style = getLLVMStyle();
Ben Hamilton416348e2018-04-12 15:11:48 +00007727 // ObjC ignores IndentWrappedFunctionNames when wrapping methods
7728 // and always indents instead.
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007729 Style.IndentWrappedFunctionNames = false;
7730 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
Ben Hamilton416348e2018-04-12 15:11:48 +00007731 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7732 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007733 "}",
7734 Style);
7735 Style.IndentWrappedFunctionNames = true;
7736 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
Ben Hamilton416348e2018-04-12 15:11:48 +00007737 " veryLooooooooooongName:(NSString)cccccccccccccc\n"
7738 " anotherName:(NSString)dddddddddddddd {\n"
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007739 "}",
7740 Style);
7741
Nico Weberd6f962f2013-01-10 20:18:33 +00007742 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007743 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007744 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7745 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007746 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007747
Daniel Jasper37194282013-05-28 08:33:00 +00007748 verifyFormat("- (int (*)())foo:(int (*)())f;");
7749 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007750
7751 // If there's no return type (very rare in practice!), LLVM and Google style
7752 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007753 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007754 verifyFormat("- foo:(int)f;");
7755 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007756}
7757
Nico Weber0588b502013-02-07 00:19:29 +00007758
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007759TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007760 EXPECT_EQ("\"some text \"\n"
7761 "\"other\";",
7762 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007763 EXPECT_EQ("\"some text \"\n"
7764 "\"other\";",
7765 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007766 EXPECT_EQ(
7767 "#define A \\\n"
7768 " \"some \" \\\n"
7769 " \"text \" \\\n"
7770 " \"other\";",
7771 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7772 EXPECT_EQ(
7773 "#define A \\\n"
7774 " \"so \" \\\n"
7775 " \"text \" \\\n"
7776 " \"other\";",
7777 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7778
7779 EXPECT_EQ("\"some text\"",
7780 format("\"some text\"", getLLVMStyleWithColumns(1)));
7781 EXPECT_EQ("\"some text\"",
7782 format("\"some text\"", getLLVMStyleWithColumns(11)));
7783 EXPECT_EQ("\"some \"\n"
7784 "\"text\"",
7785 format("\"some text\"", getLLVMStyleWithColumns(10)));
7786 EXPECT_EQ("\"some \"\n"
7787 "\"text\"",
7788 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007789 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007790 "\" tex\"\n"
7791 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007792 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007793 EXPECT_EQ("\"some\"\n"
7794 "\" tex\"\n"
7795 "\" and\"",
7796 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7797 EXPECT_EQ("\"some\"\n"
7798 "\"/tex\"\n"
7799 "\"/and\"",
7800 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007801
7802 EXPECT_EQ("variable =\n"
7803 " \"long string \"\n"
7804 " \"literal\";",
7805 format("variable = \"long string literal\";",
7806 getLLVMStyleWithColumns(20)));
7807
7808 EXPECT_EQ("variable = f(\n"
7809 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007810 " \"literal\",\n"
7811 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007812 " loooooooooooooooooooong);",
7813 format("variable = f(\"long string literal\", short, "
7814 "loooooooooooooooooooong);",
7815 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007816
Daniel Jaspera44991332015-04-29 13:06:49 +00007817 EXPECT_EQ(
7818 "f(g(\"long string \"\n"
7819 " \"literal\"),\n"
7820 " b);",
7821 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007822 EXPECT_EQ("f(g(\"long string \"\n"
7823 " \"literal\",\n"
7824 " a),\n"
7825 " b);",
7826 format("f(g(\"long string literal\", a), b);",
7827 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007828 EXPECT_EQ(
7829 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007830 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007831 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7832 EXPECT_EQ("f(\"one two three four five six \"\n"
7833 " \"seven\".split(\n"
7834 " really_looooong_variable));",
7835 format("f(\"one two three four five six seven\"."
7836 "split(really_looooong_variable));",
7837 getLLVMStyleWithColumns(33)));
7838
7839 EXPECT_EQ("f(\"some \"\n"
7840 " \"text\",\n"
7841 " other);",
7842 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007843
7844 // Only break as a last resort.
7845 verifyFormat(
7846 "aaaaaaaaaaaaaaaaaaaa(\n"
7847 " aaaaaaaaaaaaaaaaaaaa,\n"
7848 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007849
Daniel Jaspera44991332015-04-29 13:06:49 +00007850 EXPECT_EQ("\"splitmea\"\n"
7851 "\"trandomp\"\n"
7852 "\"oint\"",
7853 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007854
Daniel Jaspera44991332015-04-29 13:06:49 +00007855 EXPECT_EQ("\"split/\"\n"
7856 "\"pathat/\"\n"
7857 "\"slashes\"",
7858 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007859
Daniel Jaspera44991332015-04-29 13:06:49 +00007860 EXPECT_EQ("\"split/\"\n"
7861 "\"pathat/\"\n"
7862 "\"slashes\"",
7863 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007864 EXPECT_EQ("\"split at \"\n"
7865 "\"spaces/at/\"\n"
7866 "\"slashes.at.any$\"\n"
7867 "\"non-alphanumeric%\"\n"
7868 "\"1111111111characte\"\n"
7869 "\"rs\"",
7870 format("\"split at "
7871 "spaces/at/"
7872 "slashes.at."
7873 "any$non-"
7874 "alphanumeric%"
7875 "1111111111characte"
7876 "rs\"",
7877 getLLVMStyleWithColumns(20)));
7878
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007879 // Verify that splitting the strings understands
7880 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007881 EXPECT_EQ(
7882 "aaaaaaaaaaaa(\n"
7883 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7884 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7885 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7886 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7887 "aaaaaaaaaaaaaaaaaaaaaa\");",
7888 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007889 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7890 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7891 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7892 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7893 "aaaaaaaaaaaaaaaaaaaaaa\";",
7894 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007895 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7896 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7897 format("llvm::outs() << "
7898 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7899 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007900 EXPECT_EQ("ffff(\n"
7901 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7902 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7903 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7904 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7905 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007906
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007907 FormatStyle Style = getLLVMStyleWithColumns(12);
7908 Style.BreakStringLiterals = false;
7909 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7910
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007911 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00007912 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00007913 EXPECT_EQ("#define A \\\n"
7914 " \"some \" \\\n"
7915 " \"text \" \\\n"
7916 " \"other\";",
7917 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007918}
7919
Manuel Klimek93699f42017-11-29 14:29:43 +00007920TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
7921 EXPECT_EQ("C a = \"some more \"\n"
7922 " \"text\";",
7923 format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
7924}
7925
Manuel Klimek9e321992015-07-28 15:50:24 +00007926TEST_F(FormatTest, FullyRemoveEmptyLines) {
7927 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7928 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7929 EXPECT_EQ("int i = a(b());",
7930 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7931}
7932
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007933TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7934 EXPECT_EQ(
7935 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7936 "(\n"
7937 " \"x\t\");",
7938 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7939 "aaaaaaa("
7940 "\"x\t\");"));
7941}
7942
Daniel Jasper174b0122014-01-09 14:18:12 +00007943TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007944 EXPECT_EQ(
7945 "u8\"utf8 string \"\n"
7946 "u8\"literal\";",
7947 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7948 EXPECT_EQ(
7949 "u\"utf16 string \"\n"
7950 "u\"literal\";",
7951 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7952 EXPECT_EQ(
7953 "U\"utf32 string \"\n"
7954 "U\"literal\";",
7955 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7956 EXPECT_EQ("L\"wide string \"\n"
7957 "L\"literal\";",
7958 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007959 EXPECT_EQ("@\"NSString \"\n"
7960 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007961 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00007962 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007963
7964 // This input makes clang-format try to split the incomplete unicode escape
7965 // sequence, which used to lead to a crasher.
7966 verifyNoCrash(
7967 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7968 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007969}
7970
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007971TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7972 FormatStyle Style = getGoogleStyleWithColumns(15);
7973 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7974 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7975 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7976 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7977 EXPECT_EQ("u8R\"x(raw literal)x\";",
7978 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007979}
7980
7981TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7982 FormatStyle Style = getLLVMStyleWithColumns(20);
7983 EXPECT_EQ(
7984 "_T(\"aaaaaaaaaaaaaa\")\n"
7985 "_T(\"aaaaaaaaaaaaaa\")\n"
7986 "_T(\"aaaaaaaaaaaa\")",
7987 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00007988 EXPECT_EQ("f(x,\n"
7989 " _T(\"aaaaaaaaaaaa\")\n"
7990 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00007991 " z);",
7992 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7993
7994 // FIXME: Handle embedded spaces in one iteration.
7995 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7996 // "_T(\"aaaaaaaaaaaaa\")\n"
7997 // "_T(\"aaaaaaaaaaaaa\")\n"
7998 // "_T(\"a\")",
7999 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8000 // getLLVMStyleWithColumns(20)));
8001 EXPECT_EQ(
8002 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8003 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008004 EXPECT_EQ("f(\n"
8005 "#if !TEST\n"
8006 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8007 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00008008 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008009 format("f(\n"
8010 "#if !TEST\n"
8011 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8012 "#endif\n"
8013 ");"));
8014 EXPECT_EQ("f(\n"
8015 "\n"
8016 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8017 format("f(\n"
8018 "\n"
8019 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008020}
8021
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00008022TEST_F(FormatTest, BreaksStringLiteralOperands) {
8023 // In a function call with two operands, the second can be broken with no line
8024 // break before it.
8025 EXPECT_EQ("func(a, \"long long \"\n"
8026 " \"long long\");",
8027 format("func(a, \"long long long long\");",
8028 getLLVMStyleWithColumns(24)));
8029 // In a function call with three operands, the second must be broken with a
8030 // line break before it.
8031 EXPECT_EQ("func(a,\n"
8032 " \"long long long \"\n"
8033 " \"long\",\n"
8034 " c);",
8035 format("func(a, \"long long long long\", c);",
8036 getLLVMStyleWithColumns(24)));
8037 // In a function call with three operands, the third must be broken with a
8038 // line break before it.
8039 EXPECT_EQ("func(a, b,\n"
8040 " \"long long long \"\n"
8041 " \"long\");",
8042 format("func(a, b, \"long long long long\");",
8043 getLLVMStyleWithColumns(24)));
8044 // In a function call with three operands, both the second and the third must
8045 // be broken with a line break before them.
8046 EXPECT_EQ("func(a,\n"
8047 " \"long long long \"\n"
8048 " \"long\",\n"
8049 " \"long long long \"\n"
8050 " \"long\");",
8051 format("func(a, \"long long long long\", \"long long long long\");",
8052 getLLVMStyleWithColumns(24)));
8053 // In a chain of << with two operands, the second can be broken with no line
8054 // break before it.
8055 EXPECT_EQ("a << \"line line \"\n"
8056 " \"line\";",
8057 format("a << \"line line line\";",
8058 getLLVMStyleWithColumns(20)));
8059 // In a chain of << with three operands, the second can be broken with no line
8060 // break before it.
8061 EXPECT_EQ("abcde << \"line \"\n"
8062 " \"line line\"\n"
8063 " << c;",
8064 format("abcde << \"line line line\" << c;",
8065 getLLVMStyleWithColumns(20)));
8066 // In a chain of << with three operands, the third must be broken with a line
8067 // break before it.
8068 EXPECT_EQ("a << b\n"
8069 " << \"line line \"\n"
8070 " \"line\";",
8071 format("a << b << \"line line line\";",
8072 getLLVMStyleWithColumns(20)));
8073 // In a chain of << with three operands, the second can be broken with no line
8074 // break before it and the third must be broken with a line break before it.
8075 EXPECT_EQ("abcd << \"line line \"\n"
8076 " \"line\"\n"
8077 " << \"line line \"\n"
8078 " \"line\";",
8079 format("abcd << \"line line line\" << \"line line line\";",
8080 getLLVMStyleWithColumns(20)));
8081 // In a chain of binary operators with two operands, the second can be broken
8082 // with no line break before it.
8083 EXPECT_EQ("abcd + \"line line \"\n"
8084 " \"line line\";",
8085 format("abcd + \"line line line line\";",
8086 getLLVMStyleWithColumns(20)));
8087 // In a chain of binary operators with three operands, the second must be
8088 // broken with a line break before it.
8089 EXPECT_EQ("abcd +\n"
8090 " \"line line \"\n"
8091 " \"line line\" +\n"
8092 " e;",
8093 format("abcd + \"line line line line\" + e;",
8094 getLLVMStyleWithColumns(20)));
8095 // In a function call with two operands, with AlignAfterOpenBracket enabled,
8096 // the first must be broken with a line break before it.
8097 FormatStyle Style = getLLVMStyleWithColumns(25);
8098 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8099 EXPECT_EQ("someFunction(\n"
8100 " \"long long long \"\n"
8101 " \"long\",\n"
8102 " a);",
8103 format("someFunction(\"long long long long\", a);", Style));
8104}
8105
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008106TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008107 EXPECT_EQ(
8108 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8109 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8110 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8111 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8112 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8113 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8114}
8115
8116TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8117 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008118 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008119 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8120 "multiline raw string literal xxxxxxxxxxxxxx\n"
8121 ")x\",\n"
8122 " a),\n"
8123 " b);",
8124 format("fffffffffff(g(R\"x(\n"
8125 "multiline raw string literal xxxxxxxxxxxxxx\n"
8126 ")x\", a), b);",
8127 getGoogleStyleWithColumns(20)));
8128 EXPECT_EQ("fffffffffff(\n"
8129 " g(R\"x(qqq\n"
8130 "multiline raw string literal xxxxxxxxxxxxxx\n"
8131 ")x\",\n"
8132 " a),\n"
8133 " b);",
8134 format("fffffffffff(g(R\"x(qqq\n"
8135 "multiline raw string literal xxxxxxxxxxxxxx\n"
8136 ")x\", a), b);",
8137 getGoogleStyleWithColumns(20)));
8138
8139 EXPECT_EQ("fffffffffff(R\"x(\n"
8140 "multiline raw string literal xxxxxxxxxxxxxx\n"
8141 ")x\");",
8142 format("fffffffffff(R\"x(\n"
8143 "multiline raw string literal xxxxxxxxxxxxxx\n"
8144 ")x\");",
8145 getGoogleStyleWithColumns(20)));
8146 EXPECT_EQ("fffffffffff(R\"x(\n"
8147 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008148 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008149 format("fffffffffff(R\"x(\n"
8150 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008151 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008152 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008153 EXPECT_EQ("fffffffffff(\n"
8154 " R\"x(\n"
8155 "multiline raw string literal xxxxxxxxxxxxxx\n"
8156 ")x\" +\n"
8157 " bbbbbb);",
8158 format("fffffffffff(\n"
8159 " R\"x(\n"
8160 "multiline raw string literal xxxxxxxxxxxxxx\n"
8161 ")x\" + bbbbbb);",
8162 getGoogleStyleWithColumns(20)));
Daniel Jasperfd327672018-03-22 14:43:54 +00008163 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
8164 format("fffffffffff(\n"
8165 " R\"(single line raw string)\" + bbbbbb);"));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008166}
8167
Alexander Kornienkobe633902013-06-14 11:46:10 +00008168TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008169 verifyFormat("string a = \"unterminated;");
8170 EXPECT_EQ("function(\"unterminated,\n"
8171 " OtherParameter);",
8172 format("function( \"unterminated,\n"
8173 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008174}
8175
8176TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008177 FormatStyle Style = getLLVMStyle();
8178 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008179 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008180 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008181}
8182
Daniel Jaspera44991332015-04-29 13:06:49 +00008183TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008184
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008185TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8186 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8187 " \"ddeeefff\");",
8188 format("someFunction(\"aaabbbcccdddeeefff\");",
8189 getLLVMStyleWithColumns(25)));
8190 EXPECT_EQ("someFunction1234567890(\n"
8191 " \"aaabbbcccdddeeefff\");",
8192 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8193 getLLVMStyleWithColumns(26)));
8194 EXPECT_EQ("someFunction1234567890(\n"
8195 " \"aaabbbcccdddeeeff\"\n"
8196 " \"f\");",
8197 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8198 getLLVMStyleWithColumns(25)));
8199 EXPECT_EQ("someFunction1234567890(\n"
8200 " \"aaabbbcccdddeeeff\"\n"
8201 " \"f\");",
8202 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8203 getLLVMStyleWithColumns(24)));
Manuel Klimek77866142017-11-17 11:17:15 +00008204 EXPECT_EQ("someFunction(\n"
8205 " \"aaabbbcc ddde \"\n"
8206 " \"efff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008207 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008208 getLLVMStyleWithColumns(25)));
8209 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8210 " \"ddeeefff\");",
8211 format("someFunction(\"aaabbbccc ddeeefff\");",
8212 getLLVMStyleWithColumns(25)));
8213 EXPECT_EQ("someFunction1234567890(\n"
8214 " \"aaabb \"\n"
8215 " \"cccdddeeefff\");",
8216 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8217 getLLVMStyleWithColumns(25)));
8218 EXPECT_EQ("#define A \\\n"
8219 " string s = \\\n"
8220 " \"123456789\" \\\n"
8221 " \"0\"; \\\n"
8222 " int i;",
8223 format("#define A string s = \"1234567890\"; int i;",
8224 getLLVMStyleWithColumns(20)));
Manuel Klimek77866142017-11-17 11:17:15 +00008225 EXPECT_EQ("someFunction(\n"
8226 " \"aaabbbcc \"\n"
8227 " \"dddeeefff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008228 format("someFunction(\"aaabbbcc dddeeefff\");",
8229 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008230}
8231
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008232TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008233 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8234 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008235 EXPECT_EQ("\"test\"\n"
8236 "\"\\n\"",
8237 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8238 EXPECT_EQ("\"tes\\\\\"\n"
8239 "\"n\"",
8240 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8241 EXPECT_EQ("\"\\\\\\\\\"\n"
8242 "\"\\n\"",
8243 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008244 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008245 EXPECT_EQ("\"\\uff01\"\n"
8246 "\"test\"",
8247 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8248 EXPECT_EQ("\"\\Uff01ff02\"",
8249 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8250 EXPECT_EQ("\"\\x000000000001\"\n"
8251 "\"next\"",
8252 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8253 EXPECT_EQ("\"\\x000000000001next\"",
8254 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8255 EXPECT_EQ("\"\\x000000000001\"",
8256 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8257 EXPECT_EQ("\"test\"\n"
8258 "\"\\000000\"\n"
8259 "\"000001\"",
8260 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8261 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008262 "\"00000000\"\n"
8263 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008264 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008265}
8266
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008267TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8268 verifyFormat("void f() {\n"
8269 " return g() {}\n"
8270 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008271 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008272 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008273 "}");
8274}
8275
Manuel Klimek421147e2014-01-24 09:25:23 +00008276TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8277 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008278 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008279}
8280
Manuel Klimek13b97d82013-05-13 08:42:42 +00008281TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8282 verifyFormat("class X {\n"
8283 " void f() {\n"
8284 " }\n"
8285 "};",
8286 getLLVMStyleWithColumns(12));
8287}
8288
8289TEST_F(FormatTest, ConfigurableIndentWidth) {
8290 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8291 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008292 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008293 verifyFormat("void f() {\n"
8294 " someFunction();\n"
8295 " if (true) {\n"
8296 " f();\n"
8297 " }\n"
8298 "}",
8299 EightIndent);
8300 verifyFormat("class X {\n"
8301 " void f() {\n"
8302 " }\n"
8303 "};",
8304 EightIndent);
8305 verifyFormat("int x[] = {\n"
8306 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008307 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008308 EightIndent);
8309}
8310
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008311TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008312 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008313 "f();",
8314 getLLVMStyleWithColumns(8));
8315}
8316
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008317TEST_F(FormatTest, ConfigurableUseOfTab) {
8318 FormatStyle Tab = getLLVMStyleWithColumns(42);
8319 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008320 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008321 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008322
8323 EXPECT_EQ("if (aaaaaaaa && // q\n"
8324 " bb)\t\t// w\n"
8325 "\t;",
8326 format("if (aaaaaaaa &&// q\n"
8327 "bb)// w\n"
8328 ";",
8329 Tab));
8330 EXPECT_EQ("if (aaa && bbb) // w\n"
8331 "\t;",
8332 format("if(aaa&&bbb)// w\n"
8333 ";",
8334 Tab));
8335
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008336 verifyFormat("class X {\n"
8337 "\tvoid f() {\n"
8338 "\t\tsomeFunction(parameter1,\n"
8339 "\t\t\t parameter2);\n"
8340 "\t}\n"
8341 "};",
8342 Tab);
8343 verifyFormat("#define A \\\n"
8344 "\tvoid f() { \\\n"
8345 "\t\tsomeFunction( \\\n"
8346 "\t\t parameter1, \\\n"
8347 "\t\t parameter2); \\\n"
8348 "\t}",
8349 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008350
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008351 Tab.TabWidth = 4;
8352 Tab.IndentWidth = 8;
8353 verifyFormat("class TabWidth4Indent8 {\n"
8354 "\t\tvoid f() {\n"
8355 "\t\t\t\tsomeFunction(parameter1,\n"
8356 "\t\t\t\t\t\t\t parameter2);\n"
8357 "\t\t}\n"
8358 "};",
8359 Tab);
8360
8361 Tab.TabWidth = 4;
8362 Tab.IndentWidth = 4;
8363 verifyFormat("class TabWidth4Indent4 {\n"
8364 "\tvoid f() {\n"
8365 "\t\tsomeFunction(parameter1,\n"
8366 "\t\t\t\t\t parameter2);\n"
8367 "\t}\n"
8368 "};",
8369 Tab);
8370
8371 Tab.TabWidth = 8;
8372 Tab.IndentWidth = 4;
8373 verifyFormat("class TabWidth8Indent4 {\n"
8374 " void f() {\n"
8375 "\tsomeFunction(parameter1,\n"
8376 "\t\t parameter2);\n"
8377 " }\n"
8378 "};",
8379 Tab);
8380
Alexander Kornienko39856b72013-09-10 09:38:25 +00008381 Tab.TabWidth = 8;
8382 Tab.IndentWidth = 8;
8383 EXPECT_EQ("/*\n"
8384 "\t a\t\tcomment\n"
8385 "\t in multiple lines\n"
8386 " */",
8387 format(" /*\t \t \n"
8388 " \t \t a\t\tcomment\t \t\n"
8389 " \t \t in multiple lines\t\n"
8390 " \t */",
8391 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008392
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008393 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008394 verifyFormat("{\n"
8395 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8396 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8397 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8398 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8399 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8400 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008401 "};",
8402 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008403 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008404 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008405 "\ta2,\n"
8406 "\ta3\n"
8407 "};",
8408 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008409 EXPECT_EQ("if (aaaaaaaa && // q\n"
8410 " bb) // w\n"
8411 "\t;",
8412 format("if (aaaaaaaa &&// q\n"
8413 "bb)// w\n"
8414 ";",
8415 Tab));
8416 verifyFormat("class X {\n"
8417 "\tvoid f() {\n"
8418 "\t\tsomeFunction(parameter1,\n"
8419 "\t\t parameter2);\n"
8420 "\t}\n"
8421 "};",
8422 Tab);
8423 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008424 "\tQ(\n"
8425 "\t {\n"
8426 "\t\t int a;\n"
8427 "\t\t someFunction(aaaaaaaa,\n"
8428 "\t\t bbbbbbb);\n"
8429 "\t },\n"
8430 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008431 "}",
8432 Tab);
8433 EXPECT_EQ("{\n"
8434 "\t/* aaaa\n"
8435 "\t bbbb */\n"
8436 "}",
8437 format("{\n"
8438 "/* aaaa\n"
8439 " bbbb */\n"
8440 "}",
8441 Tab));
8442 EXPECT_EQ("{\n"
8443 "\t/*\n"
8444 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8445 "\t bbbbbbbbbbbbb\n"
8446 "\t*/\n"
8447 "}",
8448 format("{\n"
8449 "/*\n"
8450 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8451 "*/\n"
8452 "}",
8453 Tab));
8454 EXPECT_EQ("{\n"
8455 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8456 "\t// bbbbbbbbbbbbb\n"
8457 "}",
8458 format("{\n"
8459 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8460 "}",
8461 Tab));
8462 EXPECT_EQ("{\n"
8463 "\t/*\n"
8464 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8465 "\t bbbbbbbbbbbbb\n"
8466 "\t*/\n"
8467 "}",
8468 format("{\n"
8469 "\t/*\n"
8470 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8471 "\t*/\n"
8472 "}",
8473 Tab));
8474 EXPECT_EQ("{\n"
8475 "\t/*\n"
8476 "\n"
8477 "\t*/\n"
8478 "}",
8479 format("{\n"
8480 "\t/*\n"
8481 "\n"
8482 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008483 "}",
8484 Tab));
8485 EXPECT_EQ("{\n"
8486 "\t/*\n"
8487 " asdf\n"
8488 "\t*/\n"
8489 "}",
8490 format("{\n"
8491 "\t/*\n"
8492 " asdf\n"
8493 "\t*/\n"
8494 "}",
8495 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008496
8497 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008498 EXPECT_EQ("/*\n"
8499 " a\t\tcomment\n"
8500 " in multiple lines\n"
8501 " */",
8502 format(" /*\t \t \n"
8503 " \t \t a\t\tcomment\t \t\n"
8504 " \t \t in multiple lines\t\n"
8505 " \t */",
8506 Tab));
8507 EXPECT_EQ("/* some\n"
8508 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008509 format(" \t \t /* some\n"
8510 " \t \t comment */",
8511 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008512 EXPECT_EQ("int a; /* some\n"
8513 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008514 format(" \t \t int a; /* some\n"
8515 " \t \t comment */",
8516 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008517
Alexander Kornienko39856b72013-09-10 09:38:25 +00008518 EXPECT_EQ("int a; /* some\n"
8519 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008520 format(" \t \t int\ta; /* some\n"
8521 " \t \t comment */",
8522 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008523 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8524 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008525 format(" \t \t f(\"\t\t\"); /* some\n"
8526 " \t \t comment */",
8527 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008528 EXPECT_EQ("{\n"
8529 " /*\n"
8530 " * Comment\n"
8531 " */\n"
8532 " int i;\n"
8533 "}",
8534 format("{\n"
8535 "\t/*\n"
8536 "\t * Comment\n"
8537 "\t */\n"
8538 "\t int i;\n"
8539 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008540
8541 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8542 Tab.TabWidth = 8;
8543 Tab.IndentWidth = 8;
8544 EXPECT_EQ("if (aaaaaaaa && // q\n"
8545 " bb) // w\n"
8546 "\t;",
8547 format("if (aaaaaaaa &&// q\n"
8548 "bb)// w\n"
8549 ";",
8550 Tab));
8551 EXPECT_EQ("if (aaa && bbb) // w\n"
8552 "\t;",
8553 format("if(aaa&&bbb)// w\n"
8554 ";",
8555 Tab));
8556 verifyFormat("class X {\n"
8557 "\tvoid f() {\n"
8558 "\t\tsomeFunction(parameter1,\n"
8559 "\t\t\t parameter2);\n"
8560 "\t}\n"
8561 "};",
8562 Tab);
8563 verifyFormat("#define A \\\n"
8564 "\tvoid f() { \\\n"
8565 "\t\tsomeFunction( \\\n"
8566 "\t\t parameter1, \\\n"
8567 "\t\t parameter2); \\\n"
8568 "\t}",
8569 Tab);
8570 Tab.TabWidth = 4;
8571 Tab.IndentWidth = 8;
8572 verifyFormat("class TabWidth4Indent8 {\n"
8573 "\t\tvoid f() {\n"
8574 "\t\t\t\tsomeFunction(parameter1,\n"
8575 "\t\t\t\t\t\t\t parameter2);\n"
8576 "\t\t}\n"
8577 "};",
8578 Tab);
8579 Tab.TabWidth = 4;
8580 Tab.IndentWidth = 4;
8581 verifyFormat("class TabWidth4Indent4 {\n"
8582 "\tvoid f() {\n"
8583 "\t\tsomeFunction(parameter1,\n"
8584 "\t\t\t\t\t parameter2);\n"
8585 "\t}\n"
8586 "};",
8587 Tab);
8588 Tab.TabWidth = 8;
8589 Tab.IndentWidth = 4;
8590 verifyFormat("class TabWidth8Indent4 {\n"
8591 " void f() {\n"
8592 "\tsomeFunction(parameter1,\n"
8593 "\t\t parameter2);\n"
8594 " }\n"
8595 "};",
8596 Tab);
8597 Tab.TabWidth = 8;
8598 Tab.IndentWidth = 8;
8599 EXPECT_EQ("/*\n"
8600 "\t a\t\tcomment\n"
8601 "\t in multiple lines\n"
8602 " */",
8603 format(" /*\t \t \n"
8604 " \t \t a\t\tcomment\t \t\n"
8605 " \t \t in multiple lines\t\n"
8606 " \t */",
8607 Tab));
8608 verifyFormat("{\n"
8609 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8610 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8611 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8612 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8613 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8614 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8615 "};",
8616 Tab);
8617 verifyFormat("enum AA {\n"
8618 "\ta1, // Force multiple lines\n"
8619 "\ta2,\n"
8620 "\ta3\n"
8621 "};",
8622 Tab);
8623 EXPECT_EQ("if (aaaaaaaa && // q\n"
8624 " bb) // w\n"
8625 "\t;",
8626 format("if (aaaaaaaa &&// q\n"
8627 "bb)// w\n"
8628 ";",
8629 Tab));
8630 verifyFormat("class X {\n"
8631 "\tvoid f() {\n"
8632 "\t\tsomeFunction(parameter1,\n"
8633 "\t\t\t parameter2);\n"
8634 "\t}\n"
8635 "};",
8636 Tab);
8637 verifyFormat("{\n"
8638 "\tQ(\n"
8639 "\t {\n"
8640 "\t\t int a;\n"
8641 "\t\t someFunction(aaaaaaaa,\n"
8642 "\t\t\t\t bbbbbbb);\n"
8643 "\t },\n"
8644 "\t p);\n"
8645 "}",
8646 Tab);
8647 EXPECT_EQ("{\n"
8648 "\t/* aaaa\n"
8649 "\t bbbb */\n"
8650 "}",
8651 format("{\n"
8652 "/* aaaa\n"
8653 " bbbb */\n"
8654 "}",
8655 Tab));
8656 EXPECT_EQ("{\n"
8657 "\t/*\n"
8658 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8659 "\t bbbbbbbbbbbbb\n"
8660 "\t*/\n"
8661 "}",
8662 format("{\n"
8663 "/*\n"
8664 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8665 "*/\n"
8666 "}",
8667 Tab));
8668 EXPECT_EQ("{\n"
8669 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8670 "\t// bbbbbbbbbbbbb\n"
8671 "}",
8672 format("{\n"
8673 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8674 "}",
8675 Tab));
8676 EXPECT_EQ("{\n"
8677 "\t/*\n"
8678 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8679 "\t bbbbbbbbbbbbb\n"
8680 "\t*/\n"
8681 "}",
8682 format("{\n"
8683 "\t/*\n"
8684 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8685 "\t*/\n"
8686 "}",
8687 Tab));
8688 EXPECT_EQ("{\n"
8689 "\t/*\n"
8690 "\n"
8691 "\t*/\n"
8692 "}",
8693 format("{\n"
8694 "\t/*\n"
8695 "\n"
8696 "\t*/\n"
8697 "}",
8698 Tab));
8699 EXPECT_EQ("{\n"
8700 "\t/*\n"
8701 " asdf\n"
8702 "\t*/\n"
8703 "}",
8704 format("{\n"
8705 "\t/*\n"
8706 " asdf\n"
8707 "\t*/\n"
8708 "}",
8709 Tab));
8710 EXPECT_EQ("/*\n"
8711 "\t a\t\tcomment\n"
8712 "\t in multiple lines\n"
8713 " */",
8714 format(" /*\t \t \n"
8715 " \t \t a\t\tcomment\t \t\n"
8716 " \t \t in multiple lines\t\n"
8717 " \t */",
8718 Tab));
8719 EXPECT_EQ("/* some\n"
8720 " comment */",
8721 format(" \t \t /* some\n"
8722 " \t \t comment */",
8723 Tab));
8724 EXPECT_EQ("int a; /* some\n"
8725 " comment */",
8726 format(" \t \t int a; /* some\n"
8727 " \t \t comment */",
8728 Tab));
8729 EXPECT_EQ("int a; /* some\n"
8730 "comment */",
8731 format(" \t \t int\ta; /* some\n"
8732 " \t \t comment */",
8733 Tab));
8734 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8735 " comment */",
8736 format(" \t \t f(\"\t\t\"); /* some\n"
8737 " \t \t comment */",
8738 Tab));
8739 EXPECT_EQ("{\n"
8740 " /*\n"
8741 " * Comment\n"
8742 " */\n"
8743 " int i;\n"
8744 "}",
8745 format("{\n"
8746 "\t/*\n"
8747 "\t * Comment\n"
8748 "\t */\n"
8749 "\t int i;\n"
8750 "}"));
8751 Tab.AlignConsecutiveAssignments = true;
8752 Tab.AlignConsecutiveDeclarations = true;
8753 Tab.TabWidth = 4;
8754 Tab.IndentWidth = 4;
8755 verifyFormat("class Assign {\n"
8756 "\tvoid f() {\n"
8757 "\t\tint x = 123;\n"
8758 "\t\tint random = 4;\n"
8759 "\t\tstd::string alphabet =\n"
8760 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8761 "\t}\n"
8762 "};",
8763 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008764}
8765
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008766TEST_F(FormatTest, CalculatesOriginalColumn) {
8767 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8768 "q\"; /* some\n"
8769 " comment */",
8770 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8771 "q\"; /* some\n"
8772 " comment */",
8773 getLLVMStyle()));
8774 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8775 "/* some\n"
8776 " comment */",
8777 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8778 " /* some\n"
8779 " comment */",
8780 getLLVMStyle()));
8781 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8782 "qqq\n"
8783 "/* some\n"
8784 " comment */",
8785 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8786 "qqq\n"
8787 " /* some\n"
8788 " comment */",
8789 getLLVMStyle()));
8790 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8791 "wwww; /* some\n"
8792 " comment */",
8793 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8794 "wwww; /* some\n"
8795 " comment */",
8796 getLLVMStyle()));
8797}
8798
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008799TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008800 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008801 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008802
8803 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008804 " continue;",
8805 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008806 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008807 " continue;",
8808 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008809 verifyFormat("if(true)\n"
8810 " f();\n"
8811 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008812 " f();",
8813 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008814 verifyFormat("do {\n"
8815 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008816 "} while(something());",
8817 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008818 verifyFormat("switch(x) {\n"
8819 "default:\n"
8820 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008821 "}",
8822 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008823 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008824 verifyFormat("size_t x = sizeof(x);", NoSpace);
8825 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8826 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8827 verifyFormat("alignas(128) char a[128];", NoSpace);
8828 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8829 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8830 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008831 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008832 verifyFormat("T A::operator()();", NoSpace);
8833 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008834
8835 FormatStyle Space = getLLVMStyle();
8836 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8837
8838 verifyFormat("int f ();", Space);
8839 verifyFormat("void f (int a, T b) {\n"
8840 " while (true)\n"
8841 " continue;\n"
8842 "}",
8843 Space);
8844 verifyFormat("if (true)\n"
8845 " f ();\n"
8846 "else if (true)\n"
8847 " f ();",
8848 Space);
8849 verifyFormat("do {\n"
8850 " do_something ();\n"
8851 "} while (something ());",
8852 Space);
8853 verifyFormat("switch (x) {\n"
8854 "default:\n"
8855 " break;\n"
8856 "}",
8857 Space);
8858 verifyFormat("A::A () : a (1) {}", Space);
8859 verifyFormat("void f () __attribute__ ((asdf));", Space);
8860 verifyFormat("*(&a + 1);\n"
8861 "&((&a)[1]);\n"
8862 "a[(b + c) * d];\n"
8863 "(((a + 1) * 2) + 3) * 4;",
8864 Space);
8865 verifyFormat("#define A(x) x", Space);
8866 verifyFormat("#define A (x) x", Space);
8867 verifyFormat("#if defined(x)\n"
8868 "#endif",
8869 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008870 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008871 verifyFormat("size_t x = sizeof (x);", Space);
8872 verifyFormat("auto f (int x) -> decltype (x);", Space);
8873 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8874 verifyFormat("alignas (128) char a[128];", Space);
8875 verifyFormat("size_t x = alignof (MyType);", Space);
8876 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8877 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008878 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008879 verifyFormat("T A::operator() ();", Space);
8880 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008881}
8882
8883TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8884 FormatStyle Spaces = getLLVMStyle();
8885
8886 Spaces.SpacesInParentheses = true;
Daniel Jasperd5e9ff42018-03-22 14:30:28 +00008887 verifyFormat("do_something( ::globalVar );", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008888 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008889 verifyFormat("call();", Spaces);
8890 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008891 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8892 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008893 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008894 " continue;",
8895 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008896 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008897 " continue;",
8898 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008899 verifyFormat("if ( true )\n"
8900 " f();\n"
8901 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008902 " f();",
8903 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008904 verifyFormat("do {\n"
8905 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008906 "} while ( something() );",
8907 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008908 verifyFormat("switch ( x ) {\n"
8909 "default:\n"
8910 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008911 "}",
8912 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008913
8914 Spaces.SpacesInParentheses = false;
8915 Spaces.SpacesInCStyleCastParentheses = true;
8916 verifyFormat("Type *A = ( Type * )P;", Spaces);
8917 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8918 verifyFormat("x = ( int32 )y;", Spaces);
8919 verifyFormat("int a = ( int )(2.0f);", Spaces);
8920 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8921 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8922 verifyFormat("#define x (( int )-1)", Spaces);
8923
Daniel Jasper92e09822015-03-18 12:59:19 +00008924 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008925 Spaces.SpacesInParentheses = false;
8926 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008927 Spaces.SpacesInCStyleCastParentheses = true;
8928 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008929 verifyFormat("call( );", Spaces);
8930 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008931 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008932 " continue;",
8933 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008934 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008935 " continue;",
8936 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008937 verifyFormat("if (true)\n"
8938 " f( );\n"
8939 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008940 " f( );",
8941 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008942 verifyFormat("do {\n"
8943 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008944 "} while (something( ));",
8945 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008946 verifyFormat("switch (x) {\n"
8947 "default:\n"
8948 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008949 "}",
8950 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008951
Daniel Jasper92e09822015-03-18 12:59:19 +00008952 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008953 Spaces.SpaceAfterCStyleCast = true;
8954 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008955 verifyFormat("call( );", Spaces);
8956 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008957 verifyFormat("while (( bool ) 1)\n"
8958 " continue;",
8959 Spaces);
8960 verifyFormat("for (;;)\n"
8961 " continue;",
8962 Spaces);
8963 verifyFormat("if (true)\n"
8964 " f( );\n"
8965 "else if (true)\n"
8966 " f( );",
8967 Spaces);
8968 verifyFormat("do {\n"
8969 " do_something(( int ) i);\n"
8970 "} while (something( ));",
8971 Spaces);
8972 verifyFormat("switch (x) {\n"
8973 "default:\n"
8974 " break;\n"
8975 "}",
8976 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008977
8978 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008979 Spaces.SpacesInCStyleCastParentheses = false;
8980 Spaces.SpaceAfterCStyleCast = true;
8981 verifyFormat("while ((bool) 1)\n"
8982 " continue;",
8983 Spaces);
8984 verifyFormat("do {\n"
8985 " do_something((int) i);\n"
8986 "} while (something( ));",
8987 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008988}
8989
Daniel Jasperad981f82014-08-26 11:41:14 +00008990TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8991 verifyFormat("int a[5];");
8992 verifyFormat("a[3] += 42;");
8993
8994 FormatStyle Spaces = getLLVMStyle();
8995 Spaces.SpacesInSquareBrackets = true;
8996 // Lambdas unchanged.
8997 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8998 verifyFormat("return [i, args...] {};", Spaces);
8999
9000 // Not lambdas.
9001 verifyFormat("int a[ 5 ];", Spaces);
9002 verifyFormat("a[ 3 ] += 42;", Spaces);
9003 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9004 verifyFormat("double &operator[](int i) { return 0; }\n"
9005 "int i;",
9006 Spaces);
9007 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9008 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9009 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9010}
9011
Daniel Jasperd94bff32013-09-25 15:15:02 +00009012TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9013 verifyFormat("int a = 5;");
9014 verifyFormat("a += 42;");
9015 verifyFormat("a or_eq 8;");
9016
9017 FormatStyle Spaces = getLLVMStyle();
9018 Spaces.SpaceBeforeAssignmentOperators = false;
9019 verifyFormat("int a= 5;", Spaces);
9020 verifyFormat("a+= 42;", Spaces);
9021 verifyFormat("a or_eq 8;", Spaces);
9022}
9023
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009024TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
9025 verifyFormat("class Foo : public Bar {};");
9026 verifyFormat("Foo::Foo() : foo(1) {}");
9027 verifyFormat("for (auto a : b) {\n}");
9028 verifyFormat("int x = a ? b : c;");
9029 verifyFormat("{\n"
9030 "label0:\n"
9031 " int x = 0;\n"
9032 "}");
9033 verifyFormat("switch (x) {\n"
9034 "case 1:\n"
9035 "default:\n"
9036 "}");
9037
9038 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
9039 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
9040 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
9041 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
9042 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
9043 verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
9044 verifyFormat("{\n"
9045 "label1:\n"
9046 " int x = 0;\n"
9047 "}",
9048 CtorInitializerStyle);
9049 verifyFormat("switch (x) {\n"
9050 "case 1:\n"
9051 "default:\n"
9052 "}",
9053 CtorInitializerStyle);
9054 CtorInitializerStyle.BreakConstructorInitializers =
9055 FormatStyle::BCIS_AfterColon;
9056 verifyFormat("Fooooooooooo::Fooooooooooo():\n"
9057 " aaaaaaaaaaaaaaaa(1),\n"
9058 " bbbbbbbbbbbbbbbb(2) {}",
9059 CtorInitializerStyle);
9060 CtorInitializerStyle.BreakConstructorInitializers =
9061 FormatStyle::BCIS_BeforeComma;
9062 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9063 " : aaaaaaaaaaaaaaaa(1)\n"
9064 " , bbbbbbbbbbbbbbbb(2) {}",
9065 CtorInitializerStyle);
9066 CtorInitializerStyle.BreakConstructorInitializers =
9067 FormatStyle::BCIS_BeforeColon;
9068 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9069 " : aaaaaaaaaaaaaaaa(1),\n"
9070 " bbbbbbbbbbbbbbbb(2) {}",
9071 CtorInitializerStyle);
9072 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
9073 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9074 ": aaaaaaaaaaaaaaaa(1),\n"
9075 " bbbbbbbbbbbbbbbb(2) {}",
9076 CtorInitializerStyle);
9077
9078 FormatStyle InheritanceStyle = getLLVMStyle();
9079 InheritanceStyle.SpaceBeforeInheritanceColon = false;
9080 verifyFormat("class Foo: public Bar {};", InheritanceStyle);
9081 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
9082 verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
9083 verifyFormat("int x = a ? b : c;", InheritanceStyle);
9084 verifyFormat("{\n"
9085 "label2:\n"
9086 " int x = 0;\n"
9087 "}",
9088 InheritanceStyle);
9089 verifyFormat("switch (x) {\n"
9090 "case 1:\n"
9091 "default:\n"
9092 "}",
9093 InheritanceStyle);
9094
9095 FormatStyle ForLoopStyle = getLLVMStyle();
9096 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
9097 verifyFormat("class Foo : public Bar {};", ForLoopStyle);
9098 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
9099 verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
9100 verifyFormat("int x = a ? b : c;", ForLoopStyle);
9101 verifyFormat("{\n"
9102 "label2:\n"
9103 " int x = 0;\n"
9104 "}",
9105 ForLoopStyle);
9106 verifyFormat("switch (x) {\n"
9107 "case 1:\n"
9108 "default:\n"
9109 "}",
9110 ForLoopStyle);
9111
9112 FormatStyle NoSpaceStyle = getLLVMStyle();
9113 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
9114 NoSpaceStyle.SpaceBeforeInheritanceColon = false;
9115 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
9116 verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
9117 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
9118 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
9119 verifyFormat("int x = a ? b : c;", NoSpaceStyle);
9120 verifyFormat("{\n"
9121 "label3:\n"
9122 " int x = 0;\n"
9123 "}",
9124 NoSpaceStyle);
9125 verifyFormat("switch (x) {\n"
9126 "case 1:\n"
9127 "default:\n"
9128 "}",
9129 NoSpaceStyle);
9130}
9131
Daniel Jaspera44991332015-04-29 13:06:49 +00009132TEST_F(FormatTest, AlignConsecutiveAssignments) {
9133 FormatStyle Alignment = getLLVMStyle();
9134 Alignment.AlignConsecutiveAssignments = false;
9135 verifyFormat("int a = 5;\n"
9136 "int oneTwoThree = 123;",
9137 Alignment);
9138 verifyFormat("int a = 5;\n"
9139 "int oneTwoThree = 123;",
9140 Alignment);
9141
9142 Alignment.AlignConsecutiveAssignments = true;
9143 verifyFormat("int a = 5;\n"
9144 "int oneTwoThree = 123;",
9145 Alignment);
9146 verifyFormat("int a = method();\n"
9147 "int oneTwoThree = 133;",
9148 Alignment);
9149 verifyFormat("a &= 5;\n"
9150 "bcd *= 5;\n"
9151 "ghtyf += 5;\n"
9152 "dvfvdb -= 5;\n"
9153 "a /= 5;\n"
9154 "vdsvsv %= 5;\n"
9155 "sfdbddfbdfbb ^= 5;\n"
9156 "dvsdsv |= 5;\n"
9157 "int dsvvdvsdvvv = 123;",
9158 Alignment);
9159 verifyFormat("int i = 1, j = 10;\n"
9160 "something = 2000;",
9161 Alignment);
9162 verifyFormat("something = 2000;\n"
9163 "int i = 1, j = 10;\n",
9164 Alignment);
9165 verifyFormat("something = 2000;\n"
9166 "another = 911;\n"
9167 "int i = 1, j = 10;\n"
9168 "oneMore = 1;\n"
9169 "i = 2;",
9170 Alignment);
9171 verifyFormat("int a = 5;\n"
9172 "int one = 1;\n"
9173 "method();\n"
9174 "int oneTwoThree = 123;\n"
9175 "int oneTwo = 12;",
9176 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009177 verifyFormat("int oneTwoThree = 123;\n"
9178 "int oneTwo = 12;\n"
9179 "method();\n",
9180 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009181 verifyFormat("int oneTwoThree = 123; // comment\n"
9182 "int oneTwo = 12; // comment",
9183 Alignment);
9184 EXPECT_EQ("int a = 5;\n"
9185 "\n"
9186 "int oneTwoThree = 123;",
9187 format("int a = 5;\n"
9188 "\n"
9189 "int oneTwoThree= 123;",
9190 Alignment));
9191 EXPECT_EQ("int a = 5;\n"
9192 "int one = 1;\n"
9193 "\n"
9194 "int oneTwoThree = 123;",
9195 format("int a = 5;\n"
9196 "int one = 1;\n"
9197 "\n"
9198 "int oneTwoThree = 123;",
9199 Alignment));
9200 EXPECT_EQ("int a = 5;\n"
9201 "int one = 1;\n"
9202 "\n"
9203 "int oneTwoThree = 123;\n"
9204 "int oneTwo = 12;",
9205 format("int a = 5;\n"
9206 "int one = 1;\n"
9207 "\n"
9208 "int oneTwoThree = 123;\n"
9209 "int oneTwo = 12;",
9210 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009211 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9212 verifyFormat("#define A \\\n"
9213 " int aaaa = 12; \\\n"
9214 " int b = 23; \\\n"
9215 " int ccc = 234; \\\n"
9216 " int dddddddddd = 2345;",
9217 Alignment);
9218 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00009219 verifyFormat("#define A \\\n"
9220 " int aaaa = 12; \\\n"
9221 " int b = 23; \\\n"
9222 " int ccc = 234; \\\n"
9223 " int dddddddddd = 2345;",
9224 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009225 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00009226 verifyFormat("#define A "
9227 " \\\n"
9228 " int aaaa = 12; "
9229 " \\\n"
9230 " int b = 23; "
9231 " \\\n"
9232 " int ccc = 234; "
9233 " \\\n"
9234 " int dddddddddd = 2345;",
9235 Alignment);
9236 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9237 "k = 4, int l = 5,\n"
9238 " int m = 6) {\n"
9239 " int j = 10;\n"
9240 " otherThing = 1;\n"
9241 "}",
9242 Alignment);
9243 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9244 " int i = 1;\n"
9245 " int j = 2;\n"
9246 " int big = 10000;\n"
9247 "}",
9248 Alignment);
9249 verifyFormat("class C {\n"
9250 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009251 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009252 " virtual void f() = 0;\n"
9253 "};",
9254 Alignment);
9255 verifyFormat("int i = 1;\n"
9256 "if (SomeType t = getSomething()) {\n"
9257 "}\n"
9258 "int j = 2;\n"
9259 "int big = 10000;",
9260 Alignment);
9261 verifyFormat("int j = 7;\n"
9262 "for (int k = 0; k < N; ++k) {\n"
9263 "}\n"
9264 "int j = 2;\n"
9265 "int big = 10000;\n"
9266 "}",
9267 Alignment);
9268 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9269 verifyFormat("int i = 1;\n"
9270 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9271 " = someLooooooooooooooooongFunction();\n"
9272 "int j = 2;",
9273 Alignment);
9274 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9275 verifyFormat("int i = 1;\n"
9276 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9277 " someLooooooooooooooooongFunction();\n"
9278 "int j = 2;",
9279 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009280
9281 verifyFormat("auto lambda = []() {\n"
9282 " auto i = 0;\n"
9283 " return 0;\n"
9284 "};\n"
9285 "int i = 0;\n"
9286 "auto v = type{\n"
9287 " i = 1, //\n"
9288 " (i = 2), //\n"
9289 " i = 3 //\n"
9290 "};",
9291 Alignment);
9292
Daniel Jaspera44991332015-04-29 13:06:49 +00009293 verifyFormat(
9294 "int i = 1;\n"
9295 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9296 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009297 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00009298 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009299
9300 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9301 " typename B = very_long_type_name_1,\n"
9302 " typename T_2 = very_long_type_name_2>\n"
9303 "auto foo() {}\n",
9304 Alignment);
9305 verifyFormat("int a, b = 1;\n"
9306 "int c = 2;\n"
9307 "int dd = 3;\n",
9308 Alignment);
9309 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9310 "float b[1][] = {{3.f}};\n",
9311 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009312 verifyFormat("for (int i = 0; i < 1; i++)\n"
9313 " int x = 1;\n",
9314 Alignment);
9315 verifyFormat("for (i = 0; i < 1; i++)\n"
9316 " x = 1;\n"
9317 "y = 1;\n",
9318 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009319}
9320
Daniel Jaspere12597c2015-10-01 10:06:54 +00009321TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9322 FormatStyle Alignment = getLLVMStyle();
9323 Alignment.AlignConsecutiveDeclarations = false;
9324 verifyFormat("float const a = 5;\n"
9325 "int oneTwoThree = 123;",
9326 Alignment);
9327 verifyFormat("int a = 5;\n"
9328 "float const oneTwoThree = 123;",
9329 Alignment);
9330
9331 Alignment.AlignConsecutiveDeclarations = true;
9332 verifyFormat("float const a = 5;\n"
9333 "int oneTwoThree = 123;",
9334 Alignment);
9335 verifyFormat("int a = method();\n"
9336 "float const oneTwoThree = 133;",
9337 Alignment);
9338 verifyFormat("int i = 1, j = 10;\n"
9339 "something = 2000;",
9340 Alignment);
9341 verifyFormat("something = 2000;\n"
9342 "int i = 1, j = 10;\n",
9343 Alignment);
9344 verifyFormat("float something = 2000;\n"
9345 "double another = 911;\n"
9346 "int i = 1, j = 10;\n"
9347 "const int *oneMore = 1;\n"
9348 "unsigned i = 2;",
9349 Alignment);
9350 verifyFormat("float a = 5;\n"
9351 "int one = 1;\n"
9352 "method();\n"
9353 "const double oneTwoThree = 123;\n"
9354 "const unsigned int oneTwo = 12;",
9355 Alignment);
9356 verifyFormat("int oneTwoThree{0}; // comment\n"
9357 "unsigned oneTwo; // comment",
9358 Alignment);
9359 EXPECT_EQ("float const a = 5;\n"
9360 "\n"
9361 "int oneTwoThree = 123;",
9362 format("float const a = 5;\n"
9363 "\n"
9364 "int oneTwoThree= 123;",
9365 Alignment));
9366 EXPECT_EQ("float a = 5;\n"
9367 "int one = 1;\n"
9368 "\n"
9369 "unsigned oneTwoThree = 123;",
9370 format("float a = 5;\n"
9371 "int one = 1;\n"
9372 "\n"
9373 "unsigned oneTwoThree = 123;",
9374 Alignment));
9375 EXPECT_EQ("float a = 5;\n"
9376 "int one = 1;\n"
9377 "\n"
9378 "unsigned oneTwoThree = 123;\n"
9379 "int oneTwo = 12;",
9380 format("float a = 5;\n"
9381 "int one = 1;\n"
9382 "\n"
9383 "unsigned oneTwoThree = 123;\n"
9384 "int oneTwo = 12;",
9385 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009386 // Function prototype alignment
9387 verifyFormat("int a();\n"
9388 "double b();",
9389 Alignment);
9390 verifyFormat("int a(int x);\n"
9391 "double b();",
9392 Alignment);
9393 unsigned OldColumnLimit = Alignment.ColumnLimit;
9394 // We need to set ColumnLimit to zero, in order to stress nested alignments,
9395 // otherwise the function parameters will be re-flowed onto a single line.
9396 Alignment.ColumnLimit = 0;
9397 EXPECT_EQ("int a(int x,\n"
9398 " float y);\n"
9399 "double b(int x,\n"
9400 " double y);",
9401 format("int a(int x,\n"
9402 " float y);\n"
9403 "double b(int x,\n"
9404 " double y);",
9405 Alignment));
9406 // This ensures that function parameters of function declarations are
9407 // correctly indented when their owning functions are indented.
9408 // The failure case here is for 'double y' to not be indented enough.
9409 EXPECT_EQ("double a(int x);\n"
9410 "int b(int y,\n"
9411 " double z);",
9412 format("double a(int x);\n"
9413 "int b(int y,\n"
9414 " double z);",
9415 Alignment));
9416 // Set ColumnLimit low so that we induce wrapping immediately after
9417 // the function name and opening paren.
9418 Alignment.ColumnLimit = 13;
9419 verifyFormat("int function(\n"
9420 " int x,\n"
9421 " bool y);",
9422 Alignment);
9423 Alignment.ColumnLimit = OldColumnLimit;
9424 // Ensure function pointers don't screw up recursive alignment
9425 verifyFormat("int a(int x, void (*fp)(int y));\n"
9426 "double b();",
9427 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009428 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009429 // Ensure recursive alignment is broken by function braces, so that the
9430 // "a = 1" does not align with subsequent assignments inside the function
9431 // body.
9432 verifyFormat("int func(int a = 1) {\n"
9433 " int b = 2;\n"
9434 " int cc = 3;\n"
9435 "}",
9436 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009437 verifyFormat("float something = 2000;\n"
9438 "double another = 911;\n"
9439 "int i = 1, j = 10;\n"
9440 "const int *oneMore = 1;\n"
9441 "unsigned i = 2;",
9442 Alignment);
9443 verifyFormat("int oneTwoThree = {0}; // comment\n"
9444 "unsigned oneTwo = 0; // comment",
9445 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009446 // Make sure that scope is correctly tracked, in the absence of braces
9447 verifyFormat("for (int i = 0; i < n; i++)\n"
9448 " j = i;\n"
9449 "double x = 1;\n",
9450 Alignment);
9451 verifyFormat("if (int i = 0)\n"
9452 " j = i;\n"
9453 "double x = 1;\n",
9454 Alignment);
9455 // Ensure operator[] and operator() are comprehended
9456 verifyFormat("struct test {\n"
9457 " long long int foo();\n"
9458 " int operator[](int a);\n"
9459 " double bar();\n"
9460 "};\n",
9461 Alignment);
9462 verifyFormat("struct test {\n"
9463 " long long int foo();\n"
9464 " int operator()(int a);\n"
9465 " double bar();\n"
9466 "};\n",
9467 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009468 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9469 " int const i = 1;\n"
9470 " int * j = 2;\n"
9471 " int big = 10000;\n"
9472 "\n"
9473 " unsigned oneTwoThree = 123;\n"
9474 " int oneTwo = 12;\n"
9475 " method();\n"
9476 " float k = 2;\n"
9477 " int ll = 10000;\n"
9478 "}",
9479 format("void SomeFunction(int parameter= 0) {\n"
9480 " int const i= 1;\n"
9481 " int *j=2;\n"
9482 " int big = 10000;\n"
9483 "\n"
9484 "unsigned oneTwoThree =123;\n"
9485 "int oneTwo = 12;\n"
9486 " method();\n"
9487 "float k= 2;\n"
9488 "int ll=10000;\n"
9489 "}",
9490 Alignment));
9491 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009492 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9493 verifyFormat("#define A \\\n"
9494 " int aaaa = 12; \\\n"
9495 " float b = 23; \\\n"
9496 " const int ccc = 234; \\\n"
9497 " unsigned dddddddddd = 2345;",
9498 Alignment);
9499 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009500 verifyFormat("#define A \\\n"
9501 " int aaaa = 12; \\\n"
9502 " float b = 23; \\\n"
9503 " const int ccc = 234; \\\n"
9504 " unsigned dddddddddd = 2345;",
9505 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009506 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009507 Alignment.ColumnLimit = 30;
9508 verifyFormat("#define A \\\n"
9509 " int aaaa = 12; \\\n"
9510 " float b = 23; \\\n"
9511 " const int ccc = 234; \\\n"
9512 " int dddddddddd = 2345;",
9513 Alignment);
9514 Alignment.ColumnLimit = 80;
9515 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9516 "k = 4, int l = 5,\n"
9517 " int m = 6) {\n"
9518 " const int j = 10;\n"
9519 " otherThing = 1;\n"
9520 "}",
9521 Alignment);
9522 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9523 " int const i = 1;\n"
9524 " int * j = 2;\n"
9525 " int big = 10000;\n"
9526 "}",
9527 Alignment);
9528 verifyFormat("class C {\n"
9529 "public:\n"
9530 " int i = 1;\n"
9531 " virtual void f() = 0;\n"
9532 "};",
9533 Alignment);
9534 verifyFormat("float i = 1;\n"
9535 "if (SomeType t = getSomething()) {\n"
9536 "}\n"
9537 "const unsigned j = 2;\n"
9538 "int big = 10000;",
9539 Alignment);
9540 verifyFormat("float j = 7;\n"
9541 "for (int k = 0; k < N; ++k) {\n"
9542 "}\n"
9543 "unsigned j = 2;\n"
9544 "int big = 10000;\n"
9545 "}",
9546 Alignment);
9547 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9548 verifyFormat("float i = 1;\n"
9549 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9550 " = someLooooooooooooooooongFunction();\n"
9551 "int j = 2;",
9552 Alignment);
9553 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9554 verifyFormat("int i = 1;\n"
9555 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9556 " someLooooooooooooooooongFunction();\n"
9557 "int j = 2;",
9558 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009559
9560 Alignment.AlignConsecutiveAssignments = true;
9561 verifyFormat("auto lambda = []() {\n"
9562 " auto ii = 0;\n"
9563 " float j = 0;\n"
9564 " return 0;\n"
9565 "};\n"
9566 "int i = 0;\n"
9567 "float i2 = 0;\n"
9568 "auto v = type{\n"
9569 " i = 1, //\n"
9570 " (i = 2), //\n"
9571 " i = 3 //\n"
9572 "};",
9573 Alignment);
9574 Alignment.AlignConsecutiveAssignments = false;
9575
Daniel Jaspere12597c2015-10-01 10:06:54 +00009576 verifyFormat(
9577 "int i = 1;\n"
9578 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9579 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009580 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009581 Alignment);
9582
9583 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9584 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009585 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00009586 // happens.
9587 Alignment.AlignConsecutiveAssignments = true;
9588 Alignment.ColumnLimit = 30;
9589 verifyFormat("float ii = 1;\n"
9590 "unsigned j = 2;\n"
9591 "int someVerylongVariable = 1;\n"
9592 "AnotherLongType ll = 123456;\n"
9593 "VeryVeryLongType k = 2;\n"
9594 "int myvar = 1;",
9595 Alignment);
9596 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009597 Alignment.AlignConsecutiveAssignments = false;
9598
9599 verifyFormat(
9600 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9601 " typename LongType, typename B>\n"
9602 "auto foo() {}\n",
9603 Alignment);
9604 verifyFormat("float a, b = 1;\n"
9605 "int c = 2;\n"
9606 "int dd = 3;\n",
9607 Alignment);
9608 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9609 "float b[1][] = {{3.f}};\n",
9610 Alignment);
9611 Alignment.AlignConsecutiveAssignments = true;
9612 verifyFormat("float a, b = 1;\n"
9613 "int c = 2;\n"
9614 "int dd = 3;\n",
9615 Alignment);
9616 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9617 "float b[1][] = {{3.f}};\n",
9618 Alignment);
9619 Alignment.AlignConsecutiveAssignments = false;
9620
9621 Alignment.ColumnLimit = 30;
9622 Alignment.BinPackParameters = false;
9623 verifyFormat("void foo(float a,\n"
9624 " float b,\n"
9625 " int c,\n"
9626 " uint32_t *d) {\n"
9627 " int * e = 0;\n"
9628 " float f = 0;\n"
9629 " double g = 0;\n"
9630 "}\n"
9631 "void bar(ino_t a,\n"
9632 " int b,\n"
9633 " uint32_t *c,\n"
9634 " bool d) {}\n",
9635 Alignment);
9636 Alignment.BinPackParameters = true;
9637 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +00009638
9639 // Bug 33507
9640 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
9641 verifyFormat(
9642 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
9643 " static const Version verVs2017;\n"
9644 " return true;\n"
9645 "});\n",
9646 Alignment);
9647 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009648}
9649
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009650TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009651 FormatStyle LinuxBraceStyle = getLLVMStyle();
9652 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009653 verifyFormat("namespace a\n"
9654 "{\n"
9655 "class A\n"
9656 "{\n"
9657 " void f()\n"
9658 " {\n"
9659 " if (true) {\n"
9660 " a();\n"
9661 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009662 " } else {\n"
9663 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009664 " }\n"
9665 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009666 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009667 "};\n"
9668 "struct B {\n"
9669 " int x;\n"
9670 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009671 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009672 LinuxBraceStyle);
9673 verifyFormat("enum X {\n"
9674 " Y = 0,\n"
9675 "}\n",
9676 LinuxBraceStyle);
9677 verifyFormat("struct S {\n"
9678 " int Type;\n"
9679 " union {\n"
9680 " int x;\n"
9681 " double y;\n"
9682 " } Value;\n"
9683 " class C\n"
9684 " {\n"
9685 " MyFavoriteType Value;\n"
9686 " } Class;\n"
9687 "}\n",
9688 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009689}
9690
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009691TEST_F(FormatTest, MozillaBraceBreaking) {
9692 FormatStyle MozillaBraceStyle = getLLVMStyle();
9693 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00009694 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009695 verifyFormat("namespace a {\n"
9696 "class A\n"
9697 "{\n"
9698 " void f()\n"
9699 " {\n"
9700 " if (true) {\n"
9701 " a();\n"
9702 " b();\n"
9703 " }\n"
9704 " }\n"
9705 " void g() { return; }\n"
9706 "};\n"
9707 "enum E\n"
9708 "{\n"
9709 " A,\n"
9710 " // foo\n"
9711 " B,\n"
9712 " C\n"
9713 "};\n"
9714 "struct B\n"
9715 "{\n"
9716 " int x;\n"
9717 "};\n"
9718 "}\n",
9719 MozillaBraceStyle);
9720 verifyFormat("struct S\n"
9721 "{\n"
9722 " int Type;\n"
9723 " union\n"
9724 " {\n"
9725 " int x;\n"
9726 " double y;\n"
9727 " } Value;\n"
9728 " class C\n"
9729 " {\n"
9730 " MyFavoriteType Value;\n"
9731 " } Class;\n"
9732 "}\n",
9733 MozillaBraceStyle);
9734}
9735
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009736TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009737 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9738 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009739 verifyFormat("namespace a {\n"
9740 "class A {\n"
9741 " void f()\n"
9742 " {\n"
9743 " if (true) {\n"
9744 " a();\n"
9745 " b();\n"
9746 " }\n"
9747 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009748 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009749 "};\n"
9750 "struct B {\n"
9751 " int x;\n"
9752 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00009753 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009754 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009755
Daniel Jasperd9670872014-08-05 12:06:20 +00009756 verifyFormat("void foo()\n"
9757 "{\n"
9758 " if (a) {\n"
9759 " a();\n"
9760 " }\n"
9761 " else {\n"
9762 " b();\n"
9763 " }\n"
9764 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009765 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009766
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009767 verifyFormat("#ifdef _DEBUG\n"
9768 "int foo(int i = 0)\n"
9769 "#else\n"
9770 "int foo(int i = 5)\n"
9771 "#endif\n"
9772 "{\n"
9773 " return i;\n"
9774 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009775 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009776
9777 verifyFormat("void foo() {}\n"
9778 "void bar()\n"
9779 "#ifdef _DEBUG\n"
9780 "{\n"
9781 " foo();\n"
9782 "}\n"
9783 "#else\n"
9784 "{\n"
9785 "}\n"
9786 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009787 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009788
9789 verifyFormat("void foobar() { int i = 5; }\n"
9790 "#ifdef _DEBUG\n"
9791 "void bar() {}\n"
9792 "#else\n"
9793 "void bar() { foobar(); }\n"
9794 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009795 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009796}
9797
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009798TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009799 FormatStyle AllmanBraceStyle = getLLVMStyle();
9800 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009801
9802 EXPECT_EQ("namespace a\n"
9803 "{\n"
9804 "void f();\n"
9805 "void g();\n"
9806 "} // namespace a\n",
9807 format("namespace a\n"
9808 "{\n"
9809 "void f();\n"
9810 "void g();\n"
9811 "}\n",
9812 AllmanBraceStyle));
9813
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009814 verifyFormat("namespace a\n"
9815 "{\n"
9816 "class A\n"
9817 "{\n"
9818 " void f()\n"
9819 " {\n"
9820 " if (true)\n"
9821 " {\n"
9822 " a();\n"
9823 " b();\n"
9824 " }\n"
9825 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009826 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009827 "};\n"
9828 "struct B\n"
9829 "{\n"
9830 " int x;\n"
9831 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00009832 "} // namespace a",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009833 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009834
9835 verifyFormat("void f()\n"
9836 "{\n"
9837 " if (true)\n"
9838 " {\n"
9839 " a();\n"
9840 " }\n"
9841 " else if (false)\n"
9842 " {\n"
9843 " b();\n"
9844 " }\n"
9845 " else\n"
9846 " {\n"
9847 " c();\n"
9848 " }\n"
9849 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009850 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009851
9852 verifyFormat("void f()\n"
9853 "{\n"
9854 " for (int i = 0; i < 10; ++i)\n"
9855 " {\n"
9856 " a();\n"
9857 " }\n"
9858 " while (false)\n"
9859 " {\n"
9860 " b();\n"
9861 " }\n"
9862 " do\n"
9863 " {\n"
9864 " c();\n"
9865 " } while (false)\n"
9866 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009867 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009868
9869 verifyFormat("void f(int a)\n"
9870 "{\n"
9871 " switch (a)\n"
9872 " {\n"
9873 " case 0:\n"
9874 " break;\n"
9875 " case 1:\n"
9876 " {\n"
9877 " break;\n"
9878 " }\n"
9879 " case 2:\n"
9880 " {\n"
9881 " }\n"
9882 " break;\n"
9883 " default:\n"
9884 " break;\n"
9885 " }\n"
9886 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009887 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009888
9889 verifyFormat("enum X\n"
9890 "{\n"
9891 " Y = 0,\n"
9892 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009893 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009894 verifyFormat("enum X\n"
9895 "{\n"
9896 " Y = 0\n"
9897 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009898 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009899
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009900 verifyFormat("@interface BSApplicationController ()\n"
9901 "{\n"
9902 "@private\n"
9903 " id _extraIvar;\n"
9904 "}\n"
9905 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009906 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009907
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009908 verifyFormat("#ifdef _DEBUG\n"
9909 "int foo(int i = 0)\n"
9910 "#else\n"
9911 "int foo(int i = 5)\n"
9912 "#endif\n"
9913 "{\n"
9914 " return i;\n"
9915 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009916 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009917
9918 verifyFormat("void foo() {}\n"
9919 "void bar()\n"
9920 "#ifdef _DEBUG\n"
9921 "{\n"
9922 " foo();\n"
9923 "}\n"
9924 "#else\n"
9925 "{\n"
9926 "}\n"
9927 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009928 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009929
9930 verifyFormat("void foobar() { int i = 5; }\n"
9931 "#ifdef _DEBUG\n"
9932 "void bar() {}\n"
9933 "#else\n"
9934 "void bar() { foobar(); }\n"
9935 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009936 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009937
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009938 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009939 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009940 " // ...\n"
9941 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009942 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009943 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009944 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009945 " // ...\n"
9946 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009947 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009948 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009949 // .. or dict literals.
9950 verifyFormat("void f()\n"
9951 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00009952 " // ...\n"
9953 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
9954 "}",
9955 AllmanBraceStyle);
9956 verifyFormat("void f()\n"
9957 "{\n"
9958 " // ...\n"
9959 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009960 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009961 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009962 verifyFormat("int f()\n"
9963 "{ // comment\n"
9964 " return 42;\n"
9965 "}",
9966 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009967
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009968 AllmanBraceStyle.ColumnLimit = 19;
9969 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9970 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009971 verifyFormat("void f()\n"
9972 "{\n"
9973 " int i;\n"
9974 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009975 AllmanBraceStyle);
9976 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009977
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009978 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009979 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9980 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9981 verifyFormat("void f(bool b)\n"
9982 "{\n"
9983 " if (b)\n"
9984 " {\n"
9985 " return;\n"
9986 " }\n"
9987 "}\n",
9988 BreakBeforeBraceShortIfs);
9989 verifyFormat("void f(bool b)\n"
9990 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00009991 " if constexpr (b)\n"
9992 " {\n"
9993 " return;\n"
9994 " }\n"
9995 "}\n",
9996 BreakBeforeBraceShortIfs);
9997 verifyFormat("void f(bool b)\n"
9998 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +00009999 " if (b) return;\n"
10000 "}\n",
10001 BreakBeforeBraceShortIfs);
10002 verifyFormat("void f(bool b)\n"
10003 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010004 " if constexpr (b) return;\n"
10005 "}\n",
10006 BreakBeforeBraceShortIfs);
10007 verifyFormat("void f(bool b)\n"
10008 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +000010009 " while (b)\n"
10010 " {\n"
10011 " return;\n"
10012 " }\n"
10013 "}\n",
10014 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010015}
10016
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010017TEST_F(FormatTest, GNUBraceBreaking) {
10018 FormatStyle GNUBraceStyle = getLLVMStyle();
10019 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
10020 verifyFormat("namespace a\n"
10021 "{\n"
10022 "class A\n"
10023 "{\n"
10024 " void f()\n"
10025 " {\n"
10026 " int a;\n"
10027 " {\n"
10028 " int b;\n"
10029 " }\n"
10030 " if (true)\n"
10031 " {\n"
10032 " a();\n"
10033 " b();\n"
10034 " }\n"
10035 " }\n"
10036 " void g() { return; }\n"
10037 "}\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010038 "} // namespace a",
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010039 GNUBraceStyle);
10040
10041 verifyFormat("void f()\n"
10042 "{\n"
10043 " if (true)\n"
10044 " {\n"
10045 " a();\n"
10046 " }\n"
10047 " else if (false)\n"
10048 " {\n"
10049 " b();\n"
10050 " }\n"
10051 " else\n"
10052 " {\n"
10053 " c();\n"
10054 " }\n"
10055 "}\n",
10056 GNUBraceStyle);
10057
10058 verifyFormat("void f()\n"
10059 "{\n"
10060 " for (int i = 0; i < 10; ++i)\n"
10061 " {\n"
10062 " a();\n"
10063 " }\n"
10064 " while (false)\n"
10065 " {\n"
10066 " b();\n"
10067 " }\n"
10068 " do\n"
10069 " {\n"
10070 " c();\n"
10071 " }\n"
10072 " while (false);\n"
10073 "}\n",
10074 GNUBraceStyle);
10075
10076 verifyFormat("void f(int a)\n"
10077 "{\n"
10078 " switch (a)\n"
10079 " {\n"
10080 " case 0:\n"
10081 " break;\n"
10082 " case 1:\n"
10083 " {\n"
10084 " break;\n"
10085 " }\n"
10086 " case 2:\n"
10087 " {\n"
10088 " }\n"
10089 " break;\n"
10090 " default:\n"
10091 " break;\n"
10092 " }\n"
10093 "}\n",
10094 GNUBraceStyle);
10095
10096 verifyFormat("enum X\n"
10097 "{\n"
10098 " Y = 0,\n"
10099 "}\n",
10100 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010101
10102 verifyFormat("@interface BSApplicationController ()\n"
10103 "{\n"
10104 "@private\n"
10105 " id _extraIvar;\n"
10106 "}\n"
10107 "@end\n",
10108 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010109
10110 verifyFormat("#ifdef _DEBUG\n"
10111 "int foo(int i = 0)\n"
10112 "#else\n"
10113 "int foo(int i = 5)\n"
10114 "#endif\n"
10115 "{\n"
10116 " return i;\n"
10117 "}",
10118 GNUBraceStyle);
10119
10120 verifyFormat("void foo() {}\n"
10121 "void bar()\n"
10122 "#ifdef _DEBUG\n"
10123 "{\n"
10124 " foo();\n"
10125 "}\n"
10126 "#else\n"
10127 "{\n"
10128 "}\n"
10129 "#endif",
10130 GNUBraceStyle);
10131
10132 verifyFormat("void foobar() { int i = 5; }\n"
10133 "#ifdef _DEBUG\n"
10134 "void bar() {}\n"
10135 "#else\n"
10136 "void bar() { foobar(); }\n"
10137 "#endif",
10138 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010139}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010140
10141TEST_F(FormatTest, WebKitBraceBreaking) {
10142 FormatStyle WebKitBraceStyle = getLLVMStyle();
10143 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010144 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010145 verifyFormat("namespace a {\n"
10146 "class A {\n"
10147 " void f()\n"
10148 " {\n"
10149 " if (true) {\n"
10150 " a();\n"
10151 " b();\n"
10152 " }\n"
10153 " }\n"
10154 " void g() { return; }\n"
10155 "};\n"
10156 "enum E {\n"
10157 " A,\n"
10158 " // foo\n"
10159 " B,\n"
10160 " C\n"
10161 "};\n"
10162 "struct B {\n"
10163 " int x;\n"
10164 "};\n"
10165 "}\n",
10166 WebKitBraceStyle);
10167 verifyFormat("struct S {\n"
10168 " int Type;\n"
10169 " union {\n"
10170 " int x;\n"
10171 " double y;\n"
10172 " } Value;\n"
10173 " class C {\n"
10174 " MyFavoriteType Value;\n"
10175 " } Class;\n"
10176 "};\n",
10177 WebKitBraceStyle);
10178}
10179
Manuel Klimekd5735502013-08-12 03:51:17 +000010180TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10181 verifyFormat("void f() {\n"
10182 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010183 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010184 " }\n"
10185 "}\n",
10186 getLLVMStyle());
10187}
10188
Daniel Jasper9613c812013-08-07 16:29:23 +000010189TEST_F(FormatTest, UnderstandsPragmas) {
10190 verifyFormat("#pragma omp reduction(| : var)");
10191 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010192
10193 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10194 "(including parentheses).",
10195 format("#pragma mark Any non-hyphenated or hyphenated string "
10196 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010197}
10198
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010199TEST_F(FormatTest, UnderstandPragmaOption) {
10200 verifyFormat("#pragma option -C -A");
10201
10202 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10203}
10204
Manuel Klimek77866142017-11-17 11:17:15 +000010205TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
10206 FormatStyle Style = getLLVMStyle();
10207 Style.ColumnLimit = 20;
10208
10209 verifyFormat("int a; // the\n"
10210 " // comment", Style);
10211 EXPECT_EQ("int a; /* first line\n"
10212 " * second\n"
10213 " * line third\n"
10214 " * line\n"
10215 " */",
10216 format("int a; /* first line\n"
10217 " * second\n"
10218 " * line third\n"
10219 " * line\n"
10220 " */",
10221 Style));
10222 EXPECT_EQ("int a; // first line\n"
10223 " // second\n"
10224 " // line third\n"
10225 " // line",
10226 format("int a; // first line\n"
10227 " // second line\n"
10228 " // third line",
10229 Style));
10230
10231 Style.PenaltyExcessCharacter = 90;
10232 verifyFormat("int a; // the comment", Style);
Manuel Klimek93699f42017-11-29 14:29:43 +000010233 EXPECT_EQ("int a; // the comment\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010234 " // aaa",
10235 format("int a; // the comment aaa", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010236 EXPECT_EQ("int a; /* first line\n"
10237 " * second line\n"
10238 " * third line\n"
10239 " */",
10240 format("int a; /* first line\n"
10241 " * second line\n"
10242 " * third line\n"
10243 " */",
10244 Style));
Manuel Klimek93699f42017-11-29 14:29:43 +000010245 EXPECT_EQ("int a; // first line\n"
10246 " // second line\n"
10247 " // third line",
10248 format("int a; // first line\n"
10249 " // second line\n"
10250 " // third line",
10251 Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010252 // FIXME: Investigate why this is not getting the same layout as the test
10253 // above.
10254 EXPECT_EQ("int a; /* first line\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010255 " * second line\n"
10256 " * third line\n"
Manuel Klimek77866142017-11-17 11:17:15 +000010257 " */",
10258 format("int a; /* first line second line third line"
10259 "\n*/",
10260 Style));
10261
10262 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010263 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010264 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010265 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010266 Style));
10267 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010268 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010269 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010270 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010271 Style));
10272
10273 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
10274 // next one.
Manuel Klimek93699f42017-11-29 14:29:43 +000010275 EXPECT_EQ("// foo bar baz bazfoo\n"
10276 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010277 format("// foo bar baz bazfoo bar\n"
10278 "// foo bar\n",
10279 Style));
10280
10281 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010282 "// foo bar baz bazfoo\n"
10283 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010284 format("// foo bar baz bazfoo\n"
10285 "// foo bar baz bazfoo bar\n"
10286 "// foo bar\n",
10287 Style));
10288
Manuel Klimek77866142017-11-17 11:17:15 +000010289 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010290 "// foo bar baz bazfoo\n"
10291 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010292 format("// foo bar baz bazfoo\n"
10293 "// foo bar baz bazfoo bar\n"
10294 "// foo bar\n",
10295 Style));
Manuel Klimek0b58c322017-12-01 13:28:08 +000010296
10297 // Make sure we do not keep protruding characters if strict mode reflow is
10298 // cheaper than keeping protruding characters.
10299 Style.ColumnLimit = 21;
10300 EXPECT_EQ("// foo foo foo foo\n"
10301 "// foo foo foo foo\n"
10302 "// foo foo foo foo\n",
10303 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
10304 Style));
10305
10306 EXPECT_EQ("int a = /* long block\n"
10307 " comment */\n"
10308 " 42;",
10309 format("int a = /* long block comment */ 42;", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010310}
10311
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010312#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10313 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010314 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10315 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010316
10317TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010318 SmallVector<FormatStyle, 3> Styles;
10319 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010320
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010321 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010322 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10323 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10324 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010325
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010326 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010327 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10328 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10329 EXPECT_ALL_STYLES_EQUAL(Styles);
10330
Nico Weber514ecc82014-02-02 20:50:45 +000010331 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010332 EXPECT_TRUE(
10333 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10334 EXPECT_TRUE(
10335 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10336 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010337
Nico Weber514ecc82014-02-02 20:50:45 +000010338 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010339 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10340 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10341 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010342
10343 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010344 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10345 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10346 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010347
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010348 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010349 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10350 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10351 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010352
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010353 Styles[0] = getGNUStyle();
10354 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10355 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10356 EXPECT_ALL_STYLES_EQUAL(Styles);
10357
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010358 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10359}
10360
10361TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10362 SmallVector<FormatStyle, 8> Styles;
10363 Styles.resize(2);
10364
10365 Styles[0] = getGoogleStyle();
10366 Styles[1] = getLLVMStyle();
10367 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10368 EXPECT_ALL_STYLES_EQUAL(Styles);
10369
10370 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010371 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010372 Styles[1] = getLLVMStyle();
10373 Styles[1].Language = FormatStyle::LK_JavaScript;
10374 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10375
10376 Styles[2] = getLLVMStyle();
10377 Styles[2].Language = FormatStyle::LK_JavaScript;
10378 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10379 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010380 &Styles[2])
10381 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010382
10383 Styles[3] = getLLVMStyle();
10384 Styles[3].Language = FormatStyle::LK_JavaScript;
10385 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10386 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010387 &Styles[3])
10388 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010389
10390 Styles[4] = getLLVMStyle();
10391 Styles[4].Language = FormatStyle::LK_JavaScript;
10392 EXPECT_EQ(0, parseConfiguration("---\n"
10393 "BasedOnStyle: LLVM\n"
10394 "IndentWidth: 123\n"
10395 "---\n"
10396 "BasedOnStyle: Google\n"
10397 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010398 &Styles[4])
10399 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010400 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010401}
10402
Daniel Jasper91881d92014-09-29 08:07:46 +000010403#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010404 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010405 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010406 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010407 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010408 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010409
Daniel Jasper91881d92014-09-29 08:07:46 +000010410#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10411
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010412#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10413 Style.STRUCT.FIELD = false; \
10414 EXPECT_EQ(0, \
10415 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10416 .value()); \
10417 EXPECT_TRUE(Style.STRUCT.FIELD); \
10418 EXPECT_EQ(0, \
10419 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10420 .value()); \
10421 EXPECT_FALSE(Style.STRUCT.FIELD);
10422
10423#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10424 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10425
Daniel Jasper00853002014-09-16 16:22:30 +000010426#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10427 EXPECT_NE(VALUE, Style.FIELD); \
10428 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10429 EXPECT_EQ(VALUE, Style.FIELD)
10430
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010431TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010432 FormatStyle Style = {};
10433 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +000010434 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010435 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010436 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010437 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010438 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010439 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010440 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010441 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010442 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010443 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010444 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010445 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010446 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010447 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010448 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +000010449 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Francois Ferrande56a8292017-06-14 12:29:47 +000010450 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010451 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010452 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010453 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010454 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010455 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010456 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010457 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010458 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010459 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010460 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010461 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010462 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +000010463 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010464 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010465 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010466 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010467 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010468 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010469 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010470 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010471 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010472 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Francois Ferrand2a9ea782018-03-01 10:09:13 +000010473 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
10474 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
10475 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010476
10477 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10478 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10479 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10480 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10481 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10482 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10483 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10484 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
Krasimir Georgievd6ce9372017-09-15 11:23:50 +000010485 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010486 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10487 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10488 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +000010489 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10490 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10491 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010492}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010493
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010494#undef CHECK_PARSE_BOOL
10495
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010496TEST_F(FormatTest, ParsesConfiguration) {
10497 FormatStyle Style = {};
10498 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010499 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010500 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10501 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010502 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010503 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10504 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +000010505 CHECK_PARSE("PenaltyBreakAssignment: 1234",
10506 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010507 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10508 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010509 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10510 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10511 PenaltyReturnTypeOnItsOwnLine, 1234u);
10512 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10513 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010514 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010515 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010516 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010517
Daniel Jasper553d4872014-06-17 12:40:34 +000010518 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010519 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10520 FormatStyle::PAS_Left);
10521 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10522 FormatStyle::PAS_Right);
10523 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10524 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010525 // For backward compatibility:
10526 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10527 FormatStyle::PAS_Left);
10528 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10529 FormatStyle::PAS_Right);
10530 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10531 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010532
Alexander Kornienkod6538332013-05-07 15:32:14 +000010533 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010534 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10535 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010536 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10537 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10538 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10539
Daniel Jasperac043c92014-09-15 11:11:00 +000010540 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010541 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10542 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010543 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10544 FormatStyle::BOS_None);
10545 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10546 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010547 // For backward compatibility:
10548 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10549 FormatStyle::BOS_None);
10550 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10551 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010552
Francois Ferranda6b6d512017-05-24 11:36:58 +000010553 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10554 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10555 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10556 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10557 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10558 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10559 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10560 // For backward compatibility:
10561 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10562 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10563
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010564 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10565 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10566 FormatStyle::BAS_Align);
10567 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10568 FormatStyle::BAS_DontAlign);
10569 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10570 FormatStyle::BAS_AlwaysBreak);
10571 // For backward compatibility:
10572 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10573 FormatStyle::BAS_DontAlign);
10574 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10575 FormatStyle::BAS_Align);
10576
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +000010577 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10578 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
10579 FormatStyle::ENAS_DontAlign);
10580 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
10581 FormatStyle::ENAS_Left);
10582 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
10583 FormatStyle::ENAS_Right);
10584 // For backward compatibility:
10585 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
10586 FormatStyle::ENAS_Left);
10587 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
10588 FormatStyle::ENAS_Right);
10589
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010590 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010591 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10592 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10593 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010594 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10595 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010596 // For backward compatibility:
10597 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10598 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010599
Daniel Jasperd74cf402014-04-08 12:46:38 +000010600 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010601 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10602 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10603 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10604 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010605 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10606 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010607 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10608 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010609 // For backward compatibility:
10610 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10611 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10612 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10613 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010614
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010615 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10616 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10617 FormatStyle::SBPO_Never);
10618 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10619 FormatStyle::SBPO_Always);
10620 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10621 FormatStyle::SBPO_ControlStatements);
10622 // For backward compatibility:
10623 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10624 FormatStyle::SBPO_Never);
10625 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10626 FormatStyle::SBPO_ControlStatements);
10627
Alexander Kornienkod6538332013-05-07 15:32:14 +000010628 Style.ColumnLimit = 123;
10629 FormatStyle BaseStyle = getLLVMStyle();
10630 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10631 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10632
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010633 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10634 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10635 FormatStyle::BS_Attach);
10636 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10637 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010638 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10639 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010640 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10641 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010642 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10643 FormatStyle::BS_Allman);
10644 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010645 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10646 FormatStyle::BS_WebKit);
10647 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10648 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010649
Zachary Turner448592e2015-12-18 22:20:15 +000010650 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10651 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10652 FormatStyle::RTBS_None);
10653 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10654 FormatStyle::RTBS_All);
10655 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010656 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010657 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10658 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10659 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10660 AlwaysBreakAfterReturnType,
10661 FormatStyle::RTBS_TopLevelDefinitions);
10662
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010663 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10664 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10665 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10666 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10667 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10668 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10669 AlwaysBreakAfterDefinitionReturnType,
10670 FormatStyle::DRTBS_TopLevel);
10671
Daniel Jasper65ee3472013-07-31 23:16:02 +000010672 Style.NamespaceIndentation = FormatStyle::NI_All;
10673 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10674 FormatStyle::NI_None);
10675 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10676 FormatStyle::NI_Inner);
10677 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10678 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010679
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010680 // FIXME: This is required because parsing a configuration simply overwrites
10681 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010682 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010683 std::vector<std::string> BoostForeach;
10684 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010685 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010686 std::vector<std::string> BoostAndQForeach;
10687 BoostAndQForeach.push_back("BOOST_FOREACH");
10688 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010689 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10690 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010691
Eric Liu9d92c022018-05-14 19:51:33 +000010692 Style.IncludeStyle.IncludeCategories.clear();
10693 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
10694 {"abc/.*", 2}, {".*", 1}};
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010695 CHECK_PARSE("IncludeCategories:\n"
10696 " - Regex: abc/.*\n"
10697 " Priority: 2\n"
10698 " - Regex: .*\n"
10699 " Priority: 1",
Eric Liu9d92c022018-05-14 19:51:33 +000010700 IncludeStyle.IncludeCategories, ExpectedCategories);
10701 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
10702 "abc$");
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010703
10704 Style.RawStringFormats.clear();
10705 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010706 {
10707 FormatStyle::LK_TextProto,
10708 {"pb", "proto"},
10709 {"PARSE_TEXT_PROTO"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010710 /*CanonicalDelimiter=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010711 "llvm",
10712 },
10713 {
10714 FormatStyle::LK_Cpp,
10715 {"cc", "cpp"},
10716 {"C_CODEBLOCK", "CPPEVAL"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010717 /*CanonicalDelimiter=*/"cc",
10718 /*BasedOnStyle=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010719 },
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010720 };
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010721
10722 CHECK_PARSE("RawStringFormats:\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010723 " - Language: TextProto\n"
10724 " Delimiters:\n"
10725 " - 'pb'\n"
10726 " - 'proto'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010727 " EnclosingFunctions:\n"
10728 " - 'PARSE_TEXT_PROTO'\n"
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010729 " BasedOnStyle: llvm\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000010730 " - Language: Cpp\n"
10731 " Delimiters:\n"
10732 " - 'cc'\n"
10733 " - 'cpp'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000010734 " EnclosingFunctions:\n"
10735 " - 'C_CODEBLOCK'\n"
Krasimir Georgiev412ed092018-01-19 16:18:47 +000010736 " - 'CPPEVAL'\n"
10737 " CanonicalDelimiter: 'cc'",
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000010738 RawStringFormats, ExpectedRawStringFormats);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010739}
10740
10741TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10742 FormatStyle Style = {};
10743 Style.Language = FormatStyle::LK_Cpp;
10744 CHECK_PARSE("Language: Cpp\n"
10745 "IndentWidth: 12",
10746 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010747 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10748 "IndentWidth: 34",
10749 &Style),
10750 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010751 EXPECT_EQ(12u, Style.IndentWidth);
10752 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10753 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10754
10755 Style.Language = FormatStyle::LK_JavaScript;
10756 CHECK_PARSE("Language: JavaScript\n"
10757 "IndentWidth: 12",
10758 IndentWidth, 12u);
10759 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010760 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10761 "IndentWidth: 34",
10762 &Style),
10763 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010764 EXPECT_EQ(23u, Style.IndentWidth);
10765 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10766 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10767
10768 CHECK_PARSE("BasedOnStyle: LLVM\n"
10769 "IndentWidth: 67",
10770 IndentWidth, 67u);
10771
10772 CHECK_PARSE("---\n"
10773 "Language: JavaScript\n"
10774 "IndentWidth: 12\n"
10775 "---\n"
10776 "Language: Cpp\n"
10777 "IndentWidth: 34\n"
10778 "...\n",
10779 IndentWidth, 12u);
10780
10781 Style.Language = FormatStyle::LK_Cpp;
10782 CHECK_PARSE("---\n"
10783 "Language: JavaScript\n"
10784 "IndentWidth: 12\n"
10785 "---\n"
10786 "Language: Cpp\n"
10787 "IndentWidth: 34\n"
10788 "...\n",
10789 IndentWidth, 34u);
10790 CHECK_PARSE("---\n"
10791 "IndentWidth: 78\n"
10792 "---\n"
10793 "Language: JavaScript\n"
10794 "IndentWidth: 56\n"
10795 "...\n",
10796 IndentWidth, 78u);
10797
10798 Style.ColumnLimit = 123;
10799 Style.IndentWidth = 234;
10800 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10801 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010802 EXPECT_FALSE(parseConfiguration("---\n"
10803 "IndentWidth: 456\n"
10804 "BreakBeforeBraces: Allman\n"
10805 "---\n"
10806 "Language: JavaScript\n"
10807 "IndentWidth: 111\n"
10808 "TabWidth: 111\n"
10809 "---\n"
10810 "Language: Cpp\n"
10811 "BreakBeforeBraces: Stroustrup\n"
10812 "TabWidth: 789\n"
10813 "...\n",
10814 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010815 EXPECT_EQ(123u, Style.ColumnLimit);
10816 EXPECT_EQ(456u, Style.IndentWidth);
10817 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10818 EXPECT_EQ(789u, Style.TabWidth);
10819
Rafael Espindola1f243172014-06-12 11:35:17 +000010820 EXPECT_EQ(parseConfiguration("---\n"
10821 "Language: JavaScript\n"
10822 "IndentWidth: 56\n"
10823 "---\n"
10824 "IndentWidth: 78\n"
10825 "...\n",
10826 &Style),
10827 ParseError::Error);
10828 EXPECT_EQ(parseConfiguration("---\n"
10829 "Language: JavaScript\n"
10830 "IndentWidth: 56\n"
10831 "---\n"
10832 "Language: JavaScript\n"
10833 "IndentWidth: 78\n"
10834 "...\n",
10835 &Style),
10836 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010837
10838 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10839}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010840
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010841#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010842
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010843TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10844 FormatStyle Style = {};
10845 Style.Language = FormatStyle::LK_JavaScript;
10846 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010847 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010848 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010849
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010850 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010851 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010852 "BasedOnStyle: Google\n"
10853 "---\n"
10854 "Language: JavaScript\n"
10855 "IndentWidth: 76\n"
10856 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010857 &Style)
10858 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010859 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010860 EXPECT_EQ(76u, Style.IndentWidth);
10861 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10862}
10863
Alexander Kornienkod6538332013-05-07 15:32:14 +000010864TEST_F(FormatTest, ConfigurationRoundTripTest) {
10865 FormatStyle Style = getLLVMStyle();
10866 std::string YAML = configurationAsText(Style);
10867 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010868 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010869 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10870 EXPECT_EQ(Style, ParsedStyle);
10871}
10872
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010873TEST_F(FormatTest, WorksFor8bitEncodings) {
10874 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10875 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10876 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10877 "\"\xef\xee\xf0\xf3...\"",
10878 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10879 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10880 "\xef\xee\xf0\xf3...\"",
10881 getLLVMStyleWithColumns(12)));
10882}
10883
Alexander Kornienko393e3082013-11-13 14:04:17 +000010884TEST_F(FormatTest, HandlesUTF8BOM) {
10885 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10886 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10887 format("\xef\xbb\xbf#include <iostream>"));
10888 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10889 format("\xef\xbb\xbf\n#include <iostream>"));
10890}
10891
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010892// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10893#if !defined(_MSC_VER)
10894
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010895TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10896 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10897 getLLVMStyleWithColumns(35));
10898 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010899 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010900 verifyFormat("// Однажды в студёную зимнюю пору...",
10901 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010902 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010903 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10904 getLLVMStyleWithColumns(39));
10905 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010906 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010907}
10908
10909TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010910 // Non-printable characters' width is currently considered to be the length in
10911 // bytes in UTF8. The characters can be displayed in very different manner
10912 // (zero-width, single width with a substitution glyph, expanded to their code
10913 // (e.g. "<8d>"), so there's no single correct way to handle them.
10914 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010915 "\"\xc2\x8d\";",
10916 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010917 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010918 "\"\xc2\x8d\";",
10919 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010920 EXPECT_EQ("\"Однажды, в \"\n"
10921 "\"студёную \"\n"
10922 "\"зимнюю \"\n"
10923 "\"пору,\"",
10924 format("\"Однажды, в студёную зимнюю пору,\"",
10925 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010926 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010927 "\"一 二 三 \"\n"
10928 "\"四 五六 \"\n"
10929 "\"七 八 九 \"\n"
10930 "\"十\"",
10931 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Manuel Klimek93699f42017-11-29 14:29:43 +000010932 EXPECT_EQ("\"一\t\"\n"
10933 "\"二 \t\"\n"
10934 "\"三 四 \"\n"
10935 "\"五\t\"\n"
10936 "\"六 \t\"\n"
10937 "\"七 \"\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010938 "\"八九十\tqq\"",
10939 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10940 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010941
10942 // UTF8 character in an escape sequence.
10943 EXPECT_EQ("\"aaaaaa\"\n"
10944 "\"\\\xC2\x8D\"",
10945 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010946}
10947
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010948TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10949 EXPECT_EQ("const char *sssss =\n"
10950 " \"一二三四五六七八\\\n"
10951 " 九 十\";",
10952 format("const char *sssss = \"一二三四五六七八\\\n"
10953 " 九 十\";",
10954 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010955}
10956
10957TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010958 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10959 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010960 EXPECT_EQ("// Я из лесу\n"
10961 "// вышел; был\n"
10962 "// сильный\n"
10963 "// мороз.",
10964 format("// Я из лесу вышел; был сильный мороз.",
10965 getLLVMStyleWithColumns(13)));
10966 EXPECT_EQ("// 一二三\n"
10967 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010968 "// 八 九\n"
10969 "// 十",
10970 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010971}
10972
10973TEST_F(FormatTest, SplitsUTF8BlockComments) {
10974 EXPECT_EQ("/* Гляжу,\n"
10975 " * поднимается\n"
10976 " * медленно в\n"
10977 " * гору\n"
10978 " * Лошадка,\n"
10979 " * везущая\n"
10980 " * хворосту\n"
10981 " * воз. */",
10982 format("/* Гляжу, поднимается медленно в гору\n"
10983 " * Лошадка, везущая хворосту воз. */",
10984 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010985 EXPECT_EQ(
10986 "/* 一二三\n"
10987 " * 四五六七\n"
10988 " * 八 九\n"
10989 " * 十 */",
10990 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010991 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10992 " * 𝕓𝕪𝕥𝕖\n"
10993 " * 𝖀𝕿𝕱-𝟠 */",
10994 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010995}
10996
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010997#endif // _MSC_VER
10998
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010999TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
11000 FormatStyle Style = getLLVMStyle();
11001
11002 Style.ConstructorInitializerIndentWidth = 4;
11003 verifyFormat(
11004 "SomeClass::Constructor()\n"
11005 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11006 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11007 Style);
11008
11009 Style.ConstructorInitializerIndentWidth = 2;
11010 verifyFormat(
11011 "SomeClass::Constructor()\n"
11012 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11013 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11014 Style);
11015
11016 Style.ConstructorInitializerIndentWidth = 0;
11017 verifyFormat(
11018 "SomeClass::Constructor()\n"
11019 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11020 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11021 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000011022 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
11023 verifyFormat(
11024 "SomeLongTemplateVariableName<\n"
11025 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
11026 Style);
11027 verifyFormat(
11028 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
11029 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
11030 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000011031}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011032
Daniel Jasper00853002014-09-16 16:22:30 +000011033TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
11034 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000011035 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011036 Style.ConstructorInitializerIndentWidth = 4;
11037 verifyFormat("SomeClass::Constructor()\n"
11038 " : a(a)\n"
11039 " , b(b)\n"
11040 " , c(c) {}",
11041 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011042 verifyFormat("SomeClass::Constructor()\n"
11043 " : a(a) {}",
11044 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011045
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011046 Style.ColumnLimit = 0;
11047 verifyFormat("SomeClass::Constructor()\n"
11048 " : a(a) {}",
11049 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000011050 verifyFormat("SomeClass::Constructor() noexcept\n"
11051 " : a(a) {}",
11052 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011053 verifyFormat("SomeClass::Constructor()\n"
11054 " : a(a)\n"
11055 " , b(b)\n"
11056 " , c(c) {}",
11057 Style);
11058 verifyFormat("SomeClass::Constructor()\n"
11059 " : a(a) {\n"
11060 " foo();\n"
11061 " bar();\n"
11062 "}",
11063 Style);
11064
Daniel Jasperd74cf402014-04-08 12:46:38 +000011065 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011066 verifyFormat("SomeClass::Constructor()\n"
11067 " : a(a)\n"
11068 " , b(b)\n"
11069 " , c(c) {\n}",
11070 Style);
11071 verifyFormat("SomeClass::Constructor()\n"
11072 " : a(a) {\n}",
11073 Style);
11074
11075 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000011076 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011077 Style.ConstructorInitializerIndentWidth = 2;
11078 verifyFormat("SomeClass::Constructor()\n"
11079 " : a(a)\n"
11080 " , b(b)\n"
11081 " , c(c) {}",
11082 Style);
11083
11084 Style.ConstructorInitializerIndentWidth = 0;
11085 verifyFormat("SomeClass::Constructor()\n"
11086 ": a(a)\n"
11087 ", b(b)\n"
11088 ", c(c) {}",
11089 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011090
11091 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
11092 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011093 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
11094 verifyFormat(
11095 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
11096 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011097 verifyFormat(
11098 "SomeClass::Constructor()\n"
11099 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
11100 Style);
11101 Style.ConstructorInitializerIndentWidth = 4;
11102 Style.ColumnLimit = 60;
11103 verifyFormat("SomeClass::Constructor()\n"
11104 " : aaaaaaaa(aaaaaaaa)\n"
11105 " , aaaaaaaa(aaaaaaaa)\n"
11106 " , aaaaaaaa(aaaaaaaa) {}",
11107 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011108}
11109
Daniel Jasper38efc132014-10-21 07:51:54 +000011110TEST_F(FormatTest, Destructors) {
11111 verifyFormat("void F(int &i) { i.~int(); }");
11112 verifyFormat("void F(int &i) { i->~int(); }");
11113}
11114
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011115TEST_F(FormatTest, FormatsWithWebKitStyle) {
11116 FormatStyle Style = getWebKitStyle();
11117
11118 // Don't indent in outer namespaces.
11119 verifyFormat("namespace outer {\n"
11120 "int i;\n"
11121 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000011122 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011123 "} // namespace inner\n"
11124 "} // namespace outer\n"
11125 "namespace other_outer {\n"
11126 "int i;\n"
11127 "}",
11128 Style);
11129
11130 // Don't indent case labels.
11131 verifyFormat("switch (variable) {\n"
11132 "case 1:\n"
11133 "case 2:\n"
11134 " doSomething();\n"
11135 " break;\n"
11136 "default:\n"
11137 " ++variable;\n"
11138 "}",
11139 Style);
11140
11141 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000011142 EXPECT_EQ("void f()\n"
11143 "{\n"
11144 " if (aaaaaaaaaaaaaaaa\n"
11145 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
11146 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11147 " return;\n"
11148 "}",
11149 format("void f() {\n"
11150 "if (aaaaaaaaaaaaaaaa\n"
11151 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
11152 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11153 "return;\n"
11154 "}",
11155 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011156
Daniel Jasper35995672014-04-29 14:05:20 +000011157 // Allow functions on a single line.
11158 verifyFormat("void f() { return; }", Style);
11159
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011160 // Constructor initializers are formatted one per line with the "," on the
11161 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011162 verifyFormat("Constructor()\n"
11163 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
11164 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000011165 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011166 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
11167 "{\n"
11168 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011169 Style);
11170 verifyFormat("SomeClass::Constructor()\n"
11171 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011172 "{\n"
11173 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011174 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000011175 EXPECT_EQ("SomeClass::Constructor()\n"
11176 " : a(a)\n"
11177 "{\n"
11178 "}",
11179 format("SomeClass::Constructor():a(a){}", Style));
11180 verifyFormat("SomeClass::Constructor()\n"
11181 " : a(a)\n"
11182 " , b(b)\n"
11183 " , c(c)\n"
11184 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011185 "}",
11186 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011187 verifyFormat("SomeClass::Constructor()\n"
11188 " : a(a)\n"
11189 "{\n"
11190 " foo();\n"
11191 " bar();\n"
11192 "}",
11193 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011194
Daniel Jasper65ee3472013-07-31 23:16:02 +000011195 // Access specifiers should be aligned left.
11196 verifyFormat("class C {\n"
11197 "public:\n"
11198 " int i;\n"
11199 "};",
11200 Style);
11201
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011202 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000011203 verifyFormat("int a; // Do not\n"
11204 "double b; // align comments.",
11205 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011206
Daniel Jasper3219e432014-12-02 13:24:51 +000011207 // Do not align operands.
11208 EXPECT_EQ("ASSERT(aaaa\n"
11209 " || bbbb);",
11210 format("ASSERT ( aaaa\n||bbbb);", Style));
11211
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011212 // Accept input's line breaks.
11213 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
11214 " || bbbbbbbbbbbbbbb) {\n"
11215 " i++;\n"
11216 "}",
11217 format("if (aaaaaaaaaaaaaaa\n"
11218 "|| bbbbbbbbbbbbbbb) { i++; }",
11219 Style));
11220 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
11221 " i++;\n"
11222 "}",
11223 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000011224
11225 // Don't automatically break all macro definitions (llvm.org/PR17842).
11226 verifyFormat("#define aNumber 10", Style);
11227 // However, generally keep the line breaks that the user authored.
11228 EXPECT_EQ("#define aNumber \\\n"
11229 " 10",
11230 format("#define aNumber \\\n"
11231 " 10",
11232 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000011233
11234 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011235 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
11236 " copyItems:YES];",
11237 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
11238 "copyItems:YES];",
11239 Style));
11240 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
11241 " copyItems:YES];",
11242 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
11243 " copyItems:YES];",
11244 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000011245 // FIXME: This does not seem right, there should be more indentation before
11246 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011247 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000011248 " @\"a\",\n"
11249 " @\"a\"\n"
11250 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011251 " copyItems:YES];",
11252 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11253 " @\"a\",\n"
11254 " @\"a\"\n"
11255 " ]\n"
11256 " copyItems:YES];",
11257 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011258 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011259 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11260 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011261 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11262 " copyItems:YES];",
11263 Style));
11264
11265 verifyFormat("[self.a b:c c:d];", Style);
11266 EXPECT_EQ("[self.a b:c\n"
11267 " c:d];",
11268 format("[self.a b:c\n"
11269 "c:d];",
11270 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011271}
11272
Manuel Klimekffdeb592013-09-03 15:10:01 +000011273TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011274 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11275 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11276 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11277 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11278 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011279 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Manuel Klimek9f0a4e52017-09-19 09:59:30 +000011280 verifyFormat("auto c = [a = [b = 42] {}] {};\n");
11281 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011282 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011283 verifyFormat("void f() {\n"
11284 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11285 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011286 verifyFormat("void f() {\n"
11287 " other(x.begin(), //\n"
11288 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011289 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011290 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011291 verifyFormat("SomeFunction([]() { // A cool function...\n"
11292 " return 43;\n"
11293 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011294 EXPECT_EQ("SomeFunction([]() {\n"
11295 "#define A a\n"
11296 " return 43;\n"
11297 "});",
11298 format("SomeFunction([](){\n"
11299 "#define A a\n"
11300 "return 43;\n"
11301 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011302 verifyFormat("void f() {\n"
11303 " SomeFunction([](decltype(x), A *a) {});\n"
11304 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011305 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11306 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011307 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11308 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11309 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011310 verifyFormat("Constructor()\n"
11311 " : Field([] { // comment\n"
11312 " int i;\n"
11313 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011314 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11315 " return some_parameter.size();\n"
11316 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011317 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11318 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011319 verifyFormat("int i = aaaaaa ? 1 //\n"
11320 " : [] {\n"
11321 " return 2; //\n"
11322 " }();");
11323 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11324 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11325 " return x == 2; // force break\n"
11326 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011327 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11328 " [=](int iiiiiiiiiiii) {\n"
11329 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
11330 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
11331 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011332 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011333 verifyFormat("SomeFunction({[&] {\n"
11334 " // comment\n"
11335 " },\n"
11336 " [&] {\n"
11337 " // comment\n"
11338 " }});");
11339 verifyFormat("SomeFunction({[&] {\n"
11340 " // comment\n"
11341 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011342 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11343 " [&]() { return true; },\n"
11344 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011345
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011346 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011347 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011348 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011349 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11350 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011351 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011352 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011353 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11354 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011355 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011356 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11357 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011358 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011359 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011360 verifyFormat(
11361 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11362 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11363 " return aaaaaaaaaaaaaaaaa;\n"
11364 " });",
11365 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011366 verifyFormat("[]() //\n"
11367 " -> int {\n"
11368 " return 1; //\n"
11369 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011370
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011371 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011372 verifyFormat("SomeFunction(\n"
11373 " []() {\n"
11374 " int i = 42;\n"
11375 " return i;\n"
11376 " },\n"
11377 " []() {\n"
11378 " int j = 43;\n"
11379 " return j;\n"
11380 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011381
Daniel Jasperda18fd82014-06-10 06:39:03 +000011382 // More complex introducers.
11383 verifyFormat("return [i, args...] {};");
11384
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011385 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011386 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011387 verifyFormat("double &operator[](int i) { return 0; }\n"
11388 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011389 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011390 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011391 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011392
11393 // Other corner cases.
11394 verifyFormat("void f() {\n"
11395 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000011396 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000011397 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011398
11399 // Lambdas created through weird macros.
11400 verifyFormat("void f() {\n"
11401 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011402 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011403 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011404
11405 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11406 " doo_dah();\n"
11407 " doo_dah();\n"
11408 " })) {\n"
11409 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000011410 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
11411 " doo_dah();\n"
11412 " doo_dah();\n"
11413 " })) {\n"
11414 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011415 verifyFormat("auto lambda = []() {\n"
11416 " int a = 2\n"
11417 "#if A\n"
11418 " + 2\n"
11419 "#endif\n"
11420 " ;\n"
11421 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011422
11423 // Lambdas with complex multiline introducers.
11424 verifyFormat(
11425 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11426 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
11427 " -> ::std::unordered_set<\n"
11428 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
11429 " //\n"
11430 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011431}
11432
Martin Probsta004b3f2017-11-17 18:06:33 +000011433TEST_F(FormatTest, EmptyLinesInLambdas) {
11434 verifyFormat("auto lambda = []() {\n"
11435 " x(); //\n"
11436 "};",
11437 "auto lambda = []() {\n"
11438 "\n"
11439 " x(); //\n"
11440 "\n"
11441 "};");
11442}
11443
Manuel Klimek516e0542013-09-04 13:25:30 +000011444TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011445 FormatStyle ShortBlocks = getLLVMStyle();
11446 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11447 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11448 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11449 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11450 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11451 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11452 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011453
Daniel Jasper76284682014-10-22 09:12:44 +000011454 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11455 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11456 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011457
Daniel Jasper76284682014-10-22 09:12:44 +000011458 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011459 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011460 "}];");
11461 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011462 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011463 "}]};");
11464 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011465 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011466 "}];");
11467 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011468 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011469 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011470 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011471 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011472 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011473 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011474 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011475
11476 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011477 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011478 "}];",
11479 getLLVMStyleWithColumns(60));
11480 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011481 " NSString *path = [self sessionFilePath];\n"
11482 " if (path) {\n"
11483 " // ...\n"
11484 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011485 "});");
11486 verifyFormat("[[SessionService sharedService]\n"
11487 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011488 " if (window) {\n"
11489 " [self windowDidLoad:window];\n"
11490 " } else {\n"
11491 " [self errorLoadingWindow];\n"
11492 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011493 " }];");
11494 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011495 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011496 "};\n",
11497 getLLVMStyleWithColumns(40));
11498 verifyFormat("[[SessionService sharedService]\n"
11499 " loadWindowWithCompletionBlock: //\n"
11500 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011501 " if (window) {\n"
11502 " [self windowDidLoad:window];\n"
11503 " } else {\n"
11504 " [self errorLoadingWindow];\n"
11505 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011506 " }];",
11507 getLLVMStyleWithColumns(60));
11508 verifyFormat("[myObject doSomethingWith:arg1\n"
11509 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011510 " // ...\n"
11511 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011512 " }\n"
11513 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011514 " // ...\n"
11515 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011516 " }\n"
11517 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011518 " // ...\n"
11519 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011520 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011521 verifyFormat("[myObject doSomethingWith:arg1\n"
11522 " firstBlock:-1\n"
11523 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011524 " // ...\n"
11525 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011526 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011527
11528 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011529 " @autoreleasepool {\n"
11530 " if (a) {\n"
11531 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011532 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011533 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011534 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011535 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011536 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11537 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011538
11539 FormatStyle FourIndent = getLLVMStyle();
11540 FourIndent.ObjCBlockIndentWidth = 4;
11541 verifyFormat("[operation setCompletionBlock:^{\n"
11542 " [self onOperationDone];\n"
11543 "}];",
11544 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011545}
11546
Daniel Jasper289afc02015-04-23 09:23:17 +000011547TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11548 FormatStyle ZeroColumn = getLLVMStyle();
11549 ZeroColumn.ColumnLimit = 0;
11550
11551 verifyFormat("[[SessionService sharedService] "
11552 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11553 " if (window) {\n"
11554 " [self windowDidLoad:window];\n"
11555 " } else {\n"
11556 " [self errorLoadingWindow];\n"
11557 " }\n"
11558 "}];",
11559 ZeroColumn);
11560 EXPECT_EQ("[[SessionService sharedService]\n"
11561 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11562 " if (window) {\n"
11563 " [self windowDidLoad:window];\n"
11564 " } else {\n"
11565 " [self errorLoadingWindow];\n"
11566 " }\n"
11567 " }];",
11568 format("[[SessionService sharedService]\n"
11569 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11570 " if (window) {\n"
11571 " [self windowDidLoad:window];\n"
11572 " } else {\n"
11573 " [self errorLoadingWindow];\n"
11574 " }\n"
11575 "}];",
11576 ZeroColumn));
11577 verifyFormat("[myObject doSomethingWith:arg1\n"
11578 " firstBlock:^(Foo *a) {\n"
11579 " // ...\n"
11580 " int i;\n"
11581 " }\n"
11582 " secondBlock:^(Bar *b) {\n"
11583 " // ...\n"
11584 " int i;\n"
11585 " }\n"
11586 " thirdBlock:^Foo(Bar *b) {\n"
11587 " // ...\n"
11588 " int i;\n"
11589 " }];",
11590 ZeroColumn);
11591 verifyFormat("f(^{\n"
11592 " @autoreleasepool {\n"
11593 " if (a) {\n"
11594 " g();\n"
11595 " }\n"
11596 " }\n"
11597 "});",
11598 ZeroColumn);
11599 verifyFormat("void (^largeBlock)(void) = ^{\n"
11600 " // ...\n"
11601 "};",
11602 ZeroColumn);
11603
11604 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11605 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011606 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011607 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11608 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11609 " int i;\n"
11610 "};",
11611 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11612}
11613
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011614TEST_F(FormatTest, SupportsCRLF) {
11615 EXPECT_EQ("int a;\r\n"
11616 "int b;\r\n"
11617 "int c;\r\n",
11618 format("int a;\r\n"
11619 " int b;\r\n"
11620 " int c;\r\n",
11621 getLLVMStyle()));
11622 EXPECT_EQ("int a;\r\n"
11623 "int b;\r\n"
11624 "int c;\r\n",
11625 format("int a;\r\n"
11626 " int b;\n"
11627 " int c;\r\n",
11628 getLLVMStyle()));
11629 EXPECT_EQ("int a;\n"
11630 "int b;\n"
11631 "int c;\n",
11632 format("int a;\r\n"
11633 " int b;\n"
11634 " int c;\n",
11635 getLLVMStyle()));
11636 EXPECT_EQ("\"aaaaaaa \"\r\n"
11637 "\"bbbbbbb\";\r\n",
11638 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11639 EXPECT_EQ("#define A \\\r\n"
11640 " b; \\\r\n"
11641 " c; \\\r\n"
11642 " d;\r\n",
11643 format("#define A \\\r\n"
11644 " b; \\\r\n"
11645 " c; d; \r\n",
11646 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011647
11648 EXPECT_EQ("/*\r\n"
11649 "multi line block comments\r\n"
11650 "should not introduce\r\n"
11651 "an extra carriage return\r\n"
11652 "*/\r\n",
11653 format("/*\r\n"
11654 "multi line block comments\r\n"
11655 "should not introduce\r\n"
11656 "an extra carriage return\r\n"
11657 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011658}
11659
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011660TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11661 verifyFormat("MY_CLASS(C) {\n"
11662 " int i;\n"
11663 " int j;\n"
11664 "};");
11665}
11666
Daniel Jasper6633ab82013-10-18 10:38:14 +000011667TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11668 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11669 TwoIndent.ContinuationIndentWidth = 2;
11670
11671 EXPECT_EQ("int i =\n"
11672 " longFunction(\n"
11673 " arg);",
11674 format("int i = longFunction(arg);", TwoIndent));
11675
11676 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11677 SixIndent.ContinuationIndentWidth = 6;
11678
11679 EXPECT_EQ("int i =\n"
11680 " longFunction(\n"
11681 " arg);",
11682 format("int i = longFunction(arg);", SixIndent));
11683}
11684
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011685TEST_F(FormatTest, SpacesInAngles) {
11686 FormatStyle Spaces = getLLVMStyle();
11687 Spaces.SpacesInAngles = true;
11688
11689 verifyFormat("static_cast< int >(arg);", Spaces);
11690 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11691 verifyFormat("f< int, float >();", Spaces);
11692 verifyFormat("template <> g() {}", Spaces);
11693 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011694 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11695 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11696 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011697
11698 Spaces.Standard = FormatStyle::LS_Cpp03;
11699 Spaces.SpacesInAngles = true;
11700 verifyFormat("A< A< int > >();", Spaces);
11701
11702 Spaces.SpacesInAngles = false;
11703 verifyFormat("A<A<int> >();", Spaces);
11704
11705 Spaces.Standard = FormatStyle::LS_Cpp11;
11706 Spaces.SpacesInAngles = true;
11707 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011708
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011709 Spaces.SpacesInAngles = false;
11710 verifyFormat("A<A<int>>();", Spaces);
11711}
11712
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011713TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11714 FormatStyle Style = getLLVMStyle();
11715 Style.SpaceAfterTemplateKeyword = false;
11716 verifyFormat("template<int> void foo();", Style);
11717}
11718
Jacques Pienaarfc275112015-02-18 23:48:37 +000011719TEST_F(FormatTest, TripleAngleBrackets) {
11720 verifyFormat("f<<<1, 1>>>();");
11721 verifyFormat("f<<<1, 1, 1, s>>>();");
11722 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011723 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011724 verifyFormat("f<param><<<1, 1>>>();");
11725 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011726 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011727 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11728 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011729 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11730 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011731}
11732
11733TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011734 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011735 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011736 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11737 "aaallvm::outs() <<");
11738 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11739 "aaaallvm::outs()\n <<");
11740}
11741
Manuel Klimek819788d2014-03-18 11:22:45 +000011742TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11743 std::string code = "#if A\n"
11744 "#if B\n"
11745 "a.\n"
11746 "#endif\n"
11747 " a = 1;\n"
11748 "#else\n"
11749 "#endif\n"
11750 "#if C\n"
11751 "#else\n"
11752 "#endif\n";
11753 EXPECT_EQ(code, format(code));
11754}
11755
Manuel Klimek68b03042014-04-14 09:14:11 +000011756TEST_F(FormatTest, HandleConflictMarkers) {
11757 // Git/SVN conflict markers.
11758 EXPECT_EQ("int a;\n"
11759 "void f() {\n"
11760 " callme(some(parameter1,\n"
11761 "<<<<<<< text by the vcs\n"
11762 " parameter2),\n"
11763 "||||||| text by the vcs\n"
11764 " parameter2),\n"
11765 " parameter3,\n"
11766 "======= text by the vcs\n"
11767 " parameter2, parameter3),\n"
11768 ">>>>>>> text by the vcs\n"
11769 " otherparameter);\n",
11770 format("int a;\n"
11771 "void f() {\n"
11772 " callme(some(parameter1,\n"
11773 "<<<<<<< text by the vcs\n"
11774 " parameter2),\n"
11775 "||||||| text by the vcs\n"
11776 " parameter2),\n"
11777 " parameter3,\n"
11778 "======= text by the vcs\n"
11779 " parameter2,\n"
11780 " parameter3),\n"
11781 ">>>>>>> text by the vcs\n"
11782 " otherparameter);\n"));
11783
11784 // Perforce markers.
11785 EXPECT_EQ("void f() {\n"
11786 " function(\n"
11787 ">>>> text by the vcs\n"
11788 " parameter,\n"
11789 "==== text by the vcs\n"
11790 " parameter,\n"
11791 "==== text by the vcs\n"
11792 " parameter,\n"
11793 "<<<< text by the vcs\n"
11794 " parameter);\n",
11795 format("void f() {\n"
11796 " function(\n"
11797 ">>>> text by the vcs\n"
11798 " parameter,\n"
11799 "==== text by the vcs\n"
11800 " parameter,\n"
11801 "==== text by the vcs\n"
11802 " parameter,\n"
11803 "<<<< text by the vcs\n"
11804 " parameter);\n"));
11805
11806 EXPECT_EQ("<<<<<<<\n"
11807 "|||||||\n"
11808 "=======\n"
11809 ">>>>>>>",
11810 format("<<<<<<<\n"
11811 "|||||||\n"
11812 "=======\n"
11813 ">>>>>>>"));
11814
11815 EXPECT_EQ("<<<<<<<\n"
11816 "|||||||\n"
11817 "int i;\n"
11818 "=======\n"
11819 ">>>>>>>",
11820 format("<<<<<<<\n"
11821 "|||||||\n"
11822 "int i;\n"
11823 "=======\n"
11824 ">>>>>>>"));
11825
11826 // FIXME: Handle parsing of macros around conflict markers correctly:
11827 EXPECT_EQ("#define Macro \\\n"
11828 "<<<<<<<\n"
11829 "Something \\\n"
11830 "|||||||\n"
11831 "Else \\\n"
11832 "=======\n"
11833 "Other \\\n"
11834 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011835 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011836 format("#define Macro \\\n"
11837 "<<<<<<<\n"
11838 " Something \\\n"
11839 "|||||||\n"
11840 " Else \\\n"
11841 "=======\n"
11842 " Other \\\n"
11843 ">>>>>>>\n"
11844 " End\n"
11845 "int i;\n"));
11846}
11847
Daniel Jasper471894432014-08-06 13:40:26 +000011848TEST_F(FormatTest, DisableRegions) {
11849 EXPECT_EQ("int i;\n"
11850 "// clang-format off\n"
11851 " int j;\n"
11852 "// clang-format on\n"
11853 "int k;",
11854 format(" int i;\n"
11855 " // clang-format off\n"
11856 " int j;\n"
11857 " // clang-format on\n"
11858 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011859 EXPECT_EQ("int i;\n"
11860 "/* clang-format off */\n"
11861 " int j;\n"
11862 "/* clang-format on */\n"
11863 "int k;",
11864 format(" int i;\n"
11865 " /* clang-format off */\n"
11866 " int j;\n"
11867 " /* clang-format on */\n"
11868 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011869
11870 // Don't reflow comments within disabled regions.
11871 EXPECT_EQ(
11872 "// clang-format off\n"
11873 "// long long long long long long line\n"
11874 "/* clang-format on */\n"
11875 "/* long long long\n"
11876 " * long long long\n"
11877 " * line */\n"
11878 "int i;\n"
11879 "/* clang-format off */\n"
11880 "/* long long long long long long line */\n",
11881 format("// clang-format off\n"
11882 "// long long long long long long line\n"
11883 "/* clang-format on */\n"
11884 "/* long long long long long long line */\n"
11885 "int i;\n"
11886 "/* clang-format off */\n"
11887 "/* long long long long long long line */\n",
11888 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011889}
11890
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011891TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11892 format("? ) =");
11893 verifyNoCrash("#define a\\\n /**/}");
11894}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011895
Daniel Jasper498f5582015-12-25 08:53:31 +000011896TEST_F(FormatTest, FormatsTableGenCode) {
11897 FormatStyle Style = getLLVMStyle();
11898 Style.Language = FormatStyle::LK_TableGen;
11899 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11900}
11901
Nico Weberb2673a12016-11-10 21:49:25 +000011902TEST_F(FormatTest, ArrayOfTemplates) {
11903 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11904 format("auto a = new unique_ptr<int > [ 10];"));
11905
11906 FormatStyle Spaces = getLLVMStyle();
11907 Spaces.SpacesInSquareBrackets = true;
11908 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11909 format("auto a = new unique_ptr<int > [10];", Spaces));
11910}
11911
11912TEST_F(FormatTest, ArrayAsTemplateType) {
11913 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11914 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11915
11916 FormatStyle Spaces = getLLVMStyle();
11917 Spaces.SpacesInSquareBrackets = true;
11918 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11919 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11920}
11921
Martin Probstc9c51c42017-03-16 10:21:35 +000011922TEST_F(FormatTest, NoSpaceAfterSuper) {
11923 verifyFormat("__super::FooBar();");
11924}
11925
Ben Hamilton07e58362018-02-21 21:27:27 +000011926TEST(FormatStyle, GetStyleWithEmptyFileName) {
Bjorn Pettersson0b2f7742018-02-26 14:14:11 +000011927 vfs::InMemoryFileSystem FS;
11928 auto Style1 = getStyle("file", "", "Google", "", &FS);
Ben Hamilton07e58362018-02-21 21:27:27 +000011929 ASSERT_TRUE((bool)Style1);
11930 ASSERT_EQ(*Style1, getGoogleStyle());
11931}
11932
Eric Liu547d8792016-03-24 13:22:42 +000011933TEST(FormatStyle, GetStyleOfFile) {
11934 vfs::InMemoryFileSystem FS;
11935 // Test 1: format file in the same directory.
11936 ASSERT_TRUE(
11937 FS.addFile("/a/.clang-format", 0,
11938 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11939 ASSERT_TRUE(
11940 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011941 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011942 ASSERT_TRUE((bool)Style1);
11943 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011944
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011945 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011946 ASSERT_TRUE(
11947 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011948 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011949 ASSERT_TRUE((bool)Style2);
11950 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011951
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011952 // Test 2.2: no format on 'none' fallback style.
11953 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11954 ASSERT_TRUE((bool)Style2);
11955 ASSERT_EQ(*Style2, getNoStyle());
11956
11957 // Test 2.3: format if config is found with no based style while fallback is
11958 // 'none'.
11959 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11960 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11961 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11962 ASSERT_TRUE((bool)Style2);
11963 ASSERT_EQ(*Style2, getLLVMStyle());
11964
11965 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11966 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11967 ASSERT_TRUE((bool)Style2);
11968 ASSERT_EQ(*Style2, getLLVMStyle());
11969
Eric Liu547d8792016-03-24 13:22:42 +000011970 // Test 3: format file in parent directory.
11971 ASSERT_TRUE(
11972 FS.addFile("/c/.clang-format", 0,
11973 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11974 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11975 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011976 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011977 ASSERT_TRUE((bool)Style3);
11978 ASSERT_EQ(*Style3, getGoogleStyle());
11979
11980 // Test 4: error on invalid fallback style
11981 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11982 ASSERT_FALSE((bool)Style4);
11983 llvm::consumeError(Style4.takeError());
11984
11985 // Test 5: error on invalid yaml on command line
11986 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11987 ASSERT_FALSE((bool)Style5);
11988 llvm::consumeError(Style5.takeError());
11989
11990 // Test 6: error on invalid style
11991 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11992 ASSERT_FALSE((bool)Style6);
11993 llvm::consumeError(Style6.takeError());
11994
11995 // Test 7: found config file, error on parsing it
11996 ASSERT_TRUE(
11997 FS.addFile("/d/.clang-format", 0,
11998 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11999 "InvalidKey: InvalidValue")));
12000 ASSERT_TRUE(
12001 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
12002 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
12003 ASSERT_FALSE((bool)Style7);
12004 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000012005}
12006
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012007TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
12008 // Column limit is 20.
12009 std::string Code = "Type *a =\n"
12010 " new Type();\n"
12011 "g(iiiii, 0, jjjjj,\n"
12012 " 0, kkkkk, 0, mm);\n"
12013 "int bad = format ;";
12014 std::string Expected = "auto a = new Type();\n"
12015 "g(iiiii, nullptr,\n"
12016 " jjjjj, nullptr,\n"
12017 " kkkkk, nullptr,\n"
12018 " mm);\n"
12019 "int bad = format ;";
12020 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000012021 tooling::Replacements Replaces = toReplacements(
12022 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
12023 "auto "),
12024 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
12025 "nullptr"),
12026 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
12027 "nullptr"),
12028 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
12029 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012030
12031 format::FormatStyle Style = format::getLLVMStyle();
12032 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000012033 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
12034 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
12035 << llvm::toString(FormattedReplaces.takeError()) << "\n";
12036 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12037 EXPECT_TRUE(static_cast<bool>(Result));
12038 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012039}
12040
Eric Liubaf58c22016-05-18 13:43:48 +000012041TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
12042 std::string Code = "#include \"a.h\"\n"
12043 "#include \"c.h\"\n"
12044 "\n"
12045 "int main() {\n"
12046 " return 0;\n"
12047 "}";
12048 std::string Expected = "#include \"a.h\"\n"
12049 "#include \"b.h\"\n"
12050 "#include \"c.h\"\n"
12051 "\n"
12052 "int main() {\n"
12053 " return 0;\n"
12054 "}";
12055 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000012056 tooling::Replacements Replaces = toReplacements(
12057 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
12058 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000012059
12060 format::FormatStyle Style = format::getLLVMStyle();
12061 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000012062 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
12063 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
12064 << llvm::toString(FormattedReplaces.takeError()) << "\n";
12065 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12066 EXPECT_TRUE(static_cast<bool>(Result));
12067 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000012068}
12069
Krasimir Georgievac16a202017-06-23 11:46:03 +000012070TEST_F(FormatTest, FormatSortsUsingDeclarations) {
12071 EXPECT_EQ("using std::cin;\n"
12072 "using std::cout;",
12073 format("using std::cout;\n"
12074 "using std::cin;", getGoogleStyle()));
12075}
12076
Nico Weberdc065182017-04-05 18:10:42 +000012077TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
12078 format::FormatStyle Style = format::getLLVMStyle();
12079 Style.Standard = FormatStyle::LS_Cpp03;
12080 // cpp03 recognize this string as identifier u8 and literal character 'a'
12081 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
12082}
12083
12084TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
12085 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
12086 // all modes, including C++11, C++14 and C++17
12087 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
12088}
12089
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000012090TEST_F(FormatTest, DoNotFormatLikelyXml) {
12091 EXPECT_EQ("<!-- ;> -->",
12092 format("<!-- ;> -->", getGoogleStyle()));
12093 EXPECT_EQ(" <!-- >; -->",
12094 format(" <!-- >; -->", getGoogleStyle()));
12095}
12096
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012097TEST_F(FormatTest, StructuredBindings) {
12098 // Structured bindings is a C++17 feature.
12099 // all modes, including C++11, C++14 and C++17
12100 verifyFormat("auto [a, b] = f();");
12101 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
12102 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();"));
12103 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();"));
12104 EXPECT_EQ("auto const volatile [a, b] = f();",
12105 format("auto const volatile[a, b] = f();"));
12106 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012107 EXPECT_EQ("auto &[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012108 format("auto &[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012109 EXPECT_EQ("auto &&[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012110 format("auto &&[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012111 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();"));
12112 EXPECT_EQ("auto const volatile &&[a, b] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012113 format("auto const volatile &&[a, b] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012114 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();"));
12115 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();"));
12116 EXPECT_EQ("const auto volatile &&[a, b] = f();",
12117 format("const auto volatile &&[a, b] = f();"));
12118 EXPECT_EQ("volatile const auto &&[a, b] = f();",
12119 format("volatile const auto &&[a, b] = f();"));
12120 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();"));
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012121
Manuel Klimeke411aa82017-09-20 09:29:37 +000012122 // Make sure we don't mistake structured bindings for lambdas.
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012123 FormatStyle PointerMiddle = getLLVMStyle();
12124 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
12125 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
12126 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
12127 verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
12128 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
12129 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
12130 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
12131 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
12132 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
12133 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
12134 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
12135 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
12136 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
12137
12138 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
12139 format("for (const auto && [a, b] : some_range) {\n}"));
12140 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
12141 format("for (const auto & [a, b] : some_range) {\n}"));
12142 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
12143 format("for (const auto[a, b] : some_range) {\n}"));
12144 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);"));
12145 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);"));
12146 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);"));
12147 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);"));
12148 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);"));
12149 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};"));
12150 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};"));
12151 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};"));
Manuel Klimeke411aa82017-09-20 09:29:37 +000012152
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012153 format::FormatStyle Spaces = format::getLLVMStyle();
12154 Spaces.SpacesInSquareBrackets = true;
12155 verifyFormat("auto [ a, b ] = f();", Spaces);
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012156 verifyFormat("auto &&[ a, b ] = f();", Spaces);
12157 verifyFormat("auto &[ a, b ] = f();", Spaces);
12158 verifyFormat("auto const &&[ a, b ] = f();", Spaces);
12159 verifyFormat("auto const &[ a, b ] = f();", Spaces);
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012160}
12161
Ben Hamilton6e066352018-02-27 15:56:40 +000012162TEST_F(FormatTest, FileAndCode) {
12163 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
12164 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
12165 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
12166 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
12167 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
Ben Hamiltonb1a79192018-04-12 15:11:53 +000012168 EXPECT_EQ(
12169 FormatStyle::LK_ObjC,
12170 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
12171 EXPECT_EQ(FormatStyle::LK_ObjC,
12172 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
12173 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
Ben Hamilton6e066352018-02-27 15:56:40 +000012174 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
12175 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
Ben Hamilton19c782d2018-03-22 03:25:22 +000012176 EXPECT_EQ(FormatStyle::LK_ObjC,
12177 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
12178 EXPECT_EQ(
12179 FormatStyle::LK_ObjC,
12180 guessLanguage("foo.h",
12181 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
Ben Hamilton9dc78162018-04-03 14:07:11 +000012182 EXPECT_EQ(
12183 FormatStyle::LK_Cpp,
12184 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
Ben Hamilton3b345c32018-02-21 15:54:31 +000012185}
12186
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012187TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
12188 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
12189 EXPECT_EQ(FormatStyle::LK_ObjC,
12190 guessLanguage("foo.h", "array[[calculator getIndex]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012191 EXPECT_EQ(FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012192 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012193 EXPECT_EQ(
12194 FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012195 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
12196 EXPECT_EQ(FormatStyle::LK_ObjC,
12197 guessLanguage("foo.h", "[[noreturn foo] bar];"));
12198 EXPECT_EQ(FormatStyle::LK_Cpp,
12199 guessLanguage("foo.h", "[[clang::fallthrough]];"));
12200 EXPECT_EQ(FormatStyle::LK_ObjC,
12201 guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
12202 EXPECT_EQ(FormatStyle::LK_Cpp,
12203 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
12204 EXPECT_EQ(FormatStyle::LK_Cpp,
12205 guessLanguage("foo.h", "[[using clang: fallthrough]];"));
12206 EXPECT_EQ(FormatStyle::LK_ObjC,
12207 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
12208 EXPECT_EQ(FormatStyle::LK_Cpp,
12209 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
12210 EXPECT_EQ(
12211 FormatStyle::LK_Cpp,
12212 guessLanguage("foo.h",
12213 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
12214 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012215}
12216
Ben Hamilton788a2222018-03-12 15:42:40 +000012217TEST_F(FormatTest, GuessLanguageWithCaret) {
12218 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
12219 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
12220 EXPECT_EQ(FormatStyle::LK_ObjC,
12221 guessLanguage("foo.h", "int(^)(char, float);"));
12222 EXPECT_EQ(FormatStyle::LK_ObjC,
12223 guessLanguage("foo.h", "int(^foo)(char, float);"));
12224 EXPECT_EQ(FormatStyle::LK_ObjC,
12225 guessLanguage("foo.h", "int(^foo[10])(char, float);"));
12226 EXPECT_EQ(FormatStyle::LK_ObjC,
12227 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
12228 EXPECT_EQ(
12229 FormatStyle::LK_ObjC,
12230 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
12231}
12232
Ben Hamilton6432afe2018-03-22 17:37:19 +000012233TEST_F(FormatTest, GuessLanguageWithChildLines) {
12234 EXPECT_EQ(FormatStyle::LK_Cpp,
12235 guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
12236 EXPECT_EQ(FormatStyle::LK_ObjC,
12237 guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
Ben Hamiltonea7a27b2018-03-27 15:01:21 +000012238 EXPECT_EQ(
12239 FormatStyle::LK_Cpp,
12240 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
12241 EXPECT_EQ(
12242 FormatStyle::LK_ObjC,
12243 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
Ben Hamilton6432afe2018-03-22 17:37:19 +000012244}
12245
Daniel Jasperd246a5a2015-06-15 15:25:11 +000012246} // end namespace
12247} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000012248} // end namespace clang