blob: 635a34499da6a455cd2fbe621c37b9b776d05bde [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()));
Sam McCall6f3778c2018-09-05 07:44:02 +0000203 EXPECT_EQ("/* something */ namespace N {\n"
204 "\n"
205 "int i;\n"
206 "}",
207 format("/* something */ namespace N {\n"
208 "\n"
209 "int i;\n"
210 "}",
211 getGoogleStyle()));
212 EXPECT_EQ("inline namespace N {\n"
213 "\n"
214 "int i;\n"
215 "}",
216 format("inline namespace N {\n"
217 "\n"
218 "int i;\n"
219 "}",
220 getGoogleStyle()));
221 EXPECT_EQ("/* something */ inline namespace N {\n"
222 "\n"
223 "int i;\n"
224 "}",
225 format("/* something */ inline namespace N {\n"
226 "\n"
227 "int i;\n"
228 "}",
229 getGoogleStyle()));
230 EXPECT_EQ("export namespace N {\n"
231 "\n"
232 "int i;\n"
233 "}",
234 format("export namespace N {\n"
235 "\n"
236 "int i;\n"
237 "}",
238 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000239 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
240 "\n"
241 "int i;\n"
242 "}",
243 format("extern /**/ \"C\" /**/ {\n"
244 "\n"
245 "int i;\n"
246 "}",
247 getGoogleStyle()));
248
249 // ...but do keep inlining and removing empty lines for non-block extern "C"
250 // functions.
251 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
252 EXPECT_EQ("extern \"C\" int f() {\n"
253 " int i = 42;\n"
254 " return i;\n"
255 "}",
256 format("extern \"C\" int f() {\n"
257 "\n"
258 " int i = 42;\n"
259 " return i;\n"
260 "}",
261 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000262
Daniel Jasper11164bd2014-03-21 12:58:53 +0000263 // Remove empty lines at the beginning and end of blocks.
264 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000265 "\n"
266 " if (a) {\n"
267 "\n"
268 " f();\n"
269 " }\n"
270 "}",
271 format("void f() {\n"
272 "\n"
273 " if (a) {\n"
274 "\n"
275 " f();\n"
276 "\n"
277 " }\n"
278 "\n"
279 "}",
280 getLLVMStyle()));
281 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000282 " if (a) {\n"
283 " f();\n"
284 " }\n"
285 "}",
286 format("void f() {\n"
287 "\n"
288 " if (a) {\n"
289 "\n"
290 " f();\n"
291 "\n"
292 " }\n"
293 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000294 "}",
295 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000296
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000297 // Don't remove empty lines in more complex control statements.
298 EXPECT_EQ("void f() {\n"
299 " if (a) {\n"
300 " f();\n"
301 "\n"
302 " } else if (b) {\n"
303 " f();\n"
304 " }\n"
305 "}",
306 format("void f() {\n"
307 " if (a) {\n"
308 " f();\n"
309 "\n"
310 " } else if (b) {\n"
311 " f();\n"
312 "\n"
313 " }\n"
314 "\n"
315 "}"));
316
Krasimir Georgiev62103052018-04-19 13:02:15 +0000317 // Don't remove empty lines before namespace endings.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000318 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
319 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000320 EXPECT_EQ("namespace {\n"
321 "int i;\n"
Krasimir Georgiev62103052018-04-19 13:02:15 +0000322 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000323 "}",
324 format("namespace {\n"
325 "int i;\n"
326 "\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000327 "}", LLVMWithNoNamespaceFix));
328 EXPECT_EQ("namespace {\n"
329 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000330 "}",
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000331 format("namespace {\n"
332 "int i;\n"
Krasimir Georgiev62103052018-04-19 13:02:15 +0000333 "}", LLVMWithNoNamespaceFix));
334 EXPECT_EQ("namespace {\n"
335 "int i;\n"
336 "\n"
337 "};",
338 format("namespace {\n"
339 "int i;\n"
340 "\n"
341 "};", LLVMWithNoNamespaceFix));
342 EXPECT_EQ("namespace {\n"
343 "int i;\n"
344 "};",
345 format("namespace {\n"
346 "int i;\n"
347 "};", LLVMWithNoNamespaceFix));
348 EXPECT_EQ("namespace {\n"
349 "int i;\n"
350 "\n"
351 "}",
352 format("namespace {\n"
353 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000354 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000355 "}"));
356 EXPECT_EQ("namespace {\n"
357 "int i;\n"
Krasimir Georgiev03e69f52018-03-27 13:14:29 +0000358 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000359 "} // namespace",
360 format("namespace {\n"
361 "int i;\n"
362 "\n"
363 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000364
365 FormatStyle Style = getLLVMStyle();
366 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
367 Style.MaxEmptyLinesToKeep = 2;
368 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
369 Style.BraceWrapping.AfterClass = true;
370 Style.BraceWrapping.AfterFunction = true;
371 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
372
373 EXPECT_EQ("class Foo\n"
374 "{\n"
375 " Foo() {}\n"
376 "\n"
377 " void funk() {}\n"
378 "};",
379 format("class Foo\n"
380 "{\n"
381 " Foo()\n"
382 " {\n"
383 " }\n"
384 "\n"
385 " void funk() {}\n"
386 "};",
387 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000388}
389
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000390TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000391 verifyFormat("x = (a) and (b);");
392 verifyFormat("x = (a) or (b);");
393 verifyFormat("x = (a) bitand (b);");
394 verifyFormat("x = (a) bitor (b);");
395 verifyFormat("x = (a) not_eq (b);");
396 verifyFormat("x = (a) and_eq (b);");
397 verifyFormat("x = (a) or_eq (b);");
398 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000399}
400
Olivier Goffart90f981b2017-07-14 09:23:40 +0000401TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) {
402 verifyFormat("x = compl(a);");
403 verifyFormat("x = not(a);");
404 verifyFormat("x = bitand(a);");
405 // Unary operator must not be merged with the next identifier
406 verifyFormat("x = compl a;");
407 verifyFormat("x = not a;");
408 verifyFormat("x = bitand a;");
409}
410
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000411//===----------------------------------------------------------------------===//
412// Tests for control statements.
413//===----------------------------------------------------------------------===//
414
Daniel Jaspercdd06622013-05-14 10:31:09 +0000415TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000416 verifyFormat("if (true)\n f();\ng();");
417 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000418 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000419 verifyFormat("if constexpr (true)\n"
420 " f();\ng();");
421 verifyFormat("if constexpr (a)\n"
422 " if constexpr (b)\n"
423 " if constexpr (c)\n"
424 " g();\n"
425 "h();");
426 verifyFormat("if constexpr (a)\n"
427 " if constexpr (b) {\n"
428 " f();\n"
429 " }\n"
430 "g();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000431
Daniel Jasper3a685df2013-05-16 12:12:21 +0000432 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +0000433 AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jasperced17f82013-01-16 15:44:34 +0000434 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
435 verifyFormat("if (a)\n"
436 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000437 " f();",
438 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000439 verifyFormat("{\n"
440 " if (a)\n"
441 " label:\n"
442 " f();\n"
443 "}",
444 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000445 verifyFormat("#define A \\\n"
446 " if (a) \\\n"
447 " label: \\\n"
448 " f()",
449 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000450 verifyFormat("if (a)\n"
451 " ;",
452 AllowsMergedIf);
453 verifyFormat("if (a)\n"
454 " if (b) return;",
455 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000456
Daniel Jasper3a685df2013-05-16 12:12:21 +0000457 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000458 " f();\n",
459 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000460 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000461 " f();",
462 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000463 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000464 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000465 "}",
466 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000467 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000468 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000469 "}",
470 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000471
472 AllowsMergedIf.ColumnLimit = 14;
473 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000474 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000475 " return;",
476 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000477
478 AllowsMergedIf.ColumnLimit = 13;
479 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000480}
481
Daniel Jasper3a685df2013-05-16 12:12:21 +0000482TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
483 FormatStyle AllowsMergedLoops = getLLVMStyle();
484 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
485 verifyFormat("while (true) continue;", AllowsMergedLoops);
486 verifyFormat("for (;;) continue;", AllowsMergedLoops);
487 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
488 verifyFormat("while (true)\n"
489 " ;",
490 AllowsMergedLoops);
491 verifyFormat("for (;;)\n"
492 " ;",
493 AllowsMergedLoops);
494 verifyFormat("for (;;)\n"
495 " for (;;) continue;",
496 AllowsMergedLoops);
497 verifyFormat("for (;;) // Can't merge this\n"
498 " continue;",
499 AllowsMergedLoops);
500 verifyFormat("for (;;) /* still don't merge */\n"
501 " continue;",
502 AllowsMergedLoops);
503}
504
Daniel Jasper17605d32014-05-14 09:33:35 +0000505TEST_F(FormatTest, FormatShortBracedStatements) {
506 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000507 AllowSimpleBracedStatements.ColumnLimit = 40;
Daniel Jasper17605d32014-05-14 09:33:35 +0000508 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
509
510 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
511 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
512
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000513 AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom;
514 AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true;
515 AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false;
516
Daniel Jasper17605d32014-05-14 09:33:35 +0000517 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000518 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000519 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
520 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
521 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000522 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000523 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
524 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000525 verifyFormat("if (true) {\n"
526 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
527 "}",
528 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000529 verifyFormat("if (true) { //\n"
530 " f();\n"
531 "}",
532 AllowSimpleBracedStatements);
533 verifyFormat("if (true) {\n"
534 " f();\n"
535 " f();\n"
536 "}",
537 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000538 verifyFormat("if (true) {\n"
539 " f();\n"
540 "} else {\n"
541 " f();\n"
542 "}",
543 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000544
Daniel Jasperf92659e2017-06-19 07:45:41 +0000545 verifyFormat("struct A2 {\n"
546 " int X;\n"
547 "};",
548 AllowSimpleBracedStatements);
549 verifyFormat("typedef struct A2 {\n"
550 " int X;\n"
551 "} A2_t;",
552 AllowSimpleBracedStatements);
Daniel Jasperbd630732014-05-22 13:25:26 +0000553 verifyFormat("template <int> struct A2 {\n"
554 " struct B {};\n"
555 "};",
556 AllowSimpleBracedStatements);
557
Daniel Jasper17605d32014-05-14 09:33:35 +0000558 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000559 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000560 verifyFormat("if (true) {\n"
561 " f();\n"
562 "}",
563 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000564 verifyFormat("if (true) {\n"
565 " f();\n"
566 "} else {\n"
567 " f();\n"
568 "}",
569 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000570
571 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000572 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000573 verifyFormat("while (true) {\n"
574 " f();\n"
575 "}",
576 AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000577 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000578 verifyFormat("for (;;) {\n"
579 " f();\n"
580 "}",
581 AllowSimpleBracedStatements);
Krasimir Georgiev3b0b50b2017-09-11 10:12:16 +0000582
583 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
584 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
585 AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = true;
586
587 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
588 verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
589 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
590 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
591 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
592 verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
593 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
594 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
595 verifyFormat("if (true)\n"
596 "{\n"
597 " ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
598 "}",
599 AllowSimpleBracedStatements);
600 verifyFormat("if (true)\n"
601 "{ //\n"
602 " f();\n"
603 "}",
604 AllowSimpleBracedStatements);
605 verifyFormat("if (true)\n"
606 "{\n"
607 " f();\n"
608 " f();\n"
609 "}",
610 AllowSimpleBracedStatements);
611 verifyFormat("if (true)\n"
612 "{\n"
613 " f();\n"
614 "} else\n"
615 "{\n"
616 " f();\n"
617 "}",
618 AllowSimpleBracedStatements);
619
620 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
621 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
622 verifyFormat("if (true)\n"
623 "{\n"
624 " f();\n"
625 "}",
626 AllowSimpleBracedStatements);
627 verifyFormat("if (true)\n"
628 "{\n"
629 " f();\n"
630 "} else\n"
631 "{\n"
632 " f();\n"
633 "}",
634 AllowSimpleBracedStatements);
635
636 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
637 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
638 verifyFormat("while (true)\n"
639 "{\n"
640 " f();\n"
641 "}",
642 AllowSimpleBracedStatements);
643 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
644 verifyFormat("for (;;)\n"
645 "{\n"
646 " f();\n"
647 "}",
648 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000649}
650
Krasimir Georgievbf4cdda2018-01-19 16:12:37 +0000651TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) {
652 FormatStyle Style = getLLVMStyleWithColumns(60);
653 Style.AllowShortBlocksOnASingleLine = true;
654 Style.AllowShortIfStatementsOnASingleLine = true;
655 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
656 EXPECT_EQ("#define A \\\n"
657 " if (HANDLEwernufrnuLwrmviferuvnierv) \\\n"
658 " { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n"
659 "X;",
660 format("#define A \\\n"
661 " if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n"
662 " RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n"
663 " }\n"
664 "X;",
665 Style));
666}
667
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000668TEST_F(FormatTest, ParseIfElse) {
669 verifyFormat("if (true)\n"
670 " if (true)\n"
671 " if (true)\n"
672 " f();\n"
673 " else\n"
674 " g();\n"
675 " else\n"
676 " h();\n"
677 "else\n"
678 " i();");
679 verifyFormat("if (true)\n"
680 " if (true)\n"
681 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000682 " if (true)\n"
683 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000684 " } else {\n"
685 " g();\n"
686 " }\n"
687 " else\n"
688 " h();\n"
689 "else {\n"
690 " i();\n"
691 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000692 verifyFormat("if (true)\n"
693 " if constexpr (true)\n"
694 " if (true) {\n"
695 " if constexpr (true)\n"
696 " f();\n"
697 " } else {\n"
698 " g();\n"
699 " }\n"
700 " else\n"
701 " h();\n"
702 "else {\n"
703 " i();\n"
704 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000705 verifyFormat("void f() {\n"
706 " if (a) {\n"
707 " } else {\n"
708 " }\n"
709 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000710}
711
712TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000713 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000714 verifyFormat("if (a)\n"
715 " f();\n"
716 "else if (b)\n"
717 " g();\n"
718 "else\n"
719 " h();");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000720 verifyFormat("if constexpr (a)\n"
721 " f();\n"
722 "else if constexpr (b)\n"
723 " g();\n"
724 "else\n"
725 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000726 verifyFormat("if (a) {\n"
727 " f();\n"
728 "}\n"
729 "// or else ..\n"
730 "else {\n"
731 " g()\n"
732 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000733
734 verifyFormat("if (a) {\n"
735 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
736 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
737 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000738 verifyFormat("if (a) {\n"
739 "} else if (\n"
740 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
741 "}",
742 getLLVMStyleWithColumns(62));
Daniel Jasper6a7d5a72017-06-19 07:40:49 +0000743 verifyFormat("if (a) {\n"
744 "} else if constexpr (\n"
745 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
746 "}",
747 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000748}
749
Daniel Jasperf7935112012-12-03 18:12:45 +0000750TEST_F(FormatTest, FormatsForLoop) {
751 verifyFormat(
752 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000753 " ++VeryVeryLongLoopVariable)\n"
754 " ;");
755 verifyFormat("for (;;)\n"
756 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000757 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000758 verifyFormat("for (;;) {\n"
759 " f();\n"
760 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000761 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000762
763 verifyFormat(
764 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
765 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000766 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000767
768 verifyFormat(
769 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000770 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000771 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
772 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000773 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000774 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
775 " I = FD->getDeclsInPrototypeScope().begin(),\n"
776 " E = FD->getDeclsInPrototypeScope().end();\n"
777 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000778 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
779 " I = Container.begin(),\n"
780 " E = Container.end();\n"
781 " I != E; ++I) {\n}",
782 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000783
Daniel Jasper48c62f92013-01-28 17:30:17 +0000784 verifyFormat(
785 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
786 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000787 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
788 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000789 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000790 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
791 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
792 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000793 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
794 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
795 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000796 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
797 " aaaaaaaaaa);\n"
798 " iter; ++iter) {\n"
799 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000800 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
801 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
802 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
803 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000804
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +0000805 // These should not be formatted as Objective-C for-in loops.
806 verifyFormat("for (Foo *x = 0; x != in; x++) {\n}");
807 verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}");
808 verifyFormat("Foo *x;\nfor (x in y) {\n}");
809 verifyFormat("for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}");
810
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000811 FormatStyle NoBinPacking = getLLVMStyle();
812 NoBinPacking.BinPackParameters = false;
813 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
814 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
815 " aaaaaaaaaaaaaaaa,\n"
816 " aaaaaaaaaaaaaaaa,\n"
817 " aaaaaaaaaaaaaaaa);\n"
818 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
819 "}",
820 NoBinPacking);
821 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000822 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
823 " E = UnwrappedLines.end();\n"
824 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000825 " ++I) {\n}",
826 NoBinPacking);
Daniel Jasper7b85a192017-09-03 08:56:24 +0000827
828 FormatStyle AlignLeft = getLLVMStyle();
829 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
830 verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
Daniel Jasperf7935112012-12-03 18:12:45 +0000831}
832
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000833TEST_F(FormatTest, RangeBasedForLoops) {
834 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
835 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
836 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
837 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000838 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
839 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000840 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
841 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000842}
843
Daniel Jaspere1e43192014-04-01 12:55:11 +0000844TEST_F(FormatTest, ForEachLoops) {
845 verifyFormat("void f() {\n"
846 " foreach (Item *item, itemlist) {}\n"
847 " Q_FOREACH (Item *item, itemlist) {}\n"
848 " BOOST_FOREACH (Item *item, itemlist) {}\n"
849 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
850 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000851
852 // As function-like macros.
853 verifyFormat("#define foreach(x, y)\n"
854 "#define Q_FOREACH(x, y)\n"
855 "#define BOOST_FOREACH(x, y)\n"
856 "#define UNKNOWN_FOREACH(x, y)\n");
857
858 // Not as function-like macros.
859 verifyFormat("#define foreach (x, y)\n"
860 "#define Q_FOREACH (x, y)\n"
861 "#define BOOST_FOREACH (x, y)\n"
862 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000863}
864
Daniel Jasperf7935112012-12-03 18:12:45 +0000865TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000866 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000867 verifyFormat("while (true)\n"
868 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000869 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000870 verifyFormat("while () {\n"
871 " f();\n"
872 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000873}
874
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000875TEST_F(FormatTest, FormatsDoWhile) {
876 verifyFormat("do {\n"
877 " do_something();\n"
878 "} while (something());");
879 verifyFormat("do\n"
880 " do_something();\n"
881 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000882}
883
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000884TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000885 verifyFormat("switch (x) {\n"
886 "case 1:\n"
887 " f();\n"
888 " break;\n"
889 "case kFoo:\n"
890 "case ns::kBar:\n"
891 "case kBaz:\n"
892 " break;\n"
893 "default:\n"
894 " g();\n"
895 " break;\n"
896 "}");
897 verifyFormat("switch (x) {\n"
898 "case 1: {\n"
899 " f();\n"
900 " break;\n"
901 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000902 "case 2: {\n"
903 " break;\n"
904 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000905 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000906 verifyFormat("switch (x) {\n"
907 "case 1: {\n"
908 " f();\n"
909 " {\n"
910 " g();\n"
911 " h();\n"
912 " }\n"
913 " break;\n"
914 "}\n"
915 "}");
916 verifyFormat("switch (x) {\n"
917 "case 1: {\n"
918 " f();\n"
919 " if (foo) {\n"
920 " g();\n"
921 " h();\n"
922 " }\n"
923 " break;\n"
924 "}\n"
925 "}");
926 verifyFormat("switch (x) {\n"
927 "case 1: {\n"
928 " f();\n"
929 " g();\n"
930 "} break;\n"
931 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000932 verifyFormat("switch (test)\n"
933 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000934 verifyFormat("switch (x) {\n"
935 "default: {\n"
936 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000937 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000938 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000939 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000940 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000941 "// if 1, do f()\n"
942 "case 1:\n"
943 " f();\n"
944 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000945 verifyFormat("switch (x) {\n"
946 "case 1:\n"
947 " // Do amazing stuff\n"
948 " {\n"
949 " f();\n"
950 " g();\n"
951 " }\n"
952 " break;\n"
953 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000954 verifyFormat("#define A \\\n"
955 " switch (x) { \\\n"
956 " case a: \\\n"
957 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000958 " }",
959 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000960 verifyFormat("#define OPERATION_CASE(name) \\\n"
961 " case OP_name: \\\n"
962 " return operations::Operation##name\n",
963 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000964 verifyFormat("switch (x) {\n"
965 "case 1:;\n"
966 "default:;\n"
967 " int i;\n"
968 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000969
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000970 verifyGoogleFormat("switch (x) {\n"
971 " case 1:\n"
972 " f();\n"
973 " break;\n"
974 " case kFoo:\n"
975 " case ns::kBar:\n"
976 " case kBaz:\n"
977 " break;\n"
978 " default:\n"
979 " g();\n"
980 " break;\n"
981 "}");
982 verifyGoogleFormat("switch (x) {\n"
983 " case 1: {\n"
984 " f();\n"
985 " break;\n"
986 " }\n"
987 "}");
988 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000989 " ;");
990
991 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
992 " case OP_name: \\\n"
993 " return operations::Operation##name\n");
994 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
995 " // Get the correction operation class.\n"
996 " switch (OpCode) {\n"
997 " CASE(Add);\n"
998 " CASE(Subtract);\n"
999 " default:\n"
1000 " return operations::Unknown;\n"
1001 " }\n"
1002 "#undef OPERATION_CASE\n"
1003 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00001004 verifyFormat("DEBUG({\n"
1005 " switch (x) {\n"
1006 " case A:\n"
1007 " f();\n"
1008 " break;\n"
Krasimir Georgieve0926342017-07-12 15:21:43 +00001009 " // fallthrough\n"
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00001010 " case B:\n"
1011 " g();\n"
1012 " break;\n"
1013 " }\n"
1014 "});");
Krasimir Georgieve0926342017-07-12 15:21:43 +00001015 EXPECT_EQ("DEBUG({\n"
1016 " switch (x) {\n"
1017 " case A:\n"
1018 " f();\n"
1019 " break;\n"
1020 " // On B:\n"
1021 " case B:\n"
1022 " g();\n"
1023 " break;\n"
1024 " }\n"
1025 "});",
1026 format("DEBUG({\n"
1027 " switch (x) {\n"
1028 " case A:\n"
1029 " f();\n"
1030 " break;\n"
1031 " // On B:\n"
1032 " case B:\n"
1033 " g();\n"
1034 " break;\n"
1035 " }\n"
1036 "});",
1037 getLLVMStyle()));
Jonas Toth81b61a82018-09-02 09:04:51 +00001038 EXPECT_EQ("switch (n) {\n"
1039 "case 0: {\n"
1040 " return false;\n"
1041 "}\n"
1042 "default: {\n"
1043 " return true;\n"
1044 "}\n"
1045 "}",
1046 format("switch (n)\n"
1047 "{\n"
1048 "case 0: {\n"
1049 " return false;\n"
1050 "}\n"
1051 "default: {\n"
1052 " return true;\n"
1053 "}\n"
1054 "}",
1055 getLLVMStyle()));
Daniel Jasper031e2402014-04-28 07:48:36 +00001056 verifyFormat("switch (a) {\n"
1057 "case (b):\n"
1058 " return;\n"
1059 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +00001060
1061 verifyFormat("switch (a) {\n"
1062 "case some_namespace::\n"
1063 " some_constant:\n"
1064 " return;\n"
1065 "}",
1066 getLLVMStyleWithColumns(34));
Owen Pan58c3dee2018-09-13 07:27:15 +00001067
1068 FormatStyle Style = getLLVMStyle();
1069 Style.IndentCaseLabels = true;
1070 Style.AllowShortBlocksOnASingleLine = false;
1071 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1072 Style.BraceWrapping.AfterControlStatement = true;
1073 EXPECT_EQ("switch (n)\n"
1074 "{\n"
1075 " case 0:\n"
1076 " {\n"
1077 " return false;\n"
1078 " }\n"
1079 " default:\n"
1080 " {\n"
1081 " return true;\n"
1082 " }\n"
1083 "}",
1084 format("switch (n) {\n"
1085 " case 0: {\n"
1086 " return false;\n"
1087 " }\n"
1088 " default: {\n"
1089 " return true;\n"
1090 " }\n"
1091 "}",
1092 Style));
Daniel Jasperf7935112012-12-03 18:12:45 +00001093}
1094
Daniel Jasper2d0cd492013-10-20 16:56:16 +00001095TEST_F(FormatTest, CaseRanges) {
1096 verifyFormat("switch (x) {\n"
1097 "case 'A' ... 'Z':\n"
1098 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +00001099 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +00001100 " break;\n"
1101 "}");
1102}
1103
Daniel Jasperb87899b2014-09-10 13:11:45 +00001104TEST_F(FormatTest, ShortCaseLabels) {
1105 FormatStyle Style = getLLVMStyle();
1106 Style.AllowShortCaseLabelsOnASingleLine = true;
1107 verifyFormat("switch (a) {\n"
1108 "case 1: x = 1; break;\n"
1109 "case 2: return;\n"
1110 "case 3:\n"
1111 "case 4:\n"
1112 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +00001113 "case 6: // comment\n"
1114 " return;\n"
1115 "case 7:\n"
1116 " // comment\n"
1117 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +00001118 "case 8:\n"
1119 " x = 8; // comment\n"
1120 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001121 "default: y = 1; break;\n"
1122 "}",
1123 Style);
1124 verifyFormat("switch (a) {\n"
Francois Ferranda64ba702017-07-28 07:56:18 +00001125 "case 0: return; // comment\n"
1126 "case 1: break; // comment\n"
1127 "case 2: return;\n"
1128 "// comment\n"
1129 "case 3: return;\n"
1130 "// comment 1\n"
1131 "// comment 2\n"
1132 "// comment 3\n"
1133 "case 4: break; /* comment */\n"
1134 "case 5:\n"
1135 " // comment\n"
1136 " break;\n"
1137 "case 6: /* comment */ x = 1; break;\n"
1138 "case 7: x = /* comment */ 1; break;\n"
1139 "case 8:\n"
1140 " x = 1; /* comment */\n"
1141 " break;\n"
1142 "case 9:\n"
1143 " break; // comment line 1\n"
1144 " // comment line 2\n"
1145 "}",
1146 Style);
1147 EXPECT_EQ("switch (a) {\n"
1148 "case 1:\n"
1149 " x = 8;\n"
1150 " // fall through\n"
1151 "case 2: x = 8;\n"
1152 "// comment\n"
1153 "case 3:\n"
1154 " return; /* comment line 1\n"
1155 " * comment line 2 */\n"
1156 "case 4: i = 8;\n"
1157 "// something else\n"
1158 "#if FOO\n"
1159 "case 5: break;\n"
1160 "#endif\n"
1161 "}",
1162 format("switch (a) {\n"
1163 "case 1: x = 8;\n"
1164 " // fall through\n"
1165 "case 2:\n"
1166 " x = 8;\n"
1167 "// comment\n"
1168 "case 3:\n"
1169 " return; /* comment line 1\n"
1170 " * comment line 2 */\n"
1171 "case 4:\n"
1172 " i = 8;\n"
1173 "// something else\n"
1174 "#if FOO\n"
1175 "case 5: break;\n"
1176 "#endif\n"
1177 "}",
1178 Style));
1179 EXPECT_EQ("switch (a) {\n" "case 0:\n"
1180 " return; // long long long long long long long long long long long long comment\n"
1181 " // line\n" "}",
1182 format("switch (a) {\n"
1183 "case 0: return; // long long long long long long long long long long long long comment line\n"
1184 "}",
1185 Style));
1186 EXPECT_EQ("switch (a) {\n"
1187 "case 0:\n"
1188 " return; /* long long long long long long long long long long long long comment\n"
1189 " line */\n"
1190 "}",
1191 format("switch (a) {\n"
1192 "case 0: return; /* long long long long long long long long long long long long comment line */\n"
1193 "}",
1194 Style));
1195 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +00001196 "#if FOO\n"
1197 "case 0: return 0;\n"
1198 "#endif\n"
1199 "}",
1200 Style);
1201 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +00001202 "case 1: {\n"
1203 "}\n"
1204 "case 2: {\n"
1205 " return;\n"
1206 "}\n"
1207 "case 3: {\n"
1208 " x = 1;\n"
1209 " return;\n"
1210 "}\n"
1211 "case 4:\n"
1212 " if (x)\n"
1213 " return;\n"
1214 "}",
1215 Style);
1216 Style.ColumnLimit = 21;
1217 verifyFormat("switch (a) {\n"
1218 "case 1: x = 1; break;\n"
1219 "case 2: return;\n"
1220 "case 3:\n"
1221 "case 4:\n"
1222 "case 5: return;\n"
1223 "default:\n"
1224 " y = 1;\n"
1225 " break;\n"
1226 "}",
1227 Style);
Jonas Toth90d2aa22018-08-24 17:25:06 +00001228 Style.ColumnLimit = 80;
1229 Style.AllowShortCaseLabelsOnASingleLine = false;
1230 Style.IndentCaseLabels = true;
1231 EXPECT_EQ("switch (n) {\n"
1232 " default /*comments*/:\n"
1233 " return true;\n"
1234 " case 0:\n"
1235 " return false;\n"
1236 "}",
1237 format("switch (n) {\n"
1238 "default/*comments*/:\n"
1239 " return true;\n"
1240 "case 0:\n"
1241 " return false;\n"
1242 "}",
1243 Style));
Owen Pan9da65a32018-09-21 03:46:36 +00001244 Style.AllowShortCaseLabelsOnASingleLine = true;
1245 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1246 Style.BraceWrapping.AfterControlStatement = true;
1247 EXPECT_EQ("switch (n)\n"
1248 "{\n"
1249 " case 0:\n"
1250 " {\n"
1251 " return false;\n"
1252 " }\n"
1253 " default:\n"
1254 " {\n"
1255 " return true;\n"
1256 " }\n"
1257 "}",
1258 format("switch (n) {\n"
1259 " case 0: {\n"
1260 " return false;\n"
1261 " }\n"
1262 " default:\n"
1263 " {\n"
1264 " return true;\n"
1265 " }\n"
1266 "}",
1267 Style));
Daniel Jasperb87899b2014-09-10 13:11:45 +00001268}
1269
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001270TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +00001271 verifyFormat("void f() {\n"
1272 " some_code();\n"
1273 "test_label:\n"
1274 " some_other_code();\n"
1275 " {\n"
1276 " some_more_code();\n"
1277 " another_label:\n"
1278 " some_more_code();\n"
1279 " }\n"
1280 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +00001281 verifyFormat("{\n"
1282 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00001283 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +00001284 " some_other_code();\n"
1285 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +00001286 verifyFormat("{\n"
1287 " some_code();\n"
1288 "test_label:;\n"
1289 " int i = 0;\n"
1290 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00001291}
1292
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001293//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001294// Tests for classes, namespaces, etc.
1295//===----------------------------------------------------------------------===//
1296
1297TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001298 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001299}
1300
1301TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1302 verifyFormat("class A {\n"
1303 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001304 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001305 "protected:\n"
1306 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001307 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001308 "};");
Sam McCall6f3778c2018-09-05 07:44:02 +00001309 verifyFormat("export class A {\n"
1310 "public:\n"
1311 "public: // comment\n"
1312 "protected:\n"
1313 "private:\n"
1314 " void f() {}\n"
1315 "};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001316 verifyGoogleFormat("class A {\n"
1317 " public:\n"
1318 " protected:\n"
1319 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001320 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001321 "};");
Sam McCall6f3778c2018-09-05 07:44:02 +00001322 verifyGoogleFormat("export class A {\n"
1323 " public:\n"
1324 " protected:\n"
1325 " private:\n"
1326 " void f() {}\n"
1327 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001328 verifyFormat("class A {\n"
1329 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001330 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001331 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001332 " void f2() {}\n"
1333 "protected slots:\n"
1334 " void f3() {}\n"
1335 "protected Q_SLOTS:\n"
1336 " void f4() {}\n"
1337 "private slots:\n"
1338 " void f5() {}\n"
1339 "private Q_SLOTS:\n"
1340 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001341 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001342 " void g1();\n"
1343 "Q_SIGNALS:\n"
1344 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001345 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001346
1347 // Don't interpret 'signals' the wrong way.
1348 verifyFormat("signals.set();");
1349 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001350 verifyFormat("{\n"
1351 " signals.set(); // This needs indentation.\n"
1352 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001353 verifyFormat("void f() {\n"
1354 "label:\n"
1355 " signals.baz();\n"
1356 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001357}
1358
Alexander Kornienkofd433362013-03-27 17:08:02 +00001359TEST_F(FormatTest, SeparatesLogicalBlocks) {
1360 EXPECT_EQ("class A {\n"
1361 "public:\n"
1362 " void f();\n"
1363 "\n"
1364 "private:\n"
1365 " void g() {}\n"
1366 " // test\n"
1367 "protected:\n"
1368 " int h;\n"
1369 "};",
1370 format("class A {\n"
1371 "public:\n"
1372 "void f();\n"
1373 "private:\n"
1374 "void g() {}\n"
1375 "// test\n"
1376 "protected:\n"
1377 "int h;\n"
1378 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001379 EXPECT_EQ("class A {\n"
1380 "protected:\n"
1381 "public:\n"
1382 " void f();\n"
1383 "};",
1384 format("class A {\n"
1385 "protected:\n"
1386 "\n"
1387 "public:\n"
1388 "\n"
1389 " void f();\n"
1390 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00001391
1392 // Even ensure proper spacing inside macros.
1393 EXPECT_EQ("#define B \\\n"
1394 " class A { \\\n"
1395 " protected: \\\n"
1396 " public: \\\n"
1397 " void f(); \\\n"
1398 " };",
1399 format("#define B \\\n"
1400 " class A { \\\n"
1401 " protected: \\\n"
1402 " \\\n"
1403 " public: \\\n"
1404 " \\\n"
1405 " void f(); \\\n"
1406 " };",
1407 getGoogleStyle()));
1408 // But don't remove empty lines after macros ending in access specifiers.
1409 EXPECT_EQ("#define A private:\n"
1410 "\n"
1411 "int i;",
1412 format("#define A private:\n"
1413 "\n"
1414 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00001415}
1416
Daniel Jasper83193602013-04-05 17:22:09 +00001417TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001418 verifyFormat("class A : public B {};");
1419 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001420
1421 verifyFormat(
1422 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001423 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001424 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1425 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001426 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001427 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001428 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001429 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1430 " public C,\n"
1431 " public D,\n"
1432 " public E,\n"
1433 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001434 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001435
1436 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001437 " ReallyReallyLongClassName {\n"
1438 " int i;\n"
1439 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001440 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001441 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1442 " aaaaaaaaaaaaaaaa> {};");
1443 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1444 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1445 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001446 verifyFormat("template <class R, class C>\n"
1447 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1448 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001449 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001450}
1451
Francois Ferrand6bb103f2018-06-11 14:41:26 +00001452TEST_F(FormatTest, BreakInheritanceStyle) {
1453 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle();
1454 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList =
1455 FormatStyle::BILS_BeforeComma;
1456 verifyFormat("class MyClass : public X {};",
1457 StyleWithInheritanceBreakBeforeComma);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001458 verifyFormat("class MyClass\n"
1459 " : public X\n"
1460 " , public Y {};",
Francois Ferrand6bb103f2018-06-11 14:41:26 +00001461 StyleWithInheritanceBreakBeforeComma);
1462 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n"
1463 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n"
1464 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1465 StyleWithInheritanceBreakBeforeComma);
1466 verifyFormat("struct aaaaaaaaaaaaa\n"
1467 " : public aaaaaaaaaaaaaaaaaaa< // break\n"
1468 " aaaaaaaaaaaaaaaa> {};",
1469 StyleWithInheritanceBreakBeforeComma);
1470
1471 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle();
1472 StyleWithInheritanceBreakAfterColon.BreakInheritanceList =
1473 FormatStyle::BILS_AfterColon;
1474 verifyFormat("class MyClass : public X {};",
1475 StyleWithInheritanceBreakAfterColon);
1476 verifyFormat("class MyClass : public X, public Y {};",
1477 StyleWithInheritanceBreakAfterColon);
1478 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n"
1479 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1480 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1481 StyleWithInheritanceBreakAfterColon);
1482 verifyFormat("struct aaaaaaaaaaaaa :\n"
1483 " public aaaaaaaaaaaaaaaaaaa< // break\n"
1484 " aaaaaaaaaaaaaaaa> {};",
1485 StyleWithInheritanceBreakAfterColon);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001486}
1487
Manuel Klimek28cacc72013-01-07 18:10:23 +00001488TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001489 verifyFormat("class A {\n} a, b;");
1490 verifyFormat("struct A {\n} a, b;");
1491 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001492}
1493
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001494TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001495 verifyFormat("enum {\n"
1496 " Zero,\n"
1497 " One = 1,\n"
1498 " Two = One + 1,\n"
1499 " Three = (One + Two),\n"
1500 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1501 " Five = (One, Two, Three, Four, 5)\n"
1502 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001503 verifyGoogleFormat("enum {\n"
1504 " Zero,\n"
1505 " One = 1,\n"
1506 " Two = One + 1,\n"
1507 " Three = (One + Two),\n"
1508 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1509 " Five = (One, Two, Three, Four, 5)\n"
1510 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001511 verifyFormat("enum Enum {};");
1512 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001513 verifyFormat("enum X E {} d;");
1514 verifyFormat("enum __attribute__((...)) E {} d;");
1515 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001516 verifyFormat("enum {\n"
1517 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001518 "};",
1519 getLLVMStyleWithColumns(30));
1520
1521 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001522 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001523
1524 EXPECT_EQ("enum KeepEmptyLines {\n"
1525 " ONE,\n"
1526 "\n"
1527 " TWO,\n"
1528 "\n"
1529 " THREE\n"
1530 "}",
1531 format("enum KeepEmptyLines {\n"
1532 " ONE,\n"
1533 "\n"
1534 " TWO,\n"
1535 "\n"
1536 "\n"
1537 " THREE\n"
1538 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001539 verifyFormat("enum E { // comment\n"
1540 " ONE,\n"
1541 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001542 "};\n"
1543 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001544 // Not enums.
1545 verifyFormat("enum X f() {\n"
1546 " a();\n"
1547 " return 42;\n"
1548 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001549 verifyFormat("enum X Type::f() {\n"
1550 " a();\n"
1551 " return 42;\n"
1552 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001553 verifyFormat("enum ::X f() {\n"
1554 " a();\n"
1555 " return 42;\n"
1556 "}");
1557 verifyFormat("enum ns::X f() {\n"
1558 " a();\n"
1559 " return 42;\n"
1560 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001561}
1562
Daniel Jasperb7150872013-08-30 10:10:19 +00001563TEST_F(FormatTest, FormatsEnumsWithErrors) {
1564 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001565 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001566 " Two = 1;\n"
1567 "};");
1568 verifyFormat("namespace n {\n"
1569 "enum Type {\n"
1570 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001571 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001572 " int i;\n"
1573 "}\n"
1574 "void g() {}");
1575}
1576
Daniel Jasper2b41a822013-08-20 12:42:50 +00001577TEST_F(FormatTest, FormatsEnumStruct) {
1578 verifyFormat("enum struct {\n"
1579 " Zero,\n"
1580 " One = 1,\n"
1581 " Two = One + 1,\n"
1582 " Three = (One + Two),\n"
1583 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1584 " Five = (One, Two, Three, Four, 5)\n"
1585 "};");
1586 verifyFormat("enum struct Enum {};");
1587 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001588 verifyFormat("enum struct X E {} d;");
1589 verifyFormat("enum struct __attribute__((...)) E {} d;");
1590 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001591 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1592}
1593
1594TEST_F(FormatTest, FormatsEnumClass) {
1595 verifyFormat("enum class {\n"
1596 " Zero,\n"
1597 " One = 1,\n"
1598 " Two = One + 1,\n"
1599 " Three = (One + Two),\n"
1600 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1601 " Five = (One, Two, Three, Four, 5)\n"
1602 "};");
1603 verifyFormat("enum class Enum {};");
1604 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001605 verifyFormat("enum class X E {} d;");
1606 verifyFormat("enum class __attribute__((...)) E {} d;");
1607 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001608 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1609}
1610
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001611TEST_F(FormatTest, FormatsEnumTypes) {
1612 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001613 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001614 " B\n"
1615 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001616 verifyFormat("enum X : int { A, B };");
1617 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001618}
1619
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001620TEST_F(FormatTest, FormatsTypedefEnum) {
1621 FormatStyle Style = getLLVMStyle();
1622 Style.ColumnLimit = 40;
1623 verifyFormat("typedef enum {} EmptyEnum;");
1624 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1625 verifyFormat("typedef enum {\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001626 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001627 " ONE = 1,\n"
1628 " TWO = 2,\n"
1629 " THREE = 3\n"
1630 "} LongEnum;",
1631 Style);
1632 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1633 Style.BraceWrapping.AfterEnum = true;
1634 verifyFormat("typedef enum {} EmptyEnum;");
1635 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1636 verifyFormat("typedef enum\n"
1637 "{\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001638 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001639 " ONE = 1,\n"
1640 " TWO = 2,\n"
1641 " THREE = 3\n"
1642 "} LongEnum;",
1643 Style);
1644}
1645
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001646TEST_F(FormatTest, FormatsNSEnums) {
1647 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1648 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1649 " // Information about someDecentlyLongValue.\n"
1650 " someDecentlyLongValue,\n"
1651 " // Information about anotherDecentlyLongValue.\n"
1652 " anotherDecentlyLongValue,\n"
1653 " // Information about aThirdDecentlyLongValue.\n"
1654 " aThirdDecentlyLongValue\n"
1655 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001656 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1657 " a = 1,\n"
1658 " b = 2,\n"
1659 " c = 3,\n"
1660 "};");
1661 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1662 " a = 1,\n"
1663 " b = 2,\n"
1664 " c = 3,\n"
1665 "};");
1666 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1667 " a = 1,\n"
1668 " b = 2,\n"
1669 " c = 3,\n"
1670 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001671}
1672
Nico Weber7769a902013-01-14 05:49:49 +00001673TEST_F(FormatTest, FormatsBitfields) {
1674 verifyFormat("struct Bitfields {\n"
1675 " unsigned sClass : 8;\n"
1676 " unsigned ValueKind : 2;\n"
1677 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001678 verifyFormat("struct A {\n"
1679 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1680 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1681 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001682 verifyFormat("struct MyStruct {\n"
1683 " uchar data;\n"
1684 " uchar : 8;\n"
1685 " uchar : 8;\n"
1686 " uchar other;\n"
1687 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001688}
1689
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001690TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001691 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1692 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1693
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001694 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001695 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001696 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001697 "}",
1698 LLVMWithNoNamespaceFix);
Sam McCall6f3778c2018-09-05 07:44:02 +00001699 verifyFormat("/* something */ namespace some_namespace {\n"
1700 "class A {};\n"
1701 "void f() { f(); }\n"
1702 "}",
1703 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001704 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001705 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001706 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001707 "}",
1708 LLVMWithNoNamespaceFix);
Sam McCall6f3778c2018-09-05 07:44:02 +00001709 verifyFormat("/* something */ namespace {\n"
1710 "class A {};\n"
1711 "void f() { f(); }\n"
1712 "}",
1713 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001714 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001715 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001716 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001717 "}",
1718 LLVMWithNoNamespaceFix);
Sam McCall6f3778c2018-09-05 07:44:02 +00001719 verifyFormat("/* something */ inline namespace X {\n"
1720 "class A {};\n"
1721 "void f() { f(); }\n"
1722 "}",
1723 LLVMWithNoNamespaceFix);
1724 verifyFormat("export namespace X {\n"
1725 "class A {};\n"
1726 "void f() { f(); }\n"
1727 "}",
1728 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001729 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001730 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001731 "void f() { f(); }",
1732 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001733
1734 // This code is more common than we thought; if we
1735 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001736 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001737 verifyFormat("namespace {};",
1738 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001739 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001740 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001741 "};",
1742 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001743
1744 verifyFormat("namespace {\n"
1745 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001746 "} // namespace",
1747 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001748 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1749 "#define HEADER_GUARD\n"
1750 "namespace my_namespace {\n"
1751 "int i;\n"
1752 "} // my_namespace\n"
1753 "#endif // HEADER_GUARD",
1754 format("#ifndef HEADER_GUARD\n"
1755 " #define HEADER_GUARD\n"
1756 " namespace my_namespace {\n"
1757 "int i;\n"
1758 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001759 "#endif // HEADER_GUARD",
1760 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001761
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001762 EXPECT_EQ("namespace A::B {\n"
1763 "class C {};\n"
1764 "}",
1765 format("namespace A::B {\n"
1766 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001767 "}",
1768 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001769
Daniel Jasper65ee3472013-07-31 23:16:02 +00001770 FormatStyle Style = getLLVMStyle();
1771 Style.NamespaceIndentation = FormatStyle::NI_All;
1772 EXPECT_EQ("namespace out {\n"
1773 " int i;\n"
1774 " namespace in {\n"
1775 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001776 " } // namespace in\n"
1777 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001778 format("namespace out {\n"
1779 "int i;\n"
1780 "namespace in {\n"
1781 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001782 "} // namespace in\n"
1783 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001784 Style));
1785
1786 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1787 EXPECT_EQ("namespace out {\n"
1788 "int i;\n"
1789 "namespace in {\n"
1790 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001791 "} // namespace in\n"
1792 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001793 format("namespace out {\n"
1794 "int i;\n"
1795 "namespace in {\n"
1796 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001797 "} // namespace in\n"
1798 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001799 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001800}
1801
Francois Ferrande56a8292017-06-14 12:29:47 +00001802TEST_F(FormatTest, FormatsCompactNamespaces) {
1803 FormatStyle Style = getLLVMStyle();
1804 Style.CompactNamespaces = true;
1805
1806 verifyFormat("namespace A { namespace B {\n"
1807 "}} // namespace A::B",
1808 Style);
1809
1810 EXPECT_EQ("namespace out { namespace in {\n"
1811 "}} // namespace out::in",
1812 format("namespace out {\n"
1813 "namespace in {\n"
1814 "} // namespace in\n"
1815 "} // namespace out",
1816 Style));
1817
1818 // Only namespaces which have both consecutive opening and end get compacted
1819 EXPECT_EQ("namespace out {\n"
1820 "namespace in1 {\n"
1821 "} // namespace in1\n"
1822 "namespace in2 {\n"
1823 "} // namespace in2\n"
1824 "} // namespace out",
1825 format("namespace out {\n"
1826 "namespace in1 {\n"
1827 "} // namespace in1\n"
1828 "namespace in2 {\n"
1829 "} // namespace in2\n"
1830 "} // namespace out",
1831 Style));
1832
1833 EXPECT_EQ("namespace out {\n"
1834 "int i;\n"
1835 "namespace in {\n"
1836 "int j;\n"
1837 "} // namespace in\n"
1838 "int k;\n"
1839 "} // namespace out",
1840 format("namespace out { int i;\n"
1841 "namespace in { int j; } // namespace in\n"
1842 "int k; } // namespace out",
1843 Style));
1844
1845 EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1846 "}}} // namespace A::B::C\n",
1847 format("namespace A { namespace B {\n"
1848 "namespace C {\n"
1849 "}} // namespace B::C\n"
1850 "} // namespace A\n",
1851 Style));
1852
1853 Style.ColumnLimit = 40;
1854 EXPECT_EQ("namespace aaaaaaaaaa {\n"
1855 "namespace bbbbbbbbbb {\n"
1856 "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1857 format("namespace aaaaaaaaaa {\n"
1858 "namespace bbbbbbbbbb {\n"
1859 "} // namespace bbbbbbbbbb\n"
1860 "} // namespace aaaaaaaaaa",
1861 Style));
1862
1863 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1864 "namespace cccccc {\n"
1865 "}}} // namespace aaaaaa::bbbbbb::cccccc",
1866 format("namespace aaaaaa {\n"
1867 "namespace bbbbbb {\n"
1868 "namespace cccccc {\n"
1869 "} // namespace cccccc\n"
1870 "} // namespace bbbbbb\n"
1871 "} // namespace aaaaaa",
1872 Style));
1873 Style.ColumnLimit = 80;
1874
1875 // Extra semicolon after 'inner' closing brace prevents merging
1876 EXPECT_EQ("namespace out { namespace in {\n"
1877 "}; } // namespace out::in",
1878 format("namespace out {\n"
1879 "namespace in {\n"
1880 "}; // namespace in\n"
1881 "} // namespace out",
1882 Style));
1883
1884 // Extra semicolon after 'outer' closing brace is conserved
1885 EXPECT_EQ("namespace out { namespace in {\n"
1886 "}}; // namespace out::in",
1887 format("namespace out {\n"
1888 "namespace in {\n"
1889 "} // namespace in\n"
1890 "}; // namespace out",
1891 Style));
1892
1893 Style.NamespaceIndentation = FormatStyle::NI_All;
1894 EXPECT_EQ("namespace out { namespace in {\n"
1895 " int i;\n"
1896 "}} // namespace out::in",
1897 format("namespace out {\n"
1898 "namespace in {\n"
1899 "int i;\n"
1900 "} // namespace in\n"
1901 "} // namespace out",
1902 Style));
1903 EXPECT_EQ("namespace out { namespace mid {\n"
1904 " namespace in {\n"
1905 " int j;\n"
1906 " } // namespace in\n"
1907 " int k;\n"
1908 "}} // namespace out::mid",
1909 format("namespace out { namespace mid {\n"
1910 "namespace in { int j; } // namespace in\n"
1911 "int k; }} // namespace out::mid",
1912 Style));
1913
1914 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1915 EXPECT_EQ("namespace out { namespace in {\n"
1916 " int i;\n"
1917 "}} // namespace out::in",
1918 format("namespace out {\n"
1919 "namespace in {\n"
1920 "int i;\n"
1921 "} // namespace in\n"
1922 "} // namespace out",
1923 Style));
1924 EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1925 " int i;\n"
1926 "}}} // namespace out::mid::in",
1927 format("namespace out {\n"
1928 "namespace mid {\n"
1929 "namespace in {\n"
1930 "int i;\n"
1931 "} // namespace in\n"
1932 "} // namespace mid\n"
1933 "} // namespace out",
1934 Style));
1935}
1936
Krasimir Georgievd6ce9372017-09-15 11:23:50 +00001937TEST_F(FormatTest, FormatsExternC) {
1938 verifyFormat("extern \"C\" {\nint a;");
1939 verifyFormat("extern \"C\" {}");
1940 verifyFormat("extern \"C\" {\n"
1941 "int foo();\n"
1942 "}");
1943 verifyFormat("extern \"C\" int foo() {}");
1944 verifyFormat("extern \"C\" int foo();");
1945 verifyFormat("extern \"C\" int foo() {\n"
1946 " int i = 42;\n"
1947 " return i;\n"
1948 "}");
1949
1950 FormatStyle Style = getLLVMStyle();
1951 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1952 Style.BraceWrapping.AfterFunction = true;
1953 verifyFormat("extern \"C\" int foo() {}", Style);
1954 verifyFormat("extern \"C\" int foo();", Style);
1955 verifyFormat("extern \"C\" int foo()\n"
1956 "{\n"
1957 " int i = 42;\n"
1958 " return i;\n"
1959 "}",
1960 Style);
1961
1962 Style.BraceWrapping.AfterExternBlock = true;
1963 Style.BraceWrapping.SplitEmptyRecord = false;
1964 verifyFormat("extern \"C\"\n"
1965 "{}",
1966 Style);
1967 verifyFormat("extern \"C\"\n"
1968 "{\n"
1969 " int foo();\n"
1970 "}",
1971 Style);
1972}
Manuel Klimekae610d12013-01-21 14:32:05 +00001973
Daniel Jasper40aacf42013-03-14 13:45:21 +00001974TEST_F(FormatTest, FormatsInlineASM) {
1975 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001976 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001977 verifyFormat(
1978 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1979 " \"cpuid\\n\\t\"\n"
1980 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001981 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001982 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001983 EXPECT_EQ(
1984 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001985 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001986 " mov edx,[that] // vtable in edx\n"
1987 " mov eax,methodIndex\n"
1988 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001989 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001990 "}",
1991 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1992 " __asm {\n"
1993 " mov edx,[that] // vtable in edx\n"
1994 " mov eax,methodIndex\n"
1995 " call [edx][eax*4] // stdcall\n"
1996 " }\n"
1997 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001998 EXPECT_EQ("_asm {\n"
1999 " xor eax, eax;\n"
2000 " cpuid;\n"
2001 "}",
2002 format("_asm {\n"
2003 " xor eax, eax;\n"
2004 " cpuid;\n"
2005 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00002006 verifyFormat("void function() {\n"
2007 " // comment\n"
2008 " asm(\"\");\n"
2009 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00002010 EXPECT_EQ("__asm {\n"
2011 "}\n"
2012 "int i;",
2013 format("__asm {\n"
2014 "}\n"
2015 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00002016}
2017
Nico Weberd5650bd2013-01-07 16:36:17 +00002018TEST_F(FormatTest, FormatTryCatch) {
2019 verifyFormat("try {\n"
2020 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002021 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002022 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002023 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002024 " exit(42);\n"
2025 "}");
2026
2027 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00002028 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002029 " return 5;\n"
2030 "}");
2031 verifyFormat("class A {\n"
2032 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002033 " A() try : a(0) {\n"
2034 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002035 " throw;\n"
2036 " }\n"
2037 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00002038
2039 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002040 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00002041}
2042
Nico Weberfac23712015-02-04 15:26:27 +00002043TEST_F(FormatTest, FormatSEHTryCatch) {
2044 verifyFormat("__try {\n"
2045 " int a = b * c;\n"
2046 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2047 " // Do nothing.\n"
2048 "}");
2049
2050 verifyFormat("__try {\n"
2051 " int a = b * c;\n"
2052 "} __finally {\n"
2053 " // Do nothing.\n"
2054 "}");
2055
2056 verifyFormat("DEBUG({\n"
2057 " __try {\n"
2058 " } __finally {\n"
2059 " }\n"
2060 "});\n");
2061}
2062
Daniel Jasper04a71a42014-05-08 11:58:24 +00002063TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2064 verifyFormat("try {\n"
2065 " f();\n"
2066 "} catch {\n"
2067 " g();\n"
2068 "}");
2069 verifyFormat("try {\n"
2070 " f();\n"
2071 "} catch (A a) MACRO(x) {\n"
2072 " g();\n"
2073 "} catch (B b) MACRO(x) {\n"
2074 " g();\n"
2075 "}");
2076}
2077
2078TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2079 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00002080 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2081 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00002082 Style.BreakBeforeBraces = BraceStyle;
2083 verifyFormat("try {\n"
2084 " // something\n"
2085 "} catch (...) {\n"
2086 " // something\n"
2087 "}",
2088 Style);
2089 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00002090 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2091 verifyFormat("try {\n"
2092 " // something\n"
2093 "}\n"
2094 "catch (...) {\n"
2095 " // something\n"
2096 "}",
2097 Style);
Nico Weberfac23712015-02-04 15:26:27 +00002098 verifyFormat("__try {\n"
2099 " // something\n"
2100 "}\n"
2101 "__finally {\n"
2102 " // something\n"
2103 "}",
2104 Style);
Nico Weber33381f52015-02-07 01:57:32 +00002105 verifyFormat("@try {\n"
2106 " // something\n"
2107 "}\n"
2108 "@finally {\n"
2109 " // something\n"
2110 "}",
2111 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002112 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2113 verifyFormat("try\n"
2114 "{\n"
2115 " // something\n"
2116 "}\n"
2117 "catch (...)\n"
2118 "{\n"
2119 " // something\n"
2120 "}",
2121 Style);
2122 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2123 verifyFormat("try\n"
2124 " {\n"
2125 " // something\n"
2126 " }\n"
2127 "catch (...)\n"
2128 " {\n"
2129 " // something\n"
2130 " }",
2131 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00002132 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2133 Style.BraceWrapping.BeforeCatch = true;
2134 verifyFormat("try {\n"
2135 " // something\n"
2136 "}\n"
2137 "catch (...) {\n"
2138 " // something\n"
2139 "}",
2140 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002141}
2142
Daniel Jaspere25509f2012-12-17 11:29:41 +00002143TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002144 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00002145
Daniel Jaspera44991332015-04-29 13:06:49 +00002146 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2147 " 100000000, "
2148 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00002149
Daniel Jasper473c62c2013-05-17 09:35:01 +00002150 // Here, everything other than the "}" would fit on a line.
2151 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002152 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002153 EXPECT_EQ("S s = {a,\n"
2154 "\n"
2155 " b};",
2156 format("S s = {\n"
2157 " a,\n"
2158 "\n"
2159 " b\n"
2160 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00002161
2162 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2163 // line. However, the formatting looks a bit off and this probably doesn't
2164 // happen often in practice.
2165 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002166 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00002167 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00002168}
2169
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002170TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002171 verifyFormat("const struct A a = {.a = 1, .b = 2};");
2172 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2173 " .bbbbbbbbbb = 2,\n"
2174 " .cccccccccc = 3,\n"
2175 " .dddddddddd = 4,\n"
2176 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002177 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002178 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2179 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2180 " .ccccccccccccccccccccccccccc = 3,\n"
2181 " .ddddddddddddddddddddddddddd = 4,\n"
2182 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002183
2184 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00002185
2186 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
2187 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
2188 " [2] = bbbbbbbbbb,\n"
2189 " [3] = cccccccccc,\n"
2190 " [4] = dddddddddd,\n"
2191 " [5] = eeeeeeeeee};");
2192 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2193 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2194 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2195 " [3] = cccccccccccccccccccccccccccccccccccccc,\n"
2196 " [4] = dddddddddddddddddddddddddddddddddddddd,\n"
2197 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002198}
2199
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002200TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002201 verifyFormat("static A x = {{{}}};\n");
2202 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2203 " {init1, init2, init3, init4}}};",
2204 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00002205
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002206 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002207 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2208 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2209 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2210 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00002211 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002212 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2213 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2214 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00002215 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2216 " {rect.fRight - rect.fLeft, rect.fBottom - "
2217 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002218
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002219 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00002220 "SomeArrayOfSomeType a = {\n"
2221 " {{1, 2, 3},\n"
2222 " {1, 2, 3},\n"
2223 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
2224 " 333333333333333333333333333333},\n"
2225 " {1, 2, 3},\n"
2226 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00002227 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00002228 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002229 " {{1, 2, 3}},\n"
2230 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002231 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2232 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002233 " {{1, 2, 3}},\n"
2234 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002235
Daniel Jaspera44991332015-04-29 13:06:49 +00002236 verifyFormat("struct {\n"
2237 " unsigned bit;\n"
2238 " const char *const name;\n"
2239 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2240 " {kOsWin, \"Windows\"},\n"
2241 " {kOsLinux, \"Linux\"},\n"
2242 " {kOsCrOS, \"Chrome OS\"}};");
2243 verifyFormat("struct {\n"
2244 " unsigned bit;\n"
2245 " const char *const name;\n"
2246 "} kBitsToOs[] = {\n"
2247 " {kOsMac, \"Mac\"},\n"
2248 " {kOsWin, \"Windows\"},\n"
2249 " {kOsLinux, \"Linux\"},\n"
2250 " {kOsCrOS, \"Chrome OS\"},\n"
2251 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002252}
2253
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002254TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2255 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2256 " \\\n"
2257 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2258}
2259
Daniel Jasperda16db32013-01-07 10:48:50 +00002260TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002261 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2262 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00002263
2264 // Do break defaulted and deleted functions.
2265 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2266 " default;",
2267 getLLVMStyleWithColumns(40));
2268 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2269 " delete;",
2270 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002271}
2272
2273TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2274 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2275 getLLVMStyleWithColumns(40));
2276 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2277 getLLVMStyleWithColumns(40));
2278 EXPECT_EQ("#define Q \\\n"
2279 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
2280 " \"aaaaaaaa.cpp\"",
2281 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2282 getLLVMStyleWithColumns(40)));
2283}
2284
2285TEST_F(FormatTest, UnderstandsLinePPDirective) {
2286 EXPECT_EQ("# 123 \"A string literal\"",
2287 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00002288}
2289
Manuel Klimek591b5802013-01-31 15:58:48 +00002290TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00002291 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00002292 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002293}
2294
2295TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2296 EXPECT_EQ("#line 42 \"test\"\n",
2297 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002298 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
2299 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002300}
2301
2302TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2303 EXPECT_EQ("#line 42 \"test\"",
2304 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002305 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002306}
2307
Daniel Jasper877615c2013-10-11 19:45:02 +00002308TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2309 verifyFormat("#define A \\x20");
2310 verifyFormat("#define A \\ x20");
2311 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
2312 verifyFormat("#define A ''");
2313 verifyFormat("#define A ''qqq");
2314 verifyFormat("#define A `qqq");
2315 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00002316 EXPECT_EQ("const char *c = STRINGIFY(\n"
2317 "\\na : b);",
2318 format("const char * c = STRINGIFY(\n"
2319 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00002320
2321 verifyFormat("a\r\\");
2322 verifyFormat("a\v\\");
2323 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00002324}
2325
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002326TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002327 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2328 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002329 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002330 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00002331 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00002332
2333 verifyFormat("#define A A\n#define A A");
2334 verifyFormat("#define A(X) A\n#define A A");
2335
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002336 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2337 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002338}
2339
2340TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002341 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002342 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002343 "#define A( \\\n"
2344 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002345 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002346 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002347 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002348 " #include \"a.h\"\n"
2349 "#define A(A,\\\n"
2350 " B)\n"
2351 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002352 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002353 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002354}
2355
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002356TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002357
2358TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2359 EXPECT_EQ("#define A \\\n"
2360 " c; \\\n"
2361 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002362 "f;",
2363 format("#define A c; e;\n"
2364 "f;",
2365 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002366}
2367
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002368TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002369
Manuel Klimek1abf7892013-01-04 23:34:14 +00002370TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002371 EXPECT_EQ("int x,\n"
2372 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002373 " y;",
2374 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002375}
2376
Manuel Klimek09e07972013-01-05 21:34:55 +00002377TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002378 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002379 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002380 verifyFormat("#define A \\\n"
2381 " { \\\n"
2382 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002383 " }",
2384 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002385
2386 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002387 " void function##X()",
2388 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002389
2390 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002391 " void a##b##c()",
2392 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002393
Daniel Jasper39825ea2013-01-14 15:40:57 +00002394 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002395}
2396
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002397TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002398 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2399 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002400}
2401
Manuel Klimek0c137952013-02-11 12:33:24 +00002402TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2403 EXPECT_EQ("#define A b;", format("#define A \\\n"
2404 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002405 " b;",
2406 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002407 EXPECT_EQ("#define A \\\n"
2408 " \\\n"
2409 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002410 " b;",
2411 format("#define A \\\n"
2412 " \\\n"
2413 " a; \\\n"
2414 " b;",
2415 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002416 EXPECT_EQ("#define A \\\n"
2417 " a; \\\n"
2418 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002419 " b;",
2420 format("#define A \\\n"
2421 " a; \\\n"
2422 " \\\n"
2423 " b;",
2424 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002425}
2426
Daniel Jasper00475962013-02-19 17:14:38 +00002427TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002428 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002429 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002430 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002431 " case 2\n",
2432 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002433 verifyFormat("#define MACRO(a) \\\n"
2434 " if (a) \\\n"
2435 " f(); \\\n"
2436 " else \\\n"
2437 " g()",
2438 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002439 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002440 verifyIncompleteFormat("#define STR(x) #x\n"
2441 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002442 verifyFormat("#pragma omp threadprivate( \\\n"
2443 " y)), // expected-warning",
2444 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002445 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002446 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002447 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002448 "#define b \\\n"
2449 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002450 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002451 "a",
2452 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002453 verifyFormat("#define A \\\n"
2454 " { \\\n"
2455 " {\n"
2456 "#define B \\\n"
2457 " } \\\n"
2458 " }",
2459 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002460 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002461 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002462 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002463 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002464}
2465
Daniel Jasper40e19212013-05-29 13:16:10 +00002466TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2467 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2468 EXPECT_EQ("class A : public QObject {\n"
2469 " Q_OBJECT\n"
2470 "\n"
2471 " A() {}\n"
2472 "};",
2473 format("class A : public QObject {\n"
2474 " Q_OBJECT\n"
2475 "\n"
2476 " A() {\n}\n"
2477 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002478 EXPECT_EQ("MACRO\n"
2479 "/*static*/ int i;",
2480 format("MACRO\n"
2481 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002482 EXPECT_EQ("SOME_MACRO\n"
2483 "namespace {\n"
2484 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002485 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00002486 format("SOME_MACRO\n"
2487 " namespace {\n"
2488 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002489 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002490 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002491 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2492 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002493 // Only if everything is upper case.
2494 EXPECT_EQ("class A : public QObject {\n"
2495 " Q_Object A() {}\n"
2496 "};",
2497 format("class A : public QObject {\n"
2498 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002499 " A() {\n}\n"
2500 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002501
2502 // Only if the next line can actually start an unwrapped line.
2503 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2504 format("SOME_WEIRD_LOG_MACRO\n"
2505 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002506
2507 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002508 "(n, buffers))\n",
2509 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002510}
2511
Alexander Kornienkode644272013-04-08 22:16:06 +00002512TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2513 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2514 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2515 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002516 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002517 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2518 "int *createScopDetectionPass() { return 0; }",
2519 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2520 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2521 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2522 " class X {};\n"
2523 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2524 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002525 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2526 // braces, so that inner block is indented one level more.
2527 EXPECT_EQ("int q() {\n"
2528 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2529 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2530 " IPC_END_MESSAGE_MAP()\n"
2531 "}",
2532 format("int q() {\n"
2533 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2534 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2535 " IPC_END_MESSAGE_MAP()\n"
2536 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002537
Daniel Jasper352dae12014-01-03 11:50:46 +00002538 // Same inside macros.
2539 EXPECT_EQ("#define LIST(L) \\\n"
2540 " L(A) \\\n"
2541 " L(B) \\\n"
2542 " L(C)",
2543 format("#define LIST(L) \\\n"
2544 " L(A) \\\n"
2545 " L(B) \\\n"
2546 " L(C)",
2547 getGoogleStyle()));
2548
Daniel Jasper545c6522013-09-17 09:26:07 +00002549 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002550 EXPECT_EQ("int q() {\n"
2551 " f(x);\n"
2552 " f(x) {}\n"
2553 " f(x)->g();\n"
2554 " f(x)->*g();\n"
2555 " f(x).g();\n"
2556 " f(x) = x;\n"
2557 " f(x) += x;\n"
2558 " f(x) -= x;\n"
2559 " f(x) *= x;\n"
2560 " f(x) /= x;\n"
2561 " f(x) %= x;\n"
2562 " f(x) &= x;\n"
2563 " f(x) |= x;\n"
2564 " f(x) ^= x;\n"
2565 " f(x) >>= x;\n"
2566 " f(x) <<= x;\n"
2567 " f(x)[y].z();\n"
2568 " LOG(INFO) << x;\n"
2569 " ifstream(x) >> x;\n"
2570 "}\n",
2571 format("int q() {\n"
2572 " f(x)\n;\n"
2573 " f(x)\n {}\n"
2574 " f(x)\n->g();\n"
2575 " f(x)\n->*g();\n"
2576 " f(x)\n.g();\n"
2577 " f(x)\n = x;\n"
2578 " f(x)\n += x;\n"
2579 " f(x)\n -= x;\n"
2580 " f(x)\n *= x;\n"
2581 " f(x)\n /= x;\n"
2582 " f(x)\n %= x;\n"
2583 " f(x)\n &= x;\n"
2584 " f(x)\n |= x;\n"
2585 " f(x)\n ^= x;\n"
2586 " f(x)\n >>= x;\n"
2587 " f(x)\n <<= x;\n"
2588 " f(x)\n[y].z();\n"
2589 " LOG(INFO)\n << x;\n"
2590 " ifstream(x)\n >> x;\n"
2591 "}\n"));
2592 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002593 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002594 " if (1) {\n"
2595 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002596 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002597 " while (1) {\n"
2598 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002599 " F(x)\n"
2600 " G(x);\n"
2601 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002602 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002603 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002604 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002605 " }\n"
2606 "}\n",
2607 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002608 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002609 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002610 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002611 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002612 "F(x)\n"
2613 "G(x);\n"
2614 "F(x)\n"
2615 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002616 "}\n"));
2617 EXPECT_EQ("class A {\n"
2618 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002619 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002620 " A(X x)\n" // FIXME: function-level try blocks are broken.
2621 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002622 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002623 " }\n"
2624 "};",
2625 format("class A {\n"
2626 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002627 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002628 " A(X x)\n"
2629 " try : t(0) {} catch (...) {}\n"
2630 "};"));
Owen Pancb5ffbe2018-09-28 09:17:00 +00002631 FormatStyle Style = getLLVMStyle();
2632 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2633 Style.BraceWrapping.AfterControlStatement = true;
2634 Style.BraceWrapping.AfterFunction = true;
2635 EXPECT_EQ("void f()\n"
2636 "try\n"
2637 "{\n"
2638 "}",
2639 format("void f() try {\n"
2640 "}", Style));
Daniel Jaspera44991332015-04-29 13:06:49 +00002641 EXPECT_EQ("class SomeClass {\n"
2642 "public:\n"
2643 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2644 "};",
2645 format("class SomeClass {\n"
2646 "public:\n"
2647 " SomeClass()\n"
2648 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2649 "};"));
2650 EXPECT_EQ("class SomeClass {\n"
2651 "public:\n"
2652 " SomeClass()\n"
2653 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2654 "};",
2655 format("class SomeClass {\n"
2656 "public:\n"
2657 " SomeClass()\n"
2658 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2659 "};",
2660 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002661
2662 verifyFormat("MACRO(>)");
Francois Ferrand6f40e212018-10-02 16:37:51 +00002663
2664 // Some macros contain an implicit semicolon.
2665 Style = getLLVMStyle();
2666 Style.StatementMacros.push_back("FOO");
2667 verifyFormat("FOO(a) int b = 0;");
2668 verifyFormat("FOO(a)\n"
2669 "int b = 0;",
2670 Style);
2671 verifyFormat("FOO(a);\n"
2672 "int b = 0;",
2673 Style);
2674 verifyFormat("FOO(argc, argv, \"4.0.2\")\n"
2675 "int b = 0;",
2676 Style);
2677 verifyFormat("FOO()\n"
2678 "int b = 0;",
2679 Style);
2680 verifyFormat("FOO\n"
2681 "int b = 0;",
2682 Style);
2683 verifyFormat("void f() {\n"
2684 " FOO(a)\n"
2685 " return a;\n"
2686 "}",
2687 Style);
2688 verifyFormat("FOO(a)\n"
2689 "FOO(b)",
2690 Style);
2691 verifyFormat("int a = 0;\n"
2692 "FOO(b)\n"
2693 "int c = 0;",
2694 Style);
2695 verifyFormat("int a = 0;\n"
2696 "int x = FOO(a)\n"
2697 "int b = 0;",
2698 Style);
2699 verifyFormat("void foo(int a) { FOO(a) }\n"
2700 "uint32_t bar() {}",
2701 Style);
Alexander Kornienkode644272013-04-08 22:16:06 +00002702}
2703
Manuel Klimek4fe43002013-05-22 12:51:29 +00002704TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2705 verifyFormat("#define A \\\n"
2706 " f({ \\\n"
2707 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002708 " });",
2709 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002710}
2711
Krasimir Georgievad47c902017-08-30 14:34:57 +00002712TEST_F(FormatTest, IndentPreprocessorDirectives) {
2713 FormatStyle Style = getLLVMStyle();
2714 Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2715 Style.ColumnLimit = 40;
2716 verifyFormat("#ifdef _WIN32\n"
2717 "#define A 0\n"
2718 "#ifdef VAR2\n"
2719 "#define B 1\n"
2720 "#include <someheader.h>\n"
2721 "#define MACRO \\\n"
2722 " some_very_long_func_aaaaaaaaaa();\n"
2723 "#endif\n"
2724 "#else\n"
2725 "#define A 1\n"
2726 "#endif",
2727 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002728 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2729 verifyFormat("#ifdef _WIN32\n"
2730 "# define A 0\n"
2731 "# ifdef VAR2\n"
2732 "# define B 1\n"
2733 "# include <someheader.h>\n"
2734 "# define MACRO \\\n"
2735 " some_very_long_func_aaaaaaaaaa();\n"
2736 "# endif\n"
2737 "#else\n"
2738 "# define A 1\n"
2739 "#endif",
2740 Style);
2741 verifyFormat("#if A\n"
2742 "# define MACRO \\\n"
2743 " void a(int x) { \\\n"
2744 " b(); \\\n"
2745 " c(); \\\n"
2746 " d(); \\\n"
2747 " e(); \\\n"
2748 " f(); \\\n"
2749 " }\n"
2750 "#endif",
2751 Style);
2752 // Comments before include guard.
2753 verifyFormat("// file comment\n"
2754 "// file comment\n"
2755 "#ifndef HEADER_H\n"
2756 "#define HEADER_H\n"
2757 "code();\n"
2758 "#endif",
2759 Style);
2760 // Test with include guards.
Krasimir Georgievad47c902017-08-30 14:34:57 +00002761 verifyFormat("#ifndef HEADER_H\n"
2762 "#define HEADER_H\n"
2763 "code();\n"
2764 "#endif",
2765 Style);
2766 // Include guards must have a #define with the same variable immediately
2767 // after #ifndef.
2768 verifyFormat("#ifndef NOT_GUARD\n"
2769 "# define FOO\n"
2770 "code();\n"
2771 "#endif",
2772 Style);
2773
2774 // Include guards must cover the entire file.
2775 verifyFormat("code();\n"
2776 "code();\n"
2777 "#ifndef NOT_GUARD\n"
2778 "# define NOT_GUARD\n"
2779 "code();\n"
2780 "#endif",
2781 Style);
2782 verifyFormat("#ifndef NOT_GUARD\n"
2783 "# define NOT_GUARD\n"
2784 "code();\n"
2785 "#endif\n"
2786 "code();",
2787 Style);
2788 // Test with trailing blank lines.
2789 verifyFormat("#ifndef HEADER_H\n"
2790 "#define HEADER_H\n"
2791 "code();\n"
2792 "#endif\n",
2793 Style);
2794 // Include guards don't have #else.
2795 verifyFormat("#ifndef NOT_GUARD\n"
2796 "# define NOT_GUARD\n"
2797 "code();\n"
2798 "#else\n"
2799 "#endif",
2800 Style);
2801 verifyFormat("#ifndef NOT_GUARD\n"
2802 "# define NOT_GUARD\n"
2803 "code();\n"
2804 "#elif FOO\n"
2805 "#endif",
2806 Style);
Mark Zeren1c3afaf2018-02-05 15:59:00 +00002807 // Non-identifier #define after potential include guard.
2808 verifyFormat("#ifndef FOO\n"
2809 "# define 1\n"
2810 "#endif\n",
2811 Style);
2812 // #if closes past last non-preprocessor line.
2813 verifyFormat("#ifndef FOO\n"
2814 "#define FOO\n"
2815 "#if 1\n"
2816 "int i;\n"
2817 "# define A 0\n"
2818 "#endif\n"
2819 "#endif\n",
2820 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002821 // FIXME: This doesn't handle the case where there's code between the
2822 // #ifndef and #define but all other conditions hold. This is because when
2823 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2824 // previous code line yet, so we can't detect it.
2825 EXPECT_EQ("#ifndef NOT_GUARD\n"
2826 "code();\n"
2827 "#define NOT_GUARD\n"
2828 "code();\n"
2829 "#endif",
2830 format("#ifndef NOT_GUARD\n"
2831 "code();\n"
2832 "# define NOT_GUARD\n"
2833 "code();\n"
2834 "#endif",
2835 Style));
2836 // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2837 // be outside an include guard. Examples are #pragma once and
2838 // #pragma GCC diagnostic, or anything else that does not change the meaning
2839 // of the file if it's included multiple times.
2840 EXPECT_EQ("#ifdef WIN32\n"
2841 "# pragma once\n"
2842 "#endif\n"
2843 "#ifndef HEADER_H\n"
2844 "# define HEADER_H\n"
2845 "code();\n"
2846 "#endif",
2847 format("#ifdef WIN32\n"
2848 "# pragma once\n"
2849 "#endif\n"
2850 "#ifndef HEADER_H\n"
2851 "#define HEADER_H\n"
2852 "code();\n"
2853 "#endif",
2854 Style));
2855 // FIXME: This does not detect when there is a single non-preprocessor line
2856 // in front of an include-guard-like structure where other conditions hold
2857 // because ScopedLineState hides the line.
2858 EXPECT_EQ("code();\n"
2859 "#ifndef HEADER_H\n"
2860 "#define HEADER_H\n"
2861 "code();\n"
2862 "#endif",
2863 format("code();\n"
2864 "#ifndef HEADER_H\n"
2865 "# define HEADER_H\n"
2866 "code();\n"
2867 "#endif",
2868 Style));
Mark Zerend2b2ac62018-01-31 20:05:50 +00002869 // Keep comments aligned with #, otherwise indent comments normally. These
2870 // tests cannot use verifyFormat because messUp manipulates leading
2871 // whitespace.
2872 {
2873 const char *Expected = ""
2874 "void f() {\n"
2875 "#if 1\n"
2876 "// Preprocessor aligned.\n"
2877 "# define A 0\n"
2878 " // Code. Separated by blank line.\n"
2879 "\n"
2880 "# define B 0\n"
2881 " // Code. Not aligned with #\n"
2882 "# define C 0\n"
2883 "#endif";
2884 const char *ToFormat = ""
2885 "void f() {\n"
2886 "#if 1\n"
2887 "// Preprocessor aligned.\n"
2888 "# define A 0\n"
2889 "// Code. Separated by blank line.\n"
2890 "\n"
2891 "# define B 0\n"
2892 " // Code. Not aligned with #\n"
2893 "# define C 0\n"
2894 "#endif";
2895 EXPECT_EQ(Expected, format(ToFormat, Style));
2896 EXPECT_EQ(Expected, format(Expected, Style));
2897 }
2898 // Keep block quotes aligned.
2899 {
2900 const char *Expected = ""
2901 "void f() {\n"
2902 "#if 1\n"
2903 "/* Preprocessor aligned. */\n"
2904 "# define A 0\n"
2905 " /* Code. Separated by blank line. */\n"
2906 "\n"
2907 "# define B 0\n"
2908 " /* Code. Not aligned with # */\n"
2909 "# define C 0\n"
2910 "#endif";
2911 const char *ToFormat = ""
2912 "void f() {\n"
2913 "#if 1\n"
2914 "/* Preprocessor aligned. */\n"
2915 "# define A 0\n"
2916 "/* Code. Separated by blank line. */\n"
2917 "\n"
2918 "# define B 0\n"
2919 " /* Code. Not aligned with # */\n"
2920 "# define C 0\n"
2921 "#endif";
2922 EXPECT_EQ(Expected, format(ToFormat, Style));
2923 EXPECT_EQ(Expected, format(Expected, Style));
2924 }
2925 // Keep comments aligned with un-indented directives.
2926 {
2927 const char *Expected = ""
2928 "void f() {\n"
2929 "// Preprocessor aligned.\n"
2930 "#define A 0\n"
2931 " // Code. Separated by blank line.\n"
2932 "\n"
2933 "#define B 0\n"
2934 " // Code. Not aligned with #\n"
2935 "#define C 0\n";
2936 const char *ToFormat = ""
2937 "void f() {\n"
2938 "// Preprocessor aligned.\n"
2939 "#define A 0\n"
2940 "// Code. Separated by blank line.\n"
2941 "\n"
2942 "#define B 0\n"
2943 " // Code. Not aligned with #\n"
2944 "#define C 0\n";
2945 EXPECT_EQ(Expected, format(ToFormat, Style));
2946 EXPECT_EQ(Expected, format(Expected, Style));
2947 }
Krasimir Georgievad47c902017-08-30 14:34:57 +00002948 // Test with tabs.
2949 Style.UseTab = FormatStyle::UT_Always;
2950 Style.IndentWidth = 8;
2951 Style.TabWidth = 8;
2952 verifyFormat("#ifdef _WIN32\n"
2953 "#\tdefine A 0\n"
2954 "#\tifdef VAR2\n"
2955 "#\t\tdefine B 1\n"
2956 "#\t\tinclude <someheader.h>\n"
2957 "#\t\tdefine MACRO \\\n"
2958 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
2959 "#\tendif\n"
2960 "#else\n"
2961 "#\tdefine A 1\n"
2962 "#endif",
2963 Style);
Daniel Jasper4df130f2017-09-04 13:33:52 +00002964
2965 // Regression test: Multiline-macro inside include guards.
2966 verifyFormat("#ifndef HEADER_H\n"
2967 "#define HEADER_H\n"
2968 "#define A() \\\n"
2969 " int i; \\\n"
2970 " int j;\n"
2971 "#endif // HEADER_H",
2972 getLLVMStyleWithColumns(20));
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002973}
2974
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002975TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002976 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002977}
2978
Manuel Klimek1058d982013-01-06 20:07:31 +00002979TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2980 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2981 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2982 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2983 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2984}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002985
Daniel Jaspere2408e32015-05-06 11:16:43 +00002986TEST_F(FormatTest, EscapedNewlines) {
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002987 FormatStyle Narrow = getLLVMStyleWithColumns(11);
2988 EXPECT_EQ("#define A \\\n int i; \\\n int j;",
2989 format("#define A \\\nint i;\\\n int j;", Narrow));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002990 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002991 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002992 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002993 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002994
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002995 FormatStyle AlignLeft = getLLVMStyle();
2996 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
2997 EXPECT_EQ("#define MACRO(x) \\\n"
2998 "private: \\\n"
2999 " int x(int a);\n",
3000 format("#define MACRO(x) \\\n"
3001 "private: \\\n"
3002 " int x(int a);\n",
3003 AlignLeft));
3004
3005 // CRLF line endings
3006 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;",
3007 format("#define A \\\r\nint i;\\\r\n int j;", Narrow));
3008 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
3009 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3010 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */"));
3011 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
3012 EXPECT_EQ("#define MACRO(x) \\\r\n"
3013 "private: \\\r\n"
3014 " int x(int a);\r\n",
3015 format("#define MACRO(x) \\\r\n"
3016 "private: \\\r\n"
3017 " int x(int a);\r\n",
3018 AlignLeft));
3019
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00003020 FormatStyle DontAlign = getLLVMStyle();
3021 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
3022 DontAlign.MaxEmptyLinesToKeep = 3;
3023 // FIXME: can't use verifyFormat here because the newline before
3024 // "public:" is not inserted the first time it's reformatted
3025 EXPECT_EQ("#define A \\\n"
3026 " class Foo { \\\n"
3027 " void bar(); \\\n"
3028 "\\\n"
3029 "\\\n"
3030 "\\\n"
3031 " public: \\\n"
3032 " void baz(); \\\n"
3033 " };",
3034 format("#define A \\\n"
3035 " class Foo { \\\n"
3036 " void bar(); \\\n"
3037 "\\\n"
3038 "\\\n"
3039 "\\\n"
3040 " public: \\\n"
3041 " void baz(); \\\n"
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00003042 " };",
3043 DontAlign));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003044}
3045
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003046TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3047 verifyFormat("#define A \\\n"
3048 " int v( \\\n"
3049 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003050 " int i;",
3051 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003052}
3053
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003054TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00003055 EXPECT_EQ(
3056 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3057 " \\\n"
3058 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3059 "\n"
3060 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3061 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3062 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
3063 "\\\n"
3064 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3065 " \n"
3066 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3067 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003068}
3069
Manuel Klimek52b15152013-01-09 15:25:02 +00003070TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3071 EXPECT_EQ("int\n"
3072 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003073 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003074 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003075 verifyFormat("functionCallTo(\n"
3076 " someOtherFunction(\n"
3077 " withSomeParameters, whichInSequence,\n"
3078 " areLongerThanALine(andAnotherCall,\n"
3079 "#define A B\n"
3080 " withMoreParamters,\n"
3081 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003082 " andMoreParameters),\n"
3083 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003084 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003085 verifyFormat("Foo::Foo()\n"
3086 "#ifdef BAR\n"
3087 " : baz(0)\n"
3088 "#endif\n"
3089 "{\n"
3090 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003091 verifyFormat("void f() {\n"
3092 " if (true)\n"
3093 "#ifdef A\n"
3094 " f(42);\n"
3095 " x();\n"
3096 "#else\n"
3097 " g();\n"
3098 " x();\n"
3099 "#endif\n"
3100 "}");
3101 verifyFormat("void f(param1, param2,\n"
3102 " param3,\n"
3103 "#ifdef A\n"
3104 " param4(param5,\n"
3105 "#ifdef A1\n"
3106 " param6,\n"
3107 "#ifdef A2\n"
3108 " param7),\n"
3109 "#else\n"
3110 " param8),\n"
3111 " param9,\n"
3112 "#endif\n"
3113 " param10,\n"
3114 "#endif\n"
3115 " param11)\n"
3116 "#else\n"
3117 " param12)\n"
3118 "#endif\n"
3119 "{\n"
3120 " x();\n"
3121 "}",
3122 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003123 verifyFormat("#if 1\n"
3124 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003125 verifyFormat("#if 1\n"
3126 "#endif\n"
3127 "#if 1\n"
3128 "#else\n"
3129 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003130 verifyFormat("DEBUG({\n"
3131 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3132 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3133 "});\n"
3134 "#if a\n"
3135 "#else\n"
3136 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003137
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003138 verifyIncompleteFormat("void f(\n"
3139 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00003140 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003141 "#else\n"
3142 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003143}
3144
Manuel Klimek14bd9172014-01-29 08:49:02 +00003145TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3146 verifyFormat("#endif\n"
3147 "#if B");
3148}
3149
Manuel Klimek88033d72013-10-21 08:11:15 +00003150TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3151 FormatStyle SingleLine = getLLVMStyle();
3152 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003153 verifyFormat("#if 0\n"
3154 "#elif 1\n"
3155 "#endif\n"
3156 "void foo() {\n"
3157 " if (test) foo2();\n"
3158 "}",
3159 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003160}
3161
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003162TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003163 verifyFormat("functionCall({ int i; });");
3164 verifyFormat("functionCall({\n"
3165 " int i;\n"
3166 " int j;\n"
3167 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003168 verifyFormat("functionCall(\n"
3169 " {\n"
3170 " int i;\n"
3171 " int j;\n"
3172 " },\n"
3173 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003174 verifyFormat("functionA(functionB({\n"
3175 " int i;\n"
3176 " int j;\n"
3177 " }),\n"
3178 " aaaa, bbbb, cccc);");
3179 verifyFormat("functionCall(\n"
3180 " {\n"
3181 " int i;\n"
3182 " int j;\n"
3183 " },\n"
3184 " aaaa, bbbb, // comment\n"
3185 " cccc);");
3186 verifyFormat("functionA(functionB({\n"
3187 " int i;\n"
3188 " int j;\n"
3189 " }),\n"
3190 " aaaa, bbbb, // comment\n"
3191 " cccc);");
3192 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3193 verifyFormat("functionCall(aaaa, bbbb, {\n"
3194 " int i;\n"
3195 " int j;\n"
3196 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003197 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003198 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003199 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003200 " int i; // break\n"
3201 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003202 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3203 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003204 verifyFormat("DEBUG({\n"
3205 " if (a)\n"
3206 " f();\n"
3207 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003208}
3209
3210TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003211 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003212 "int i;",
3213 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003214}
3215
3216TEST_F(FormatTest, LayoutNestedBlocks) {
3217 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3218 " struct s {\n"
3219 " int i;\n"
3220 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003221 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003222 " for (int i = 0; i < 10; ++i)\n"
3223 " return;\n"
3224 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003225 verifyFormat("call(parameter, {\n"
3226 " something();\n"
3227 " // Comment using all columns.\n"
3228 " somethingelse();\n"
3229 "});",
3230 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003231 verifyFormat("DEBUG( //\n"
3232 " { f(); }, a);");
3233 verifyFormat("DEBUG( //\n"
3234 " {\n"
3235 " f(); //\n"
3236 " },\n"
3237 " a);");
3238
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003239 EXPECT_EQ("call(parameter, {\n"
3240 " something();\n"
3241 " // Comment too\n"
3242 " // looooooooooong.\n"
3243 " somethingElse();\n"
3244 "});",
3245 format("call(parameter, {\n"
3246 " something();\n"
3247 " // Comment too looooooooooong.\n"
3248 " somethingElse();\n"
3249 "});",
3250 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003251 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003252 EXPECT_EQ("DEBUG({ // comment\n"
3253 " int i;\n"
3254 "});",
3255 format("DEBUG({ // comment\n"
3256 "int i;\n"
3257 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003258 EXPECT_EQ("DEBUG({\n"
3259 " int i;\n"
3260 "\n"
3261 " // comment\n"
3262 " int j;\n"
3263 "});",
3264 format("DEBUG({\n"
3265 " int i;\n"
3266 "\n"
3267 " // comment\n"
3268 " int j;\n"
3269 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003270
3271 verifyFormat("DEBUG({\n"
3272 " if (a)\n"
3273 " return;\n"
3274 "});");
3275 verifyGoogleFormat("DEBUG({\n"
3276 " if (a) return;\n"
3277 "});");
3278 FormatStyle Style = getGoogleStyle();
3279 Style.ColumnLimit = 45;
Krasimir Georgiev5528cac2018-10-31 17:56:57 +00003280 verifyFormat("Debug(\n"
3281 " aaaaa,\n"
3282 " {\n"
3283 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3284 " },\n"
3285 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003286 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003287
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003288 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3289
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003290 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003291}
3292
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003293TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3294 EXPECT_EQ("#define MACRO() \\\n"
3295 " Debug(aaa, /* force line break */ \\\n"
3296 " { \\\n"
3297 " int i; \\\n"
3298 " int j; \\\n"
3299 " })",
3300 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3301 " { int i; int j; })",
3302 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003303
3304 EXPECT_EQ("#define A \\\n"
3305 " [] { \\\n"
3306 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3307 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3308 " }",
3309 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3310 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3311 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003312}
3313
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003314TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3315 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003316 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003317 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003318}
3319
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003320TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3321 FormatStyle Style = getLLVMStyle();
3322 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3323 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3324 verifyFormat("FOO_BEGIN\n"
3325 " FOO_ENTRY\n"
3326 "FOO_END", Style);
3327 verifyFormat("FOO_BEGIN\n"
3328 " NESTED_FOO_BEGIN\n"
3329 " NESTED_FOO_ENTRY\n"
3330 " NESTED_FOO_END\n"
3331 "FOO_END", Style);
3332 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3333 " int x;\n"
3334 " x = 1;\n"
3335 "FOO_END(Baz)", Style);
3336}
3337
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003338//===----------------------------------------------------------------------===//
3339// Line break tests.
3340//===----------------------------------------------------------------------===//
3341
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003342TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003343 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003344 "void f() {\n"
3345 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3346 " parameter, parameter, parameter)),\n"
3347 " SecondLongCall(parameter));\n"
3348 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003349 verifyFormat(
3350 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3351 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3352 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3353 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3354 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003355 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3356 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3357 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3358 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003359 verifyFormat(
3360 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3361 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3362 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3363 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003364 verifyFormat("int a = bbbb && ccc &&\n"
3365 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003366 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003367 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003368}
3369
Daniel Jasperd69fc772013-05-08 14:12:04 +00003370TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3371 verifyFormat(
3372 "bool aaaaaaa =\n"
3373 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3374 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003375 verifyFormat(
3376 "bool aaaaaaa =\n"
3377 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3378 " bbbbbbbb();");
3379
Daniel Jasperd69fc772013-05-08 14:12:04 +00003380 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3381 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3382 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003383 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3384 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3385 " ccccccccc == ddddddddddd;");
3386 verifyFormat(
3387 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3389 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003390
3391 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3392 " aaaaaa) &&\n"
3393 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003394 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3395 " aaaaaa) >>\n"
3396 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003397 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003398 " SourceMgr.getSpellingColumnNumber(\n"
3399 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3400 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003401
Daniel Jasper68d888c2013-06-03 08:42:05 +00003402 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3403 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3404 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00003405 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3406 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3407 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003408 verifyFormat("b = a &&\n"
3409 " // Comment\n"
3410 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003411
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003412 // If the LHS of a comparison is not a binary expression itself, the
3413 // additional linebreak confuses many people.
3414 verifyFormat(
3415 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3416 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3417 "}");
3418 verifyFormat(
3419 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3420 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3421 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003422 verifyFormat(
3423 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3424 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3425 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003426 verifyFormat(
3427 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3428 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3429 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003430 // Even explicit parentheses stress the precedence enough to make the
3431 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003432 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3433 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3434 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003435 // This cases is borderline, but with the indentation it is still readable.
3436 verifyFormat(
3437 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3438 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3439 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3440 "}",
3441 getLLVMStyleWithColumns(75));
3442
3443 // If the LHS is a binary expression, we should still use the additional break
3444 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003445 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3446 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3447 " 5) {\n"
3448 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003449 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3450 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3451 " 5) {\n"
3452 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003453
Daniel Jasper571f1af2013-05-14 20:39:56 +00003454 FormatStyle OnePerLine = getLLVMStyle();
3455 OnePerLine.BinPackParameters = false;
3456 verifyFormat(
3457 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3458 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3459 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3460 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003461
3462 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3463 " .aaa(aaaaaaaaaaaaa) *\n"
3464 " aaaaaaa +\n"
3465 " aaaaaaa;",
3466 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003467}
3468
Daniel Jasper6bee6822013-04-08 20:33:42 +00003469TEST_F(FormatTest, ExpressionIndentation) {
3470 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3471 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3472 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3473 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3474 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3475 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3476 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3477 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3478 " ccccccccccccccccccccccccccccccccccccccccc;");
3479 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3480 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3481 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3482 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3483 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3484 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3485 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3486 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3487 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3488 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3489 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3490 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003491 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003492 "} else if (aaaaa && bbbbb > // break\n"
3493 " ccccc) {\n"
3494 "}");
3495 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003496 "} else if (aaaaa &&\n"
3497 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003498 " ccccc &&\n"
3499 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003500 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003501
3502 // Presence of a trailing comment used to change indentation of b.
3503 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3504 " b;\n"
3505 "return aaaaaaaaaaaaaaaaaaa +\n"
3506 " b; //",
3507 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003508}
3509
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003510TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3511 // Not sure what the best system is here. Like this, the LHS can be found
3512 // immediately above an operator (everything with the same or a higher
3513 // indent). The RHS is aligned right of the operator and so compasses
3514 // everything until something with the same indent as the operator is found.
3515 // FIXME: Is this a good system?
3516 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003517 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003518 verifyFormat(
3519 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003520 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3521 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3522 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3523 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3524 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003525 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003526 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3527 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003528 Style);
3529 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003530 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3531 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003532 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3533 Style);
3534 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003535 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3536 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003537 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3538 Style);
3539 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3540 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003541 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3542 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003543 Style);
3544 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003545 "} else if (aaaaa\n"
3546 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003547 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003548 "}",
3549 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003550 verifyFormat("return (a)\n"
3551 " // comment\n"
3552 " + b;",
3553 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003554 verifyFormat(
3555 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3556 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3557 " + cc;",
3558 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003559
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003560 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3561 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3562 Style);
3563
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003564 // Forced by comments.
3565 verifyFormat(
3566 "unsigned ContentSize =\n"
3567 " sizeof(int16_t) // DWARF ARange version number\n"
3568 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3569 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3570 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003571
3572 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3573 " == boost::fusion::at_c<1>(iiii).second;",
3574 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003575
3576 Style.ColumnLimit = 60;
3577 verifyFormat("zzzzzzzzzz\n"
3578 " = bbbbbbbbbbbbbbbbb\n"
3579 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3580 Style);
Jonas Toth4636deb2018-08-24 17:14:31 +00003581
3582 Style.ColumnLimit = 80;
3583 Style.IndentWidth = 4;
3584 Style.TabWidth = 4;
3585 Style.UseTab = FormatStyle::UT_Always;
3586 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3587 Style.AlignOperands = false;
3588 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n"
3589 "\t&& (someOtherLongishConditionPart1\n"
3590 "\t\t|| someOtherEvenLongerNestedConditionPart2);",
3591 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && (someOtherLongishConditionPart1 || someOtherEvenLongerNestedConditionPart2);",
3592 Style));
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003593}
3594
Daniel Jasperb1270392017-02-01 23:27:37 +00003595TEST_F(FormatTest, EnforcedOperatorWraps) {
3596 // Here we'd like to wrap after the || operators, but a comment is forcing an
3597 // earlier wrap.
3598 verifyFormat("bool x = aaaaa //\n"
3599 " || bbbbb\n"
3600 " //\n"
3601 " || cccc;");
3602}
3603
Daniel Jasper3219e432014-12-02 13:24:51 +00003604TEST_F(FormatTest, NoOperandAlignment) {
3605 FormatStyle Style = getLLVMStyle();
3606 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00003607 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3608 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3609 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3610 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003611 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003612 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3613 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3614 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3615 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3616 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3617 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3618 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3619 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3620 " > ccccccccccccccccccccccccccccccccccccccccc;",
3621 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003622
3623 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3624 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3625 " + cc;",
3626 Style);
3627 verifyFormat("int a = aa\n"
3628 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003629 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00003630 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003631
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003632 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003633 verifyFormat("return (a > b\n"
3634 " // comment1\n"
3635 " // comment2\n"
3636 " || c);",
3637 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003638}
3639
Daniel Jasperac043c92014-09-15 11:11:00 +00003640TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3641 FormatStyle Style = getLLVMStyle();
3642 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3643 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3644 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003645 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3646 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003647}
3648
Daniel Jasper988e7e42017-05-08 15:07:52 +00003649TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3650 FormatStyle Style = getLLVMStyle();
3651 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3652 Style.BinPackArguments = false;
3653 Style.ColumnLimit = 40;
3654 verifyFormat("void test() {\n"
3655 " someFunction(\n"
3656 " this + argument + is + quite\n"
3657 " + long + so + it + gets + wrapped\n"
3658 " + but + remains + bin - packed);\n"
3659 "}",
3660 Style);
3661 verifyFormat("void test() {\n"
3662 " someFunction(arg1,\n"
3663 " this + argument + is\n"
3664 " + quite + long + so\n"
3665 " + it + gets + wrapped\n"
3666 " + but + remains + bin\n"
3667 " - packed,\n"
3668 " arg3);\n"
3669 "}",
3670 Style);
3671 verifyFormat("void test() {\n"
3672 " someFunction(\n"
3673 " arg1,\n"
3674 " this + argument + has\n"
3675 " + anotherFunc(nested,\n"
3676 " calls + whose\n"
3677 " + arguments\n"
3678 " + are + also\n"
3679 " + wrapped,\n"
3680 " in + addition)\n"
3681 " + to + being + bin - packed,\n"
3682 " arg3);\n"
3683 "}",
3684 Style);
3685
3686 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3687 verifyFormat("void test() {\n"
3688 " someFunction(\n"
3689 " arg1,\n"
3690 " this + argument + has +\n"
3691 " anotherFunc(nested,\n"
3692 " calls + whose +\n"
3693 " arguments +\n"
3694 " are + also +\n"
3695 " wrapped,\n"
3696 " in + addition) +\n"
3697 " to + being + bin - packed,\n"
3698 " arg3);\n"
3699 "}",
3700 Style);
3701}
3702
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003703TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003704 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003705 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3706 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003707 verifyFormat("Constructor()\n"
3708 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003709 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003710 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003711 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003712 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003713
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003714 verifyFormat("template <typename T>\n"
3715 "Constructor() : Initializer(FitsOnTheLine) {}",
3716 getLLVMStyleWithColumns(45));
3717
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003718 verifyFormat(
3719 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003720 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003721
3722 verifyFormat(
3723 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003724 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003725 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003726 verifyFormat(
3727 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003728 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003729 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003730 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3731 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3732 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003733
3734 verifyFormat("Constructor()\n"
3735 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3736 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3737 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003738 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003739
Daniel Jasper65585ed2013-01-28 13:31:35 +00003740 verifyFormat("Constructor()\n"
3741 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003742 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003743
Daniel Jasper62e68172013-02-25 15:59:54 +00003744 verifyFormat("Constructor(int Parameter = 0)\n"
3745 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3746 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003747 verifyFormat("Constructor()\n"
3748 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3749 "}",
3750 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003751 verifyFormat("Constructor()\n"
3752 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3753 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003754
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003755 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003756 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003757 verifyFormat("Constructor()\n"
3758 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3759 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3760 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003761
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003762 FormatStyle OnePerLine = getLLVMStyle();
3763 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003764 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003765 verifyFormat("SomeClass::Constructor()\n"
3766 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3767 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003768 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003769 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003770 verifyFormat("SomeClass::Constructor()\n"
3771 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3772 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003773 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003774 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003775 verifyFormat("MyClass::MyClass(int var)\n"
3776 " : some_var_(var), // 4 space indent\n"
3777 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003778 "}",
3779 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003780 verifyFormat("Constructor()\n"
3781 " : aaaaa(aaaaaa),\n"
3782 " aaaaa(aaaaaa),\n"
3783 " aaaaa(aaaaaa),\n"
3784 " aaaaa(aaaaaa),\n"
3785 " aaaaa(aaaaaa) {}",
3786 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003787 verifyFormat("Constructor()\n"
3788 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3789 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3790 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003791 OnePerLine.BinPackParameters = false;
3792 verifyFormat(
3793 "Constructor()\n"
3794 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3795 " aaaaaaaaaaa().aaa(),\n"
3796 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3797 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003798 OnePerLine.ColumnLimit = 60;
3799 verifyFormat("Constructor()\n"
3800 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3801 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3802 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003803
3804 EXPECT_EQ("Constructor()\n"
3805 " : // Comment forcing unwanted break.\n"
3806 " aaaa(aaaa) {}",
3807 format("Constructor() :\n"
3808 " // Comment forcing unwanted break.\n"
3809 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003810}
3811
Francois Ferranda6b6d512017-05-24 11:36:58 +00003812TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3813 FormatStyle Style = getLLVMStyle();
3814 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3815
3816 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3817 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3818 getStyleWithColumns(Style, 45));
3819 verifyFormat("Constructor() :\n"
3820 " Initializer(FitsOnTheLine) {}",
3821 getStyleWithColumns(Style, 44));
3822 verifyFormat("Constructor() :\n"
3823 " Initializer(FitsOnTheLine) {}",
3824 getStyleWithColumns(Style, 43));
3825
3826 verifyFormat("template <typename T>\n"
3827 "Constructor() : Initializer(FitsOnTheLine) {}",
3828 getStyleWithColumns(Style, 50));
3829
3830 verifyFormat(
3831 "SomeClass::Constructor() :\n"
3832 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3833 Style);
3834
3835 verifyFormat(
3836 "SomeClass::Constructor() :\n"
3837 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3838 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3839 Style);
3840 verifyFormat(
3841 "SomeClass::Constructor() :\n"
3842 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3843 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3844 Style);
3845 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3846 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3847 " aaaaaaaaaa(aaaaaa) {}",
3848 Style);
3849
3850 verifyFormat("Constructor() :\n"
3851 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3852 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3853 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3854 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3855 Style);
3856
3857 verifyFormat("Constructor() :\n"
3858 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3859 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3860 Style);
3861
3862 verifyFormat("Constructor(int Parameter = 0) :\n"
3863 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3864 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3865 Style);
3866 verifyFormat("Constructor() :\n"
3867 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3868 "}",
3869 getStyleWithColumns(Style, 60));
3870 verifyFormat("Constructor() :\n"
3871 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3872 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3873 Style);
3874
3875 // Here a line could be saved by splitting the second initializer onto two
3876 // lines, but that is not desirable.
3877 verifyFormat("Constructor() :\n"
3878 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3879 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3880 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3881 Style);
3882
3883 FormatStyle OnePerLine = Style;
3884 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3885 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3886 verifyFormat("SomeClass::Constructor() :\n"
3887 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3888 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3889 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3890 OnePerLine);
3891 verifyFormat("SomeClass::Constructor() :\n"
3892 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3893 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3894 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3895 OnePerLine);
3896 verifyFormat("MyClass::MyClass(int var) :\n"
3897 " some_var_(var), // 4 space indent\n"
3898 " some_other_var_(var + 1) { // lined up\n"
3899 "}",
3900 OnePerLine);
3901 verifyFormat("Constructor() :\n"
3902 " aaaaa(aaaaaa),\n"
3903 " aaaaa(aaaaaa),\n"
3904 " aaaaa(aaaaaa),\n"
3905 " aaaaa(aaaaaa),\n"
3906 " aaaaa(aaaaaa) {}",
3907 OnePerLine);
3908 verifyFormat("Constructor() :\n"
3909 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3910 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3911 OnePerLine);
3912 OnePerLine.BinPackParameters = false;
3913 verifyFormat(
3914 "Constructor() :\n"
3915 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3916 " aaaaaaaaaaa().aaa(),\n"
3917 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3918 OnePerLine);
3919 OnePerLine.ColumnLimit = 60;
3920 verifyFormat("Constructor() :\n"
3921 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3922 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3923 OnePerLine);
3924
3925 EXPECT_EQ("Constructor() :\n"
3926 " // Comment forcing unwanted break.\n"
3927 " aaaa(aaaa) {}",
3928 format("Constructor() :\n"
3929 " // Comment forcing unwanted break.\n"
3930 " aaaa(aaaa) {}",
3931 Style));
3932
3933 Style.ColumnLimit = 0;
3934 verifyFormat("SomeClass::Constructor() :\n"
3935 " a(a) {}",
3936 Style);
3937 verifyFormat("SomeClass::Constructor() noexcept :\n"
3938 " a(a) {}",
3939 Style);
3940 verifyFormat("SomeClass::Constructor() :\n"
3941 " a(a), b(b), c(c) {}",
3942 Style);
3943 verifyFormat("SomeClass::Constructor() :\n"
3944 " a(a) {\n"
3945 " foo();\n"
3946 " bar();\n"
3947 "}",
3948 Style);
3949
3950 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3951 verifyFormat("SomeClass::Constructor() :\n"
3952 " a(a), b(b), c(c) {\n"
3953 "}",
3954 Style);
3955 verifyFormat("SomeClass::Constructor() :\n"
3956 " a(a) {\n"
3957 "}",
3958 Style);
3959
3960 Style.ColumnLimit = 80;
3961 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3962 Style.ConstructorInitializerIndentWidth = 2;
3963 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3964 Style);
3965 verifyFormat("SomeClass::Constructor() :\n"
3966 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3967 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3968 Style);
Francois Ferrand6bb103f2018-06-11 14:41:26 +00003969
3970 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as well
3971 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
3972 verifyFormat("class SomeClass\n"
3973 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3974 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
3975 Style);
3976 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
3977 verifyFormat("class SomeClass\n"
3978 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3979 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
3980 Style);
3981 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon;
3982 verifyFormat("class SomeClass :\n"
3983 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3984 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
3985 Style);
Francois Ferranda6b6d512017-05-24 11:36:58 +00003986}
3987
David Blaikieea95dd72017-08-31 18:49:34 +00003988#ifndef EXPENSIVE_CHECKS
3989// Expensive checks enables libstdc++ checking which includes validating the
3990// state of ranges used in std::priority_queue - this blows out the
3991// runtime/scalability of the function and makes this test unacceptably slow.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003992TEST_F(FormatTest, MemoizationTests) {
3993 // This breaks if the memoization lookup does not take \c Indent and
3994 // \c LastSpace into account.
3995 verifyFormat(
3996 "extern CFRunLoopTimerRef\n"
3997 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3998 " CFTimeInterval interval, CFOptionFlags flags,\n"
3999 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00004000 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004001
4002 // Deep nesting somewhat works around our memoization.
4003 verifyFormat(
4004 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4005 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4006 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4007 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4008 " aaaaa())))))))))))))))))))))))))))))))))))))));",
4009 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00004010 verifyFormat(
4011 "aaaaa(\n"
4012 " aaaaa,\n"
4013 " aaaaa(\n"
4014 " aaaaa,\n"
4015 " aaaaa(\n"
4016 " aaaaa,\n"
4017 " aaaaa(\n"
4018 " aaaaa,\n"
4019 " aaaaa(\n"
4020 " aaaaa,\n"
4021 " aaaaa(\n"
4022 " aaaaa,\n"
4023 " aaaaa(\n"
4024 " aaaaa,\n"
4025 " aaaaa(\n"
4026 " aaaaa,\n"
4027 " aaaaa(\n"
4028 " aaaaa,\n"
4029 " aaaaa(\n"
4030 " aaaaa,\n"
4031 " aaaaa(\n"
4032 " aaaaa,\n"
4033 " aaaaa(\n"
4034 " aaaaa,\n"
4035 " aaaaa))))))))))));",
4036 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00004037 verifyFormat(
4038 "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"
4039 " a),\n"
4040 " a),\n"
4041 " a),\n"
4042 " a),\n"
4043 " a),\n"
4044 " a),\n"
4045 " a),\n"
4046 " a),\n"
4047 " a),\n"
4048 " a),\n"
4049 " a),\n"
4050 " a),\n"
4051 " a),\n"
4052 " a),\n"
4053 " a),\n"
4054 " a),\n"
4055 " a)",
4056 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00004057
4058 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004059 FormatStyle OnePerLine = getLLVMStyle();
4060 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004061 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00004062 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00004063 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00004064 for (unsigned i = 0, e = 80; i != e; ++i) {
4065 input += " a,\n";
4066 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004067 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004068 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004069}
David Blaikieea95dd72017-08-31 18:49:34 +00004070#endif
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004071
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004072TEST_F(FormatTest, BreaksAsHighAsPossible) {
4073 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004074 "void f() {\n"
4075 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4076 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4077 " f();\n"
4078 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00004079 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004080 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004081}
4082
Daniel Jasper6728fc12013-04-11 14:29:13 +00004083TEST_F(FormatTest, BreaksFunctionDeclarations) {
4084 // Principially, we break function declarations in a certain order:
4085 // 1) break amongst arguments.
4086 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4087 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004088 verifyFormat("template <class TemplateIt>\n"
4089 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4090 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00004091
4092 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00004093 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004094 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004095 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004096 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004097
4098 // 3) break after (.
4099 verifyFormat(
4100 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00004101 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4102 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004103
4104 // 4) break before after nested name specifiers.
4105 verifyFormat(
4106 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004107 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4108 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004109 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004110
4111 // However, there are exceptions, if a sufficient amount of lines can be
4112 // saved.
4113 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4114 // more adjusting.
4115 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4116 " Cccccccccccccc cccccccccc,\n"
4117 " Cccccccccccccc cccccccccc,\n"
4118 " Cccccccccccccc cccccccccc,\n"
4119 " Cccccccccccccc cccccccccc);");
4120 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004121 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004122 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4123 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4124 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004125 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004126 verifyFormat(
4127 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4128 " Cccccccccccccc cccccccccc,\n"
4129 " Cccccccccccccc cccccccccc,\n"
4130 " Cccccccccccccc cccccccccc,\n"
4131 " Cccccccccccccc cccccccccc,\n"
4132 " Cccccccccccccc cccccccccc,\n"
4133 " Cccccccccccccc cccccccccc);");
4134 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4135 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4136 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4137 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4138 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00004139
4140 // Break after multi-line parameters.
4141 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4142 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4143 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4144 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00004145 verifyFormat("void SomeLoooooooooooongFunction(\n"
4146 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4147 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4148 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004149
4150 // Treat overloaded operators like other functions.
4151 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4152 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00004153 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4154 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00004155 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4156 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4157 verifyGoogleFormat(
4158 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4159 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004160 verifyGoogleFormat(
4161 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4162 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00004163 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4164 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4165 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4166 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00004167 verifyGoogleFormat(
4168 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4169 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4170 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00004171 verifyGoogleFormat(
4172 "template <typename T>\n"
4173 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4174 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4175 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00004176
4177 FormatStyle Style = getLLVMStyle();
4178 Style.PointerAlignment = FormatStyle::PAS_Left;
4179 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4180 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4181 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004182 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4183 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4184 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00004185}
4186
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004187TEST_F(FormatTest, TrailingReturnType) {
4188 verifyFormat("auto foo() -> int;\n");
4189 verifyFormat("struct S {\n"
4190 " auto bar() const -> int;\n"
4191 "};");
4192 verifyFormat("template <size_t Order, typename T>\n"
4193 "auto load_img(const std::string &filename)\n"
4194 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00004195 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4196 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00004197 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00004198 verifyFormat("template <typename T>\n"
4199 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4200 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00004201
4202 // Not trailing return types.
4203 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004204}
4205
Daniel Jasper5be31f72013-05-21 09:16:31 +00004206TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004207 // Avoid breaking before trailing 'const' or other trailing annotations, if
4208 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00004209 FormatStyle Style = getGoogleStyle();
4210 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00004211 verifyFormat("void someLongFunction(\n"
4212 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00004213 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00004214 verifyFormat("LoooooongReturnType\n"
4215 "someLoooooooongFunction() const {}",
4216 getLLVMStyleWithColumns(47));
4217 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4218 " const {}",
4219 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004220 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4221 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4222 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4223 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4224 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4225 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00004226 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4227 " aaaaaaaaaaa aaaaa) const override;");
4228 verifyGoogleFormat(
4229 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4230 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004231
Daniel Jasper5550de62014-02-17 07:57:46 +00004232 // Even if the first parameter has to be wrapped.
4233 verifyFormat("void someLongFunction(\n"
4234 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004235 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00004236 verifyFormat("void someLongFunction(\n"
4237 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004238 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00004239 verifyFormat("void someLongFunction(\n"
4240 " int someLongParameter) override {}",
4241 Style);
4242 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004243 " int someLongParameter) OVERRIDE {}",
4244 Style);
4245 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004246 " int someLongParameter) final {}",
4247 Style);
4248 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004249 " int someLongParameter) FINAL {}",
4250 Style);
4251 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004252 " int parameter) const override {}",
4253 Style);
4254
Daniel Jaspere3f907f2014-06-02 09:52:08 +00004255 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4256 verifyFormat("void someLongFunction(\n"
4257 " int someLongParameter) const\n"
4258 "{\n"
4259 "}",
4260 Style);
4261
Daniel Jasper5550de62014-02-17 07:57:46 +00004262 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004263 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4264 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4265 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00004266
4267 // Breaking before function-like trailing annotations is fine to keep them
4268 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004269 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4270 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4271 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4272 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4273 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4274 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004275 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4276 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004277 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004278
4279 verifyFormat(
4280 "void aaaaaaaaaaaaaaaaaa()\n"
4281 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4282 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4283 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4284 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004285 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004286 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004287 " GUARDED_BY(aaaaaaaaaaaa);");
4288 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004289 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004290 " GUARDED_BY(aaaaaaaaaaaa);");
4291 verifyGoogleFormat(
4292 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4293 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004294 verifyGoogleFormat(
4295 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4296 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004297}
4298
Daniel Jasperf090f032015-05-18 09:47:22 +00004299TEST_F(FormatTest, FunctionAnnotations) {
4300 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004301 "int OldFunction(const string &parameter) {}");
4302 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004303 "string OldFunction(const string &parameter) {}");
4304 verifyFormat("template <typename T>\n"
4305 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4306 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004307
4308 // Not function annotations.
4309 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4310 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004311 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4312 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004313 verifyFormat("MACRO(abc).function() // wrap\n"
4314 " << abc;");
4315 verifyFormat("MACRO(abc)->function() // wrap\n"
4316 " << abc;");
4317 verifyFormat("MACRO(abc)::function() // wrap\n"
4318 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004319}
4320
Daniel Jasperf7935112012-12-03 18:12:45 +00004321TEST_F(FormatTest, BreaksDesireably) {
4322 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4323 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004324 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004325 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4326 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4327 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004328
4329 verifyFormat(
4330 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004331 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004332
4333 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4334 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4335 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004336
4337 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004338 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4339 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4340 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004341 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4342 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004343
4344 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4345 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4346
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004347 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004348 "void f() {\n"
4349 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4350 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4351 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004352 verifyFormat(
4353 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4354 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4355 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004356 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4357 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4358 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004359 "aaaaaa(aaa,\n"
4360 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004361 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4362 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004363 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4364 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4365 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004366
Daniel Jasper739b85f2015-06-29 10:42:59 +00004367 // Indent consistently independent of call expression and unary operator.
4368 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4369 " dddddddddddddddddddddddddddddd));");
4370 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4371 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004372 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004373 " dddddddddddddddddddddddddddddd));");
4374
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004375 // This test case breaks on an incorrect memoization, i.e. an optimization not
4376 // taking into account the StopAt value.
4377 verifyFormat(
4378 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004379 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4380 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4381 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004382
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004383 verifyFormat("{\n {\n {\n"
4384 " Annotation.SpaceRequiredBefore =\n"
4385 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4386 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4387 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004388
4389 // Break on an outer level if there was a break on an inner level.
4390 EXPECT_EQ("f(g(h(a, // comment\n"
4391 " b, c),\n"
4392 " d, e),\n"
4393 " x, y);",
4394 format("f(g(h(a, // comment\n"
4395 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004396
4397 // Prefer breaking similar line breaks.
4398 verifyFormat(
4399 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4400 " NSTrackingMouseEnteredAndExited |\n"
4401 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004402}
4403
Daniel Jasper18210d72014-10-09 09:52:05 +00004404TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4405 FormatStyle NoBinPacking = getGoogleStyle();
4406 NoBinPacking.BinPackParameters = false;
4407 NoBinPacking.BinPackArguments = true;
4408 verifyFormat("void f() {\n"
4409 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4410 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4411 "}",
4412 NoBinPacking);
4413 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4414 " int aaaaaaaaaaaaaaaaaaaa,\n"
4415 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4416 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004417
Daniel Jasper00693b082016-01-09 15:56:47 +00004418 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4419 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4420 " vector<int> bbbbbbbbbbbbbbb);",
4421 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004422 // FIXME: This behavior difference is probably not wanted. However, currently
4423 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4424 // template arguments from BreakBeforeParameter being set because of the
4425 // one-per-line formatting.
4426 verifyFormat(
4427 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4428 " aaaaaaaaaa> aaaaaaaaaa);",
4429 NoBinPacking);
4430 verifyFormat(
4431 "void fffffffffff(\n"
4432 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4433 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004434}
4435
Daniel Jasper9278eb92013-01-16 14:59:02 +00004436TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004437 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004438 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004439 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004440 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4441 " aaaaaaaaaaaaaaaaaaaa,\n"
4442 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4443 NoBinPacking);
4444 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4445 " aaaaaaaaaaaaa,\n"
4446 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4447 NoBinPacking);
4448 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004449 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4450 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4451 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4452 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004453 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4454 NoBinPacking);
4455 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4456 " .aaaaaaaaaaaaaaaaaa();",
4457 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004458 verifyFormat("void f() {\n"
4459 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4460 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4461 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004462 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004463
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004464 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004465 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4466 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004467 " aaaaaaaaaaaa);",
4468 NoBinPacking);
4469 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004470 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4471 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004472 " test);",
4473 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004474
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004475 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4476 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004477 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4478 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004479 NoBinPacking);
4480 verifyFormat("a(\"a\"\n"
4481 " \"a\",\n"
4482 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004483
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004484 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004485 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004486 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004487 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004488 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004489 verifyFormat(
4490 "void f() {\n"
4491 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4492 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004493 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004494 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004495 verifyFormat(
4496 "template <class SomeType, class SomeOtherType>\n"
4497 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4498 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004499}
4500
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004501TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4502 FormatStyle Style = getLLVMStyleWithColumns(15);
4503 Style.ExperimentalAutoDetectBinPacking = true;
4504 EXPECT_EQ("aaa(aaaa,\n"
4505 " aaaa,\n"
4506 " aaaa);\n"
4507 "aaa(aaaa,\n"
4508 " aaaa,\n"
4509 " aaaa);",
4510 format("aaa(aaaa,\n" // one-per-line
4511 " aaaa,\n"
4512 " aaaa );\n"
4513 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4514 Style));
4515 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4516 " aaaa);\n"
4517 "aaa(aaaa, aaaa,\n"
4518 " aaaa);",
4519 format("aaa(aaaa, aaaa,\n" // bin-packed
4520 " aaaa );\n"
4521 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4522 Style));
4523}
4524
Daniel Jasper04468962013-01-18 10:56:38 +00004525TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004526 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4527 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4528 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4529 " .StartsWith(\".init\", ORDER_INIT)\n"
4530 " .StartsWith(\".fini\", ORDER_FINI)\n"
4531 " .StartsWith(\".hash\", ORDER_HASH)\n"
4532 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004533
Daniel Jaspereb50c672013-02-15 20:33:06 +00004534 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004535 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004536 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004537 "aaaaaaa->aaaaaaa\n"
4538 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4539 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004540 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004541 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004542 "aaaaaaa->aaaaaaa\n"
4543 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4544 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4545 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004546 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004547 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004548 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004549 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4550 " aaaaaa->aaaaaaaaaaaa()\n"
4551 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004552 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004553 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004554 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004555 "void f() {\n"
4556 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004557 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004558 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004559 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004560 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004561 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004562 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004563 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004564 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004565 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004566 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004567 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004568
4569 verifyFormat(
4570 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4571 verifyFormat("aaaaaaaaaaaaaaa()\n"
4572 " .aaaaaaaaaaaaaaa()\n"
4573 " .aaaaaaaaaaaaaaa()\n"
4574 " .aaaaaaaaaaaaaaa()\n"
4575 " .aaaaaaaaaaaaaaa();");
4576 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4577 " .aaaaaaaaaaaaaaa()\n"
4578 " .aaaaaaaaaaaaaaa()\n"
4579 " .aaaaaaaaaaaaaaa();");
4580 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4581 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4582 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004583 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4584 " ->aaaaaaaaaaaaaae(0)\n"
4585 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004586
Daniel Jasper775954b2015-04-24 10:08:09 +00004587 // Don't linewrap after very short segments.
4588 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4589 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4590 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4591 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4592 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4593 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4594 verifyFormat("aaa()\n"
4595 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4596 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4597 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4598
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004599 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4600 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4601 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4602 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4603 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004604 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004605
Daniel Jaspera41aa532014-09-19 08:01:25 +00004606 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004607 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4608 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004609
4610 // Prefer not to create "hanging" indents.
4611 verifyFormat(
4612 "return !soooooooooooooome_map\n"
4613 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4614 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004615 verifyFormat(
4616 "return aaaaaaaaaaaaaaaa\n"
4617 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4618 " .aaaa(aaaaaaaaaaaaaa);");
4619 // No hanging indent here.
4620 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4621 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4622 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4623 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004624 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4625 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4626 getLLVMStyleWithColumns(60));
4627 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4628 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4629 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4630 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004631 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4632 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4633 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Ilya Biryukov370eff82018-09-17 07:46:20 +00004634
4635 // Dont break if only closing statements before member call
4636 verifyFormat("test() {\n"
4637 " ([]() -> {\n"
4638 " int b = 32;\n"
4639 " return 3;\n"
4640 " }).foo();\n"
4641 "}");
4642 verifyFormat("test() {\n"
4643 " (\n"
4644 " []() -> {\n"
4645 " int b = 32;\n"
4646 " return 3;\n"
4647 " },\n"
4648 " foo, bar)\n"
4649 " .foo();\n"
4650 "}");
4651 verifyFormat("test() {\n"
4652 " ([]() -> {\n"
4653 " int b = 32;\n"
4654 " return 3;\n"
4655 " })\n"
4656 " .foo()\n"
4657 " .bar();\n"
4658 "}");
4659 verifyFormat("test() {\n"
4660 " ([]() -> {\n"
4661 " int b = 32;\n"
4662 " return 3;\n"
4663 " })\n"
4664 " .foo(\"aaaaaaaaaaaaaaaaa\"\n"
4665 " \"bbbb\");\n"
4666 "}",
4667 getLLVMStyleWithColumns(30));
Daniel Jasper04468962013-01-18 10:56:38 +00004668}
4669
Daniel Jasperde5c2072012-12-24 00:13:23 +00004670TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4671 verifyFormat(
4672 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004673 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004674 verifyFormat(
4675 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4676 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4677
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004678 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004679 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004680 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4681 " ccccccccccccccccccccccccc) {\n}");
4682
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004683 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004684 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004685 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4686 " ccccccccccccccccccccccccc) {\n}");
4687
Daniel Jasperde5c2072012-12-24 00:13:23 +00004688 verifyFormat(
4689 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004690 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004691 verifyFormat(
4692 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4693 " ccccccccccccccccccccccccc) {\n}");
4694
Daniel Jasper400adc62013-02-08 15:28:42 +00004695 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4696 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4697 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4698 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004699 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4700 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4701 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4702 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4703
Daniel Jasper400adc62013-02-08 15:28:42 +00004704 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4705 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4706 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004707 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4708 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4709 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004710}
4711
Daniel Jasper43b65482013-01-23 12:27:43 +00004712TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004713 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004714 "unsigned Cost =\n"
4715 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4716 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004717 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004718 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4719 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004720
4721 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004722 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4723 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004724 verifyFormat("unsigned OriginalStartColumn =\n"
4725 " SourceMgr.getSpellingColumnNumber(\n"
4726 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4727 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004728}
4729
Francois Ferrand9976efa2017-05-22 08:28:17 +00004730TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4731 FormatStyle Style = getLLVMStyle();
4732 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4733 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4734 Style);
4735
4736 Style.PenaltyBreakAssignment = 20;
4737 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4738 " cccccccccccccccccccccccccc;",
4739 Style);
4740}
4741
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004742TEST_F(FormatTest, AlignsAfterAssignments) {
4743 verifyFormat(
4744 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004745 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004746 verifyFormat(
4747 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004748 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004749 verifyFormat(
4750 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004751 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004752 verifyFormat(
4753 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004754 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004755 verifyFormat(
4756 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4757 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4758 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004759}
4760
4761TEST_F(FormatTest, AlignsAfterReturn) {
4762 verifyFormat(
4763 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4764 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4765 verifyFormat(
4766 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4767 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004768 verifyFormat(
4769 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004770 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004771 verifyFormat(
4772 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004773 " aaaaaaaaaaaaaaaaaaaaaa());");
4774 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4775 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4776 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4777 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4778 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004779 verifyFormat("return\n"
4780 " // true if code is one of a or b.\n"
4781 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004782}
4783
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004784TEST_F(FormatTest, AlignsAfterOpenBracket) {
4785 verifyFormat(
4786 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4787 " aaaaaaaaa aaaaaaa) {}");
4788 verifyFormat(
4789 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4790 " aaaaaaaaaaa aaaaaaaaa);");
4791 verifyFormat(
4792 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4793 " aaaaaaaaaaaaaaaaaaaaa));");
4794 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004795 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004796 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4797 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4798 Style);
4799 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4800 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4801 Style);
4802 verifyFormat("SomeLongVariableName->someFunction(\n"
4803 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4804 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004805 verifyFormat(
4806 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4807 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4808 Style);
4809 verifyFormat(
4810 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4811 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4812 Style);
4813 verifyFormat(
4814 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4815 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4816 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004817
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004818 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4819 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4820 " b));",
4821 Style);
4822
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004823 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4824 Style.BinPackArguments = false;
4825 Style.BinPackParameters = false;
4826 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4827 " aaaaaaaaaaa aaaaaaaa,\n"
4828 " aaaaaaaaa aaaaaaa,\n"
4829 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4830 Style);
4831 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4832 " aaaaaaaaaaa aaaaaaaaa,\n"
4833 " aaaaaaaaaaa aaaaaaaaa,\n"
4834 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4835 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004836 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4837 " aaaaaaaaaaaaaaa,\n"
4838 " aaaaaaaaaaaaaaaaaaaaa,\n"
4839 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004840 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004841 verifyFormat(
4842 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4843 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4844 Style);
4845 verifyFormat(
4846 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4847 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4848 Style);
4849 verifyFormat(
4850 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4851 " aaaaaaaaaaaaaaaaaaaaa(\n"
4852 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4853 " aaaaaaaaaaaaaaaa);",
4854 Style);
4855 verifyFormat(
4856 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4857 " aaaaaaaaaaaaaaaaaaaaa(\n"
4858 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4859 " aaaaaaaaaaaaaaaa);",
4860 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004861}
4862
Daniel Jasper3219e432014-12-02 13:24:51 +00004863TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4864 FormatStyle Style = getLLVMStyleWithColumns(40);
4865 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4866 " bbbbbbbbbbbbbbbbbbbbbb);",
4867 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004868 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004869 Style.AlignOperands = false;
4870 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4871 " bbbbbbbbbbbbbbbbbbbbbb);",
4872 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004873 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004874 Style.AlignOperands = true;
4875 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4876 " bbbbbbbbbbbbbbbbbbbbbb);",
4877 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004878 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004879 Style.AlignOperands = false;
4880 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4881 " bbbbbbbbbbbbbbbbbbbbbb);",
4882 Style);
4883}
4884
Daniel Jasper399d24b2013-01-09 07:06:56 +00004885TEST_F(FormatTest, BreaksConditionalExpressions) {
4886 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004887 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4888 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4889 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4890 verifyFormat(
4891 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004892 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4893 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004894 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004895 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4896 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4897 verifyFormat(
4898 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004899 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4900 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004901 verifyFormat(
4902 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4903 " : aaaaaaaaaaaaa);");
4904 verifyFormat(
4905 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004906 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004907 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4908 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004909 verifyFormat(
4910 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4911 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4912 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004913 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4914 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4915 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4916 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4917 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4918 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4919 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4920 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4921 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4922 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4923 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4924 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004925 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4926 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4927 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4928 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4929 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004930 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4931 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4932 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004933 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4934 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4935 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4936 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004937 verifyFormat(
4938 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4939 " ? aaaaaaaaaaaaaaa\n"
4940 " : aaaaaaaaaaaaaaa;");
4941 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004942 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004943 " ? b\n"
4944 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004945 verifyFormat("return aaaa == bbbb\n"
4946 " // comment\n"
4947 " ? aaaa\n"
4948 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004949 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004950 " format(TheLine.First,\n"
4951 " IndentForLevel[TheLine.Level] >= 0\n"
4952 " ? IndentForLevel[TheLine.Level]\n"
4953 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004954 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004955 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004956 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4957 " ? aaaaaaaaaaaaaaa\n"
4958 " : bbbbbbbbbbbbbbb //\n"
4959 " ? ccccccccccccccc\n"
4960 " : ddddddddddddddd;");
4961 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4962 " ? aaaaaaaaaaaaaaa\n"
4963 " : (bbbbbbbbbbbbbbb //\n"
4964 " ? ccccccccccccccc\n"
4965 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004966 verifyFormat(
4967 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4968 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4969 " aaaaaaaaaaaaaaaaaaaaa +\n"
4970 " aaaaaaaaaaaaaaaaaaaaa\n"
4971 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004972 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004973 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4974 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4975 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004976
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004977 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004978 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004979 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004980 "void f() {\n"
4981 " g(aaa,\n"
4982 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4983 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4984 " ? aaaaaaaaaaaaaaa\n"
4985 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004986 "}",
4987 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004988 verifyFormat(
4989 "void f() {\n"
4990 " g(aaa,\n"
4991 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4992 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4993 " ?: aaaaaaaaaaaaaaa);\n"
4994 "}",
4995 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004996
4997 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4998 " // comment.\n"
4999 " ccccccccccccccccccccccccccccccccccccccc\n"
5000 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5001 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00005002
5003 // Assignments in conditional expressions. Apparently not uncommon :-(.
5004 verifyFormat("return a != b\n"
5005 " // comment\n"
5006 " ? a = b\n"
5007 " : a = b;");
5008 verifyFormat("return a != b\n"
5009 " // comment\n"
5010 " ? a = a != b\n"
5011 " // comment\n"
5012 " ? a = b\n"
5013 " : a\n"
5014 " : a;\n");
5015 verifyFormat("return a != b\n"
5016 " // comment\n"
5017 " ? a\n"
5018 " : a = a != b\n"
5019 " // comment\n"
5020 " ? a = b\n"
5021 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00005022}
5023
Daniel Jasper165b29e2013-11-08 00:57:11 +00005024TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5025 FormatStyle Style = getLLVMStyle();
5026 Style.BreakBeforeTernaryOperators = false;
5027 Style.ColumnLimit = 70;
5028 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005029 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5030 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5031 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5032 Style);
5033 verifyFormat(
5034 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005035 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5036 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005037 Style);
5038 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005039 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5040 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5041 Style);
5042 verifyFormat(
5043 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005044 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5045 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005046 Style);
5047 verifyFormat(
5048 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5049 " aaaaaaaaaaaaa);",
5050 Style);
5051 verifyFormat(
5052 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5053 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5054 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5055 " aaaaaaaaaaaaa);",
5056 Style);
5057 verifyFormat(
5058 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5059 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5060 " aaaaaaaaaaaaa);",
5061 Style);
5062 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5064 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5065 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5066 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5067 Style);
5068 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5069 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5070 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5071 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5072 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5073 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5074 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5075 Style);
5076 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5077 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5078 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5079 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5080 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5081 Style);
5082 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5083 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5084 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5085 Style);
5086 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00005087 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00005088 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5089 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5090 Style);
5091 verifyFormat(
5092 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5093 " aaaaaaaaaaaaaaa :\n"
5094 " aaaaaaaaaaaaaaa;",
5095 Style);
5096 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5097 " aaaaaaaaa ?\n"
5098 " b :\n"
5099 " c);",
5100 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00005101 verifyFormat("unsigned Indent =\n"
5102 " format(TheLine.First,\n"
5103 " IndentForLevel[TheLine.Level] >= 0 ?\n"
5104 " IndentForLevel[TheLine.Level] :\n"
5105 " TheLine * 2,\n"
5106 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
5107 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005108 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5109 " aaaaaaaaaaaaaaa :\n"
5110 " bbbbbbbbbbbbbbb ? //\n"
5111 " ccccccccccccccc :\n"
5112 " ddddddddddddddd;",
5113 Style);
5114 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5115 " aaaaaaaaaaaaaaa :\n"
5116 " (bbbbbbbbbbbbbbb ? //\n"
5117 " ccccccccccccccc :\n"
5118 " ddddddddddddddd);",
5119 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00005120 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5121 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5122 " ccccccccccccccccccccccccccc;",
5123 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00005124 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5125 " aaaaa :\n"
5126 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
5127 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005128}
5129
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005130TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5131 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5132 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5133 verifyFormat("bool a = true, b = false;");
5134
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005135 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005136 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005137 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00005138 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005139 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00005140 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005141 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00005142 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00005143 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5144 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5145 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5146 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5147 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5148 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005149
Daniel Jasperbea1ab42015-03-01 18:55:26 +00005150 FormatStyle Style = getGoogleStyle();
5151 Style.PointerAlignment = FormatStyle::PAS_Left;
5152 Style.DerivePointerAlignment = false;
5153 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5154 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5155 " *b = bbbbbbbbbbbbbbbbbbb;",
5156 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00005157 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5158 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5159 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00005160 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00005161 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005162}
5163
Nico Weber4a5030c2013-01-12 01:28:06 +00005164TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5165 verifyFormat("arr[foo ? bar : baz];");
5166 verifyFormat("f()[foo ? bar : baz];");
5167 verifyFormat("(a + b)[foo ? bar : baz];");
5168 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5169}
5170
Daniel Jasperf7935112012-12-03 18:12:45 +00005171TEST_F(FormatTest, AlignsStringLiterals) {
5172 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5173 " \"short literal\");");
5174 verifyFormat(
5175 "looooooooooooooooooooooooongFunction(\n"
5176 " \"short literal\"\n"
5177 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005178 verifyFormat("someFunction(\"Always break between multi-line\"\n"
5179 " \" string literals\",\n"
5180 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005181 EXPECT_EQ("fun + \"1243\" /* comment */\n"
5182 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005183 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00005184 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005185 getLLVMStyleWithColumns(28)));
5186 EXPECT_EQ(
5187 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5188 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5189 " \"aaaaaaaaaaaaaaaa\";",
5190 format("aaaaaa ="
5191 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5192 "aaaaaaaaaaaaaaaaaaaaa\" "
5193 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005194 verifyFormat("a = a + \"a\"\n"
5195 " \"a\"\n"
5196 " \"a\";");
5197 verifyFormat("f(\"a\", \"b\"\n"
5198 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005199
5200 verifyFormat(
5201 "#define LL_FORMAT \"ll\"\n"
5202 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5203 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00005204
5205 verifyFormat("#define A(X) \\\n"
5206 " \"aaaaa\" #X \"bbbbbb\" \\\n"
5207 " \"ccccc\"",
5208 getLLVMStyleWithColumns(23));
5209 verifyFormat("#define A \"def\"\n"
5210 "f(\"abc\" A \"ghi\"\n"
5211 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005212
5213 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005214 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005215 verifyFormat("#define A(X) \\\n"
5216 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5217 " L\"ccccc\"",
5218 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00005219
5220 verifyFormat("f(@\"a\"\n"
5221 " @\"b\");");
5222 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00005223 " @\"b\"\n"
5224 " @\"c\";");
5225 verifyFormat("NSString s = @\"a\"\n"
5226 " \"b\"\n"
5227 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00005228}
5229
Zachary Turner448592e2015-12-18 22:20:15 +00005230TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005231 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005232 // No declarations or definitions should be moved to own line.
5233 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5234 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005235 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005236 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005237 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005238 "int f() { return 1; }\n"
5239 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005240 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00005241
5242 // All declarations and definitions should have the return type moved to its
5243 // own
5244 // line.
5245 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5246 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005247 " int\n"
5248 " f() {\n"
5249 " return 1;\n"
5250 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005251 " int\n"
5252 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005253 "};\n"
5254 "int\n"
5255 "f() {\n"
5256 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005257 "}\n"
5258 "int\n"
5259 "g();\n",
5260 Style);
5261
5262 // Top-level definitions, and no kinds of declarations should have the
5263 // return type moved to its own line.
5264 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5265 verifyFormat("class B {\n"
5266 " int f() { return 1; }\n"
5267 " int g();\n"
5268 "};\n"
5269 "int\n"
5270 "f() {\n"
5271 " return 1;\n"
5272 "}\n"
5273 "int g();\n",
5274 Style);
5275
5276 // Top-level definitions and declarations should have the return type moved
5277 // to its own line.
5278 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5279 verifyFormat("class C {\n"
5280 " int f() { return 1; }\n"
5281 " int g();\n"
5282 "};\n"
5283 "int\n"
5284 "f() {\n"
5285 " return 1;\n"
5286 "}\n"
5287 "int\n"
5288 "g();\n",
5289 Style);
5290
5291 // All definitions should have the return type moved to its own line, but no
5292 // kinds of declarations.
5293 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5294 verifyFormat("class D {\n"
5295 " int\n"
5296 " f() {\n"
5297 " return 1;\n"
5298 " }\n"
5299 " int g();\n"
5300 "};\n"
5301 "int\n"
5302 "f() {\n"
5303 " return 1;\n"
5304 "}\n"
5305 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005306 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005307 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005308 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005309 " return \"\";\n"
5310 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005311 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005312 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005313 verifyFormat("template <class T>\n"
5314 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005315 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005316 " return NULL;\n"
5317 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005318 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005319 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005320 verifyFormat("class C {\n"
5321 " int\n"
5322 " operator+() {\n"
5323 " return 1;\n"
5324 " }\n"
5325 " int\n"
5326 " operator()() {\n"
5327 " return 1;\n"
5328 " }\n"
5329 "};\n",
5330 Style);
5331 verifyFormat("void\n"
5332 "A::operator()() {}\n"
5333 "void\n"
5334 "A::operator>>() {}\n"
5335 "void\n"
5336 "A::operator+() {}\n",
5337 Style);
5338 verifyFormat("void *operator new(std::size_t s);", // No break here.
5339 Style);
5340 verifyFormat("void *\n"
5341 "operator new(std::size_t s) {}",
5342 Style);
5343 verifyFormat("void *\n"
5344 "operator delete[](void *ptr) {}",
5345 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005346 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005347 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005348 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005349 "{\n"
5350 " return \"\";\n"
5351 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005352 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005353 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005354 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005355 "T *\n" // Problem here: no line break
5356 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005357 "{\n"
5358 " return NULL;\n"
5359 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005360 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005361 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005362}
5363
Alexander Kornienko58611712013-07-04 12:02:44 +00005364TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5365 FormatStyle NoBreak = getLLVMStyle();
5366 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5367 FormatStyle Break = getLLVMStyle();
5368 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005369 verifyFormat("aaaa = \"bbbb\"\n"
5370 " \"cccc\";",
5371 NoBreak);
5372 verifyFormat("aaaa =\n"
5373 " \"bbbb\"\n"
5374 " \"cccc\";",
5375 Break);
5376 verifyFormat("aaaa(\"bbbb\"\n"
5377 " \"cccc\");",
5378 NoBreak);
5379 verifyFormat("aaaa(\n"
5380 " \"bbbb\"\n"
5381 " \"cccc\");",
5382 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005383 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5384 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005385 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005386 verifyFormat("aaaa(qqq,\n"
5387 " \"bbbb\"\n"
5388 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005389 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005390 verifyFormat("aaaa(qqq,\n"
5391 " L\"bbbb\"\n"
5392 " L\"cccc\");",
5393 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005394 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5395 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005396 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005397 verifyFormat("string s = someFunction(\n"
5398 " \"abc\"\n"
5399 " \"abc\");",
5400 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005401
Daniel Jasper3251fff2014-06-10 06:27:23 +00005402 // As we break before unary operators, breaking right after them is bad.
5403 verifyFormat("string foo = abc ? \"x\"\n"
5404 " \"blah blah blah blah blah blah\"\n"
5405 " : \"y\";",
5406 Break);
5407
Daniel Jasperc834c702013-07-17 15:38:19 +00005408 // Don't break if there is no column gain.
5409 verifyFormat("f(\"aaaa\"\n"
5410 " \"bbbb\");",
5411 Break);
5412
5413 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005414 EXPECT_EQ("x = \"a\\\n"
5415 "b\\\n"
5416 "c\";",
5417 format("x = \"a\\\n"
5418 "b\\\n"
5419 "c\";",
5420 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005421 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005422 " \"a\\\n"
5423 "b\\\n"
5424 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005425 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005426 "b\\\n"
5427 "c\";",
5428 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005429
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00005430 EXPECT_EQ("NSString *const kString =\n"
5431 " @\"aaaa\"\n"
5432 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005433 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005434 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005435 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005436
5437 Break.ColumnLimit = 0;
5438 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005439}
5440
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005441TEST_F(FormatTest, AlignsPipes) {
5442 verifyFormat(
5443 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5444 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5445 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5446 verifyFormat(
5447 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5448 " << aaaaaaaaaaaaaaaaaaaa;");
5449 verifyFormat(
5450 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5451 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5452 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005453 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5454 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5455 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005456 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5457 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5458 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5459 verifyFormat(
5460 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5461 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5462 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005463 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5464 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5465 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5466 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005467 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5468 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005469 verifyFormat(
5470 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5471 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00005472 verifyFormat(
5473 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5474 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005475
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005476 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5477 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005478 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5479 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5480 " aaaaaaaaaaaaaaaaaaaaa)\n"
5481 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005482 verifyFormat("LOG_IF(aaa == //\n"
5483 " bbb)\n"
5484 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005485
Daniel Jasper467ddb12013-08-12 12:58:05 +00005486 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005487 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5488 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005489 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5490 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5491 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005492 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5493 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005494 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5495 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5496 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5497 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5498 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5499 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5500 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005501
Daniel Jasperc238c872013-04-02 14:33:13 +00005502 verifyFormat(
5503 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5504 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005505
5506 // Incomplete string literal.
5507 EXPECT_EQ("llvm::errs() << \"\n"
5508 " << a;",
5509 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005510
5511 verifyFormat("void f() {\n"
5512 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5513 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5514 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005515
5516 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005517 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5518 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5519 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005520
5521 // Handle '\n'.
5522 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5523 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5524 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5525 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5526 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5527 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5528 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005529}
5530
Daniel Jasper7209bb92016-12-13 11:16:42 +00005531TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5532 verifyFormat("return out << \"somepacket = {\\n\"\n"
5533 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5534 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5535 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5536 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5537 " << \"}\";");
5538
5539 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5540 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5541 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5542 verifyFormat(
5543 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5544 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5545 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5546 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5547 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5548 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5549 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5550 verifyFormat(
5551 "void f() {\n"
5552 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5553 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5554 "}");
5555
5556 // Breaking before the first "<<" is generally not desirable.
5557 verifyFormat(
5558 "llvm::errs()\n"
5559 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5560 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5561 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5562 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5563 getLLVMStyleWithColumns(70));
5564 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5565 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5566 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5567 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5568 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5569 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5570 getLLVMStyleWithColumns(70));
5571
5572 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5573 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5574 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5575 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5576 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5577 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005578 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5579 " (aaaa + aaaa);",
5580 getLLVMStyleWithColumns(40));
5581 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5582 " (aaaaaaa + aaaaa));",
5583 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005584 verifyFormat(
5585 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5586 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5587 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005588}
5589
Daniel Jasperf7935112012-12-03 18:12:45 +00005590TEST_F(FormatTest, UnderstandsEquals) {
5591 verifyFormat(
5592 "aaaaaaaaaaaaaaaaa =\n"
5593 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5594 verifyFormat(
5595 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005596 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005597 verifyFormat(
5598 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005599 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005600 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005601 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5602 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005603
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005604 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5605 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005606}
5607
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005608TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005609 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5610 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005611
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005612 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5613 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005614
5615 verifyFormat(
5616 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5617 " Parameter2);");
5618
5619 verifyFormat(
5620 "ShortObject->shortFunction(\n"
5621 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5622 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5623
5624 verifyFormat("loooooooooooooongFunction(\n"
5625 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5626
5627 verifyFormat(
5628 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5629 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5630
Daniel Jasper687af3b2013-02-14 14:26:07 +00005631 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5632 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005633 verifyFormat("void f() {\n"
5634 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5635 " .Times(2)\n"
5636 " .WillRepeatedly(Return(SomeValue));\n"
5637 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005638 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5639 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005640 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005641 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5642 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005643 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005644 verifyFormat("void f() {\n"
5645 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5646 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5647 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005648 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5649 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5650 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5651 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5652 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005653 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5654 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5655 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5656 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5657 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005658
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005659 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005660 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005661 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005662 verifyFormat(
5663 "aaaaaaaaaaa->aaaaaaaaa(\n"
5664 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5665 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005666
5667 verifyFormat(
5668 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5669 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005670 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5671 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5672 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5673 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005674
Daniel Jasper9b334242013-03-15 14:57:30 +00005675 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005676 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5677 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005678
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005679 FormatStyle NoBinPacking = getLLVMStyle();
5680 NoBinPacking.BinPackParameters = false;
5681 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5682 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5683 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5684 " aaaaaaaaaaaaaaaaaaa,\n"
5685 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5686 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005687
5688 // If there is a subsequent call, change to hanging indentation.
5689 verifyFormat(
5690 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5691 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5692 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5693 verifyFormat(
5694 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5695 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005696 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5697 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5698 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5699 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5700 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5701 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005702}
5703
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005704TEST_F(FormatTest, WrapsTemplateDeclarations) {
5705 verifyFormat("template <typename T>\n"
5706 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005707 verifyFormat("template <typename T>\n"
5708 "// T should be one of {A, B}.\n"
5709 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005710 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005711 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005712 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005713 verifyFormat("template <typename T>\n"
5714 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5715 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005716 verifyFormat(
5717 "template <typename T>\n"
5718 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5719 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005720 verifyFormat(
5721 "template <typename T>\n"
5722 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5723 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5724 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005725 verifyFormat("template <typename T>\n"
5726 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005727 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005728 verifyFormat(
5729 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5730 " typename T4 = char>\n"
5731 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005732 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5733 " template <typename> class cccccccccccccccccccccc,\n"
5734 " typename ddddddddddddd>\n"
5735 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005736 verifyFormat(
5737 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5738 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005739
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005740 verifyFormat("void f() {\n"
5741 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5742 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5743 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005744
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005745 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005746 verifyFormat("template <typename T> void f();");
5747 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005748 verifyFormat(
5749 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5750 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5752 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5753 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5754 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5755 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5756 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005757 EXPECT_EQ("static_cast<A< //\n"
5758 " B> *>(\n"
5759 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00005760 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00005761 format("static_cast<A<//\n"
5762 " B>*>(\n"
5763 "\n"
5764 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005765 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5766 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005767
5768 FormatStyle AlwaysBreak = getLLVMStyle();
Francois Ferrand58e6fe52018-05-16 08:25:03 +00005769 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005770 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5771 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5772 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5773 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5774 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5775 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5776 verifyFormat("template <template <typename> class Fooooooo,\n"
5777 " template <typename> class Baaaaaaar>\n"
5778 "struct C {};",
5779 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005780 verifyFormat("template <typename T> // T can be A, B or C.\n"
5781 "struct C {};",
5782 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005783 verifyFormat("template <enum E> class A {\n"
5784 "public:\n"
5785 " E *f();\n"
5786 "};");
Francois Ferrand58e6fe52018-05-16 08:25:03 +00005787
5788 FormatStyle NeverBreak = getLLVMStyle();
5789 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
5790 verifyFormat("template <typename T> class C {};", NeverBreak);
5791 verifyFormat("template <typename T> void f();", NeverBreak);
5792 verifyFormat("template <typename T> void f() {}", NeverBreak);
5793 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
5794 NeverBreak);
5795 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5796 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5797 " ccccccccccccccccccccccccccccccccccccccccccccccc);",
5798 NeverBreak);
5799 verifyFormat("template <template <typename> class Fooooooo,\n"
5800 " template <typename> class Baaaaaaar>\n"
5801 "struct C {};",
5802 NeverBreak);
5803 verifyFormat("template <typename T> // T can be A, B or C.\n"
5804 "struct C {};",
5805 NeverBreak);
5806 verifyFormat("template <enum E> class A {\n"
5807 "public:\n"
5808 " E *f();\n"
5809 "};", NeverBreak);
5810 NeverBreak.PenaltyBreakTemplateDeclaration = 100;
5811 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
5812 NeverBreak);
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005813}
5814
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005815TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
5816 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
5817 Style.ColumnLimit = 60;
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005818 EXPECT_EQ("// Baseline - no comments.\n"
5819 "template <\n"
5820 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
5821 "void f() {}",
5822 format("// Baseline - no comments.\n"
5823 "template <\n"
5824 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
5825 "void f() {}",
5826 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005827
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005828 EXPECT_EQ("template <\n"
5829 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5830 "void f() {}",
5831 format("template <\n"
5832 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5833 "void f() {}",
5834 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005835
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005836 EXPECT_EQ(
5837 "template <\n"
5838 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
5839 "void f() {}",
5840 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
5841 "void f() {}",
5842 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005843
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005844 EXPECT_EQ(
5845 "template <\n"
5846 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5847 " // multiline\n"
5848 "void f() {}",
5849 format("template <\n"
5850 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5851 " // multiline\n"
5852 "void f() {}",
5853 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005854
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005855 EXPECT_EQ(
5856 "template <typename aaaaaaaaaa<\n"
5857 " bbbbbbbbbbbb>::value> // trailing loooong\n"
5858 "void f() {}",
5859 format(
5860 "template <\n"
5861 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
5862 "void f() {}",
5863 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005864}
5865
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005866TEST_F(FormatTest, WrapsTemplateParameters) {
5867 FormatStyle Style = getLLVMStyle();
5868 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5869 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5870 verifyFormat(
5871 "template <typename... a> struct q {};\n"
5872 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5873 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5874 " y;",
5875 Style);
5876 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5877 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5878 verifyFormat(
5879 "template <typename... a> struct r {};\n"
5880 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5881 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5882 " y;",
5883 Style);
5884 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5885 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5886 verifyFormat(
5887 "template <typename... a> struct s {};\n"
5888 "extern s<\n"
5889 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5890 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5891 " y;",
5892 Style);
5893 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5894 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5895 verifyFormat(
5896 "template <typename... a> struct t {};\n"
5897 "extern t<\n"
5898 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5899 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5900 " y;",
5901 Style);
5902}
5903
Daniel Jasper45797022013-01-25 10:57:27 +00005904TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5905 verifyFormat(
5906 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5907 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5908 verifyFormat(
5909 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5910 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5911 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5912
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005913 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005914 verifyFormat(
5915 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5916 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005917 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005918
Daniel Jasper45797022013-01-25 10:57:27 +00005919 verifyFormat(
5920 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005921 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005922
5923 // Breaking at nested name specifiers is generally not desirable.
5924 verifyFormat(
5925 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5926 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005927
5928 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005929 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5930 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5931 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005932 " aaaaaaaaaaaaaaaaaaaaa);",
5933 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005934
5935 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5936 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5937 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005938}
5939
Daniel Jasperf7935112012-12-03 18:12:45 +00005940TEST_F(FormatTest, UnderstandsTemplateParameters) {
5941 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005942 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005943 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5944 verifyFormat("bool x = a < 1 || 2 > a;");
5945 verifyFormat("bool x = 5 < f<int>();");
5946 verifyFormat("bool x = f<int>() > 5;");
5947 verifyFormat("bool x = 5 < a<int>::x;");
5948 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5949 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5950
5951 verifyGoogleFormat("A<A<int>> a;");
5952 verifyGoogleFormat("A<A<A<int>>> a;");
5953 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005954 verifyGoogleFormat("A<A<int> > a;");
5955 verifyGoogleFormat("A<A<A<int> > > a;");
5956 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005957 verifyGoogleFormat("A<::A<int>> a;");
5958 verifyGoogleFormat("A<::A> a;");
5959 verifyGoogleFormat("A< ::A> a;");
5960 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005961 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5962 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005963 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5964 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005965 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5966 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005967
Nico Weber7533b4d2014-09-24 17:17:32 +00005968 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5969
Daniel Jasperf7935112012-12-03 18:12:45 +00005970 verifyFormat("test >> a >> b;");
5971 verifyFormat("test << a >> b;");
5972
5973 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005974 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005975 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005976 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5977 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005978 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005979 verifyFormat("f(a.operator()<A>());");
5980 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5981 " .template operator()<A>());",
5982 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005983
5984 // Not template parameters.
5985 verifyFormat("return a < b && c > d;");
5986 verifyFormat("void f() {\n"
5987 " while (a < b && c > d) {\n"
5988 " }\n"
5989 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005990 verifyFormat("template <typename... Types>\n"
5991 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005992
5993 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5994 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5995 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005996 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005997 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005998 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005999}
6000
Malcolm Parsons6af3f142016-11-03 16:57:30 +00006001TEST_F(FormatTest, BitshiftOperatorWidth) {
6002 EXPECT_EQ("int a = 1 << 2; /* foo\n"
6003 " bar */",
6004 format("int a=1<<2; /* foo\n"
6005 " bar */"));
6006
6007 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
6008 " bar */",
6009 format("int b =256>>1 ; /* foo\n"
6010 " bar */"));
6011}
6012
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006013TEST_F(FormatTest, UnderstandsBinaryOperators) {
6014 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00006015 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00006016}
6017
6018TEST_F(FormatTest, UnderstandsPointersToMembers) {
6019 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006020 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006021 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006022 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006023 verifyFormat("void f() {\n"
6024 " (a->*f)();\n"
6025 " a->*x;\n"
6026 " (a.*f)();\n"
6027 " ((*a).*f)();\n"
6028 " a.*x;\n"
6029 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00006030 verifyFormat("void f() {\n"
6031 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6032 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
6033 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00006034 verifyFormat(
6035 "(aaaaaaaaaa->*bbbbbbb)(\n"
6036 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006037 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006038 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006039 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006040}
6041
Daniel Jasper8dd40472012-12-21 09:41:31 +00006042TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00006043 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00006044 verifyFormat("f(-1, -2, -3);");
6045 verifyFormat("a[-1] = 5;");
6046 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006047 verifyFormat("if (i == -1) {\n}");
6048 verifyFormat("if (i != -1) {\n}");
6049 verifyFormat("if (i > -1) {\n}");
6050 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00006051 verifyFormat("++(a->f());");
6052 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00006053 verifyFormat("(a->f())++;");
6054 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006055 verifyFormat("if (!(a->f())) {\n}");
Krasimir Georgiev446d6ec2018-03-06 13:56:28 +00006056 verifyFormat("if (!+i) {\n}");
6057 verifyFormat("~&a;");
Daniel Jasper8dd40472012-12-21 09:41:31 +00006058
6059 verifyFormat("a-- > b;");
6060 verifyFormat("b ? -a : c;");
6061 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006062 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00006063 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006064 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00006065
6066 verifyFormat("return -1;");
6067 verifyFormat("switch (a) {\n"
6068 "case -1:\n"
6069 " break;\n"
6070 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00006071 verifyFormat("#define X -1");
6072 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00006073
Chandler Carruthf8b72662014-03-02 12:37:31 +00006074 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6075 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00006076
6077 verifyFormat("int a = /* confusing comment */ -1;");
6078 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6079 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006080}
6081
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006082TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00006083 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006084 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00006085 "}");
6086 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00006087 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00006088 verifyFormat("*aaa = aaaaaaa( // break\n"
6089 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00006090}
6091
Daniel Jasper8863ada2013-08-26 08:10:17 +00006092TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00006093 verifyFormat("bool operator<();");
6094 verifyFormat("bool operator>();");
6095 verifyFormat("bool operator=();");
6096 verifyFormat("bool operator==();");
6097 verifyFormat("bool operator!=();");
6098 verifyFormat("int operator+();");
6099 verifyFormat("int operator++();");
Daniel Jasperbbf5f4e2017-11-06 12:11:51 +00006100 verifyFormat("int operator++(int) volatile noexcept;");
Daniel Jasper804a2762016-01-09 15:56:40 +00006101 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006102 verifyFormat("bool operator();");
6103 verifyFormat("bool operator()();");
6104 verifyFormat("bool operator[]();");
6105 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006106 verifyFormat("operator int();");
6107 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006108 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006109 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006110 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006111 verifyFormat("void *operator new(std::size_t size);");
6112 verifyFormat("void *operator new[](std::size_t size);");
6113 verifyFormat("void operator delete(void *ptr);");
6114 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00006115 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6116 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00006117 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00006118 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006119
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006120 verifyFormat(
6121 "ostream &operator<<(ostream &OutputStream,\n"
6122 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00006123 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6124 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6125 " return left.group < right.group;\n"
6126 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00006127 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00006128 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006129
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006130 verifyGoogleFormat("operator void*();");
6131 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00006132 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00006133
6134 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00006135 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6136 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006137}
6138
Daniel Jasper1c220482015-02-25 10:30:06 +00006139TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00006140 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6141 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6142 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6143 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6144 verifyFormat("Deleted &operator=(const Deleted &) &;");
6145 verifyFormat("Deleted &operator=(const Deleted &) &&;");
6146 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6147 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6148 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6149 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6150 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00006151 verifyFormat("void Fn(T const &) const &;");
6152 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00006153 verifyFormat("template <typename T>\n"
6154 "void F(T) && = delete;",
6155 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00006156
Daniel Jasperaf642c62015-08-25 13:40:51 +00006157 FormatStyle AlignLeft = getLLVMStyle();
6158 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00006159 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00006160 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6161 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6162 AlignLeft);
6163 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6164 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006165 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6166 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6167 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6168 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00006169 verifyFormat("void Fn(T const&) const&;", AlignLeft);
6170 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00006171
6172 FormatStyle Spaces = getLLVMStyle();
6173 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006174 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6175 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6176 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6177 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006178
6179 Spaces.SpacesInCStyleCastParentheses = false;
6180 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006181 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6182 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6183 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6184 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006185}
6186
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006187TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00006188 verifyFormat("void f() {\n"
6189 " A *a = new A;\n"
6190 " A *a = new (placement) A;\n"
6191 " delete a;\n"
6192 " delete (A *)a;\n"
6193 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00006194 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6195 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00006196 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6197 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6198 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00006199 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006200}
6201
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006202TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006203 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006204 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006205 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006206 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006207 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006208 verifyIndependentOfContext("int a = b * 10;");
6209 verifyIndependentOfContext("int a = 10 * b;");
6210 verifyIndependentOfContext("int a = b * c;");
6211 verifyIndependentOfContext("int a += b * c;");
6212 verifyIndependentOfContext("int a -= b * c;");
6213 verifyIndependentOfContext("int a *= b * c;");
6214 verifyIndependentOfContext("int a /= b * c;");
6215 verifyIndependentOfContext("int a = *b;");
6216 verifyIndependentOfContext("int a = *b * c;");
6217 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00006218 verifyIndependentOfContext("int a = b * (10);");
6219 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006220 verifyIndependentOfContext("return 10 * b;");
6221 verifyIndependentOfContext("return *b * *c;");
6222 verifyIndependentOfContext("return a & ~b;");
6223 verifyIndependentOfContext("f(b ? *c : *d);");
6224 verifyIndependentOfContext("int a = b ? *c : *d;");
6225 verifyIndependentOfContext("*b = a;");
6226 verifyIndependentOfContext("a * ~b;");
6227 verifyIndependentOfContext("a * !b;");
6228 verifyIndependentOfContext("a * +b;");
6229 verifyIndependentOfContext("a * -b;");
6230 verifyIndependentOfContext("a * ++b;");
6231 verifyIndependentOfContext("a * --b;");
6232 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00006233 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006234 verifyIndependentOfContext("f() * b;");
6235 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006236 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006237 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00006238 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006239 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00006240 verifyIndependentOfContext("return sizeof(int **);");
6241 verifyIndependentOfContext("return sizeof(int ******);");
6242 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00006243 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006244 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00006245 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00006246 verifyGoogleFormat("return sizeof(int**);");
6247 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6248 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006249 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00006250 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00006251 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00006252 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00006253 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00006254 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00006255 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00006256 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00006257 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00006258 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00006259 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00006260 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00006261 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00006262 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00006263 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00006264 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00006265 verifyFormat("void f(const MyOverride &override);");
6266 verifyFormat("void f(const MyFinal &final);");
6267 verifyIndependentOfContext("bool a = f() && override.f();");
6268 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00006269
Daniel Jasper5b49f472013-01-23 12:10:53 +00006270 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00006271
Daniel Jasper5b49f472013-01-23 12:10:53 +00006272 verifyIndependentOfContext("A<int *> a;");
6273 verifyIndependentOfContext("A<int **> a;");
6274 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00006275 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006276 verifyIndependentOfContext(
6277 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006278 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00006279 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00006280 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00006281 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00006282 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00006283
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00006284 verifyFormat(
6285 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6286 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6287
Daniel Jasper1f5d6372016-06-13 14:45:12 +00006288 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00006289 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00006290 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006291 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00006292 verifyGoogleFormat("A<int*> a;");
6293 verifyGoogleFormat("A<int**> a;");
6294 verifyGoogleFormat("A<int*, int*> a;");
6295 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006296 verifyGoogleFormat("f(b ? *c : *d);");
6297 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00006298 verifyGoogleFormat("Type* t = **x;");
6299 verifyGoogleFormat("Type* t = *++*x;");
6300 verifyGoogleFormat("*++*x;");
6301 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6302 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006303 verifyGoogleFormat(
6304 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00006305 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00006306 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6307 verifyGoogleFormat("template <typename T>\n"
6308 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00006309
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006310 FormatStyle Left = getLLVMStyle();
6311 Left.PointerAlignment = FormatStyle::PAS_Left;
6312 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00006313 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00006314 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00006315 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00006316 verifyFormat("delete *x;", Left);
6317 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
6318 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
6319 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006320
Daniel Jasper5b49f472013-01-23 12:10:53 +00006321 verifyIndependentOfContext("a = *(x + y);");
6322 verifyIndependentOfContext("a = &(x + y);");
6323 verifyIndependentOfContext("*(x + y).call();");
6324 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006325 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00006326
Daniel Jasper5b49f472013-01-23 12:10:53 +00006327 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00006328 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00006329 "int *MyValues = {\n"
6330 " *A, // Operator detection might be confused by the '{'\n"
6331 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00006332 "};");
Nico Weber80a82762013-01-17 17:17:19 +00006333
Daniel Jasper5b49f472013-01-23 12:10:53 +00006334 verifyIndependentOfContext("if (int *a = &b)");
6335 verifyIndependentOfContext("if (int &a = *b)");
6336 verifyIndependentOfContext("if (a & b[i])");
6337 verifyIndependentOfContext("if (a::b::c::d & b[i])");
6338 verifyIndependentOfContext("if (*b[i])");
6339 verifyIndependentOfContext("if (int *a = (&b))");
6340 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00006341 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00006342 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00006343 verifyFormat("void f() {\n"
6344 " for (const int &v : Values) {\n"
6345 " }\n"
6346 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006347 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6348 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00006349 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00006350
Daniel Jaspera98da3d2013-11-07 19:56:07 +00006351 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006352 verifyFormat("#define MACRO \\\n"
6353 " int *i = a * b; \\\n"
6354 " void f(a *b);",
6355 getLLVMStyleWithColumns(19));
6356
Daniel Jasper97b89482013-03-13 07:49:51 +00006357 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006358 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006359 verifyIndependentOfContext("T **t = new T *;");
6360 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00006361 verifyGoogleFormat("A = new SomeType*[Length]();");
6362 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006363 verifyGoogleFormat("T** t = new T*;");
6364 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006365
Daniel Jaspera65e8872014-03-25 10:52:45 +00006366 verifyFormat("STATIC_ASSERT((a & b) == 0);");
6367 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006368 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006369 "typename t::if<x && y>::type f() {}");
6370 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006371 verifyFormat("vector<int *> v;");
6372 verifyFormat("vector<int *const> v;");
6373 verifyFormat("vector<int *const **const *> v;");
6374 verifyFormat("vector<int *volatile> v;");
6375 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006376 verifyFormat("foo<b && false>();");
6377 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00006378 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00006379 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006380 "template <class T, class = typename std::enable_if<\n"
6381 " std::is_integral<T>::value &&\n"
6382 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
6383 "void F();",
6384 getLLVMStyleWithColumns(70));
6385 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006386 "template <class T,\n"
6387 " class = typename std::enable_if<\n"
6388 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006389 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
6390 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006391 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006392 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006393 verifyFormat(
6394 "template <class T,\n"
6395 " class = typename ::std::enable_if<\n"
6396 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6397 "void F();",
6398 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006399
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006400 verifyIndependentOfContext("MACRO(int *i);");
6401 verifyIndependentOfContext("MACRO(auto *a);");
6402 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00006403 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006404 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006405 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006406 // FIXME: Is there a way to make this work?
6407 // verifyIndependentOfContext("MACRO(A *a);");
6408
Daniel Jasper32ccb032014-06-23 07:36:18 +00006409 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006410 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006411
Daniel Jasper866468a2014-04-14 13:15:29 +00006412 EXPECT_EQ("#define OP(x) \\\n"
6413 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6414 " return s << a.DebugString(); \\\n"
6415 " }",
6416 format("#define OP(x) \\\n"
6417 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6418 " return s << a.DebugString(); \\\n"
6419 " }",
6420 getLLVMStyleWithColumns(50)));
6421
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006422 // FIXME: We cannot handle this case yet; we might be able to figure out that
6423 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006424 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006425
6426 FormatStyle PointerMiddle = getLLVMStyle();
6427 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6428 verifyFormat("delete *x;", PointerMiddle);
6429 verifyFormat("int * x;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006430 verifyFormat("int *[] x;", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006431 verifyFormat("template <int * y> f() {}", PointerMiddle);
6432 verifyFormat("int * f(int * a) {}", PointerMiddle);
6433 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6434 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6435 verifyFormat("A<int *> a;", PointerMiddle);
6436 verifyFormat("A<int **> a;", PointerMiddle);
6437 verifyFormat("A<int *, int *> a;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006438 verifyFormat("A<int *[]> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006439 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6440 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006441 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006442
6443 // Member function reference qualifiers aren't binary operators.
6444 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006445 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006446 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006447 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006448 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006449 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006450}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006451
Daniel Jasperee6d6502013-07-17 20:25:02 +00006452TEST_F(FormatTest, UnderstandsAttributes) {
6453 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006454 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6455 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006456 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006457 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006458 verifyFormat("__attribute__((nodebug)) void\n"
6459 "foo() {}\n",
6460 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006461}
6462
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006463TEST_F(FormatTest, UnderstandsSquareAttributes) {
6464 verifyFormat("SomeType s [[unused]] (InitValue);");
6465 verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
6466 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
6467 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
6468 verifyFormat("void f() [[deprecated(\"so sorry\")]];");
6469 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6470 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Manuel Klimekd0f3fe52018-04-11 14:51:54 +00006471
6472 // Make sure we do not mistake attributes for array subscripts.
6473 verifyFormat("int a() {}\n"
6474 "[[unused]] int b() {}\n");
6475
6476 // On the other hand, we still need to correctly find array subscripts.
6477 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
6478
6479 // Make sure we do not parse attributes as lambda introducers.
6480 FormatStyle MultiLineFunctions = getLLVMStyle();
6481 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6482 verifyFormat("[[unused]] int b() {\n"
6483 " return 42;\n"
6484 "}\n",
6485 MultiLineFunctions);
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006486}
6487
Daniel Jasper10cd5812013-05-06 06:35:44 +00006488TEST_F(FormatTest, UnderstandsEllipsis) {
6489 verifyFormat("int printf(const char *fmt, ...);");
6490 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006491 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6492
6493 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006494 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006495 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006496}
6497
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006498TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006499 EXPECT_EQ("int *a;\n"
6500 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006501 "int *a;",
6502 format("int *a;\n"
6503 "int* a;\n"
6504 "int *a;",
6505 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006506 EXPECT_EQ("int* a;\n"
6507 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006508 "int* a;",
6509 format("int* a;\n"
6510 "int* a;\n"
6511 "int *a;",
6512 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006513 EXPECT_EQ("int *a;\n"
6514 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006515 "int *a;",
6516 format("int *a;\n"
6517 "int * a;\n"
6518 "int * a;",
6519 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006520 EXPECT_EQ("auto x = [] {\n"
6521 " int *a;\n"
6522 " int *a;\n"
6523 " int *a;\n"
6524 "};",
6525 format("auto x=[]{int *a;\n"
6526 "int * a;\n"
6527 "int * a;};",
6528 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006529}
6530
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006531TEST_F(FormatTest, UnderstandsRvalueReferences) {
6532 verifyFormat("int f(int &&a) {}");
6533 verifyFormat("int f(int a, char &&b) {}");
6534 verifyFormat("void f() { int &&a = b; }");
6535 verifyGoogleFormat("int f(int a, char&& b) {}");
6536 verifyGoogleFormat("void f() { int&& a = b; }");
6537
Daniel Jasper1eff9082013-05-27 16:36:33 +00006538 verifyIndependentOfContext("A<int &&> a;");
6539 verifyIndependentOfContext("A<int &&, int &&> a;");
6540 verifyGoogleFormat("A<int&&> a;");
6541 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006542
6543 // Not rvalue references:
6544 verifyFormat("template <bool B, bool C> class A {\n"
6545 " static_assert(B && C, \"Something is wrong\");\n"
6546 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006547 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6548 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006549 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006550}
6551
Manuel Klimekc1237a82013-01-23 14:08:21 +00006552TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6553 verifyFormat("void f() {\n"
6554 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006555 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006556 "}",
6557 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006558}
6559
Daniel Jasperef906a92013-01-13 08:01:36 +00006560TEST_F(FormatTest, FormatsCasts) {
6561 verifyFormat("Type *A = static_cast<Type *>(P);");
6562 verifyFormat("Type *A = (Type *)P;");
6563 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6564 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006565 verifyFormat("int a = (int)2.0f;");
6566 verifyFormat("x[(int32)y];");
6567 verifyFormat("x = (int32)y;");
6568 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6569 verifyFormat("int a = (int)*b;");
6570 verifyFormat("int a = (int)2.0f;");
6571 verifyFormat("int a = (int)~0;");
6572 verifyFormat("int a = (int)++a;");
6573 verifyFormat("int a = (int)sizeof(int);");
6574 verifyFormat("int a = (int)+2;");
6575 verifyFormat("my_int a = (my_int)2.0f;");
6576 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006577 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006578 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006579 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006580 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006581 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006582
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006583 verifyFormat("void f() { my_int a = (my_int)*b; }");
6584 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6585 verifyFormat("my_int a = (my_int)~0;");
6586 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006587 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006588 verifyFormat("my_int a = (my_int)1;");
6589 verifyFormat("my_int a = (my_int *)1;");
6590 verifyFormat("my_int a = (const my_int)-1;");
6591 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006592 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006593 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006594 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006595 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006596
6597 // FIXME: single value wrapped with paren will be treated as cast.
6598 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006599
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006600 verifyFormat("{ (void)F; }");
6601
Daniel Jasper998cabc2013-07-18 14:46:07 +00006602 // Don't break after a cast's
6603 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6604 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6605 " bbbbbbbbbbbbbbbbbbbbbb);");
6606
Daniel Jasperef906a92013-01-13 08:01:36 +00006607 // These are not casts.
6608 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006609 verifyFormat("f(foo)->b;");
6610 verifyFormat("f(foo).b;");
6611 verifyFormat("f(foo)(b);");
6612 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006613 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006614 verifyFormat("(*funptr)(foo)[4];");
6615 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006616 verifyFormat("void f(int *);");
6617 verifyFormat("void f(int *) = 0;");
6618 verifyFormat("void f(SmallVector<int>) {}");
6619 verifyFormat("void f(SmallVector<int>);");
6620 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006621 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006622 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006623 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006624 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6625 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006626 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006627
Daniel Jasperba0bda92013-02-23 08:07:18 +00006628 // These are not casts, but at some point were confused with casts.
6629 verifyFormat("virtual void foo(int *) override;");
6630 verifyFormat("virtual void foo(char &) const;");
6631 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006632 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006633 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006634 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006635 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006636
6637 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6638 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006639 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006640 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006641 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6642 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6643 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006644}
6645
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006646TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006647 verifyFormat("A<bool()> a;");
6648 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006649 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006650 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006651 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006652 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006653 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006654 verifyFormat("template <class CallbackClass>\n"
6655 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006656
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006657 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6658 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006659 verifyGoogleFormat(
6660 "template <class CallbackClass>\n"
6661 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006662
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006663 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006664 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006665 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006666 verifyFormat("some_var = function(*some_pointer_var)[0];");
6667 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006668 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006669 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00006670 verifyFormat("std::function<\n"
6671 " LooooooooooongTemplatedType<\n"
6672 " SomeType>*(\n"
6673 " LooooooooooooooooongType type)>\n"
6674 " function;",
6675 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006676}
6677
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006678TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6679 verifyFormat("A (*foo_)[6];");
6680 verifyFormat("vector<int> (*foo_)[6];");
6681}
6682
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006683TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6684 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6685 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6686 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6687 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006688 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6689 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006690
6691 // Different ways of ()-initializiation.
6692 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6693 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6694 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6695 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6696 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6697 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006698 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6699 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006700
6701 // Lambdas should not confuse the variable declaration heuristic.
6702 verifyFormat("LooooooooooooooooongType\n"
6703 " variable(nullptr, [](A *a) {});",
6704 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006705}
6706
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006707TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006708 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006709 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006710 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006711 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006712 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006713 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006714 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6715 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006716 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6717 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006718 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6719 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006720 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6721 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006722 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6723 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006724 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6725 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6726 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6727 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006728 FormatStyle Indented = getLLVMStyle();
6729 Indented.IndentWrappedFunctionNames = true;
6730 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6731 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6732 Indented);
6733 verifyFormat(
6734 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6735 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6736 Indented);
6737 verifyFormat(
6738 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6739 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6740 Indented);
6741 verifyFormat(
6742 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6743 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6744 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006745
6746 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006747 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6748 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6749 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006750
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006751 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006752 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006753 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006754 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6755 " SourceLocation L, IdentifierIn *II,\n"
6756 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006757 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006758 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006759 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006760 " const SomeType<string, SomeOtherTemplateParameter>\n"
6761 " &ReallyReallyLongParameterName,\n"
6762 " const SomeType<string, SomeOtherTemplateParameter>\n"
6763 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006764 verifyFormat("template <typename A>\n"
6765 "SomeLoooooooooooooooooooooongType<\n"
6766 " typename some_namespace::SomeOtherType<A>::Type>\n"
6767 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006768
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006769 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006770 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6771 " aaaaaaaaaaaaaaaaaaaaaaa;");
6772 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006773 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6774 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006775 verifyGoogleFormat(
6776 "some_namespace::LongReturnType\n"
6777 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006778 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006779
6780 verifyGoogleFormat("template <typename T>\n"
6781 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006782 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006783 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6784 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006785
6786 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006787 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6788 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006789 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6790 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6791 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6792 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6793 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6794 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6795 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006796
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006797 verifyFormat("template <typename T> // Templates on own line.\n"
6798 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006799 "MyFunction(int a);",
6800 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006801}
6802
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006803TEST_F(FormatTest, FormatsArrays) {
6804 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6805 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006806 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6807 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006808 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6809 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006810 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6811 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6812 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6813 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6814 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6815 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6816 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6817 verifyFormat(
6818 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6819 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6820 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006821 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6822 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006823
6824 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6825 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006826 verifyFormat(
6827 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6828 " .aaaaaaa[0]\n"
6829 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006830 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006831
6832 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006833
6834 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6835 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006836}
6837
Daniel Jaspere9de2602012-12-06 09:56:08 +00006838TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6839 verifyFormat("(a)->b();");
6840 verifyFormat("--a;");
6841}
6842
Daniel Jasper8b529712012-12-04 13:02:32 +00006843TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006844 verifyFormat("#include <string>\n"
6845 "#include <a/b/c.h>\n"
6846 "#include \"a/b/string\"\n"
6847 "#include \"string.h\"\n"
6848 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006849 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006850 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006851 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006852 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006853 "#include \"some long include\" // with a comment\n"
Manuel Klimek45ab5592017-11-14 09:19:53 +00006854 "#include \"some very long include path\"\n"
6855 "#include <some/very/long/include/path>\n",
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006856 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006857 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6858 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006859
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006860 verifyFormat("#import <string>");
6861 verifyFormat("#import <a/b/c.h>");
6862 verifyFormat("#import \"a/b/string\"");
6863 verifyFormat("#import \"string.h\"");
6864 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006865 verifyFormat("#if __has_include(<strstream>)\n"
6866 "#include <strstream>\n"
6867 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006868
Daniel Jasper343643b2014-08-13 08:29:18 +00006869 verifyFormat("#define MY_IMPORT <a/b>");
6870
Nico Weber21088802017-02-10 19:36:52 +00006871 verifyFormat("#if __has_include(<a/b>)");
6872 verifyFormat("#if __has_include_next(<a/b>)");
6873 verifyFormat("#define F __has_include(<a/b>)");
6874 verifyFormat("#define F __has_include_next(<a/b>)");
6875
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006876 // Protocol buffer definition or missing "#".
6877 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6878 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006879
6880 FormatStyle Style = getLLVMStyle();
6881 Style.AlwaysBreakBeforeMultilineStrings = true;
6882 Style.ColumnLimit = 0;
6883 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006884
6885 // But 'import' might also be a regular C++ namespace.
6886 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6887 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006888}
6889
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006890//===----------------------------------------------------------------------===//
6891// Error recovery tests.
6892//===----------------------------------------------------------------------===//
6893
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006894TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006895 FormatStyle NoBinPacking = getLLVMStyle();
6896 NoBinPacking.BinPackParameters = false;
6897 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6898 " double *min_x,\n"
6899 " double *max_x,\n"
6900 " double *min_y,\n"
6901 " double *max_y,\n"
6902 " double *min_z,\n"
6903 " double *max_z, ) {}",
6904 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006905}
6906
Daniel Jasper83a54d22013-01-10 09:26:47 +00006907TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006908 verifyFormat("void f() { return; }\n42");
6909 verifyFormat("void f() {\n"
6910 " if (0)\n"
6911 " return;\n"
6912 "}\n"
6913 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006914 verifyFormat("void f() { return }\n42");
6915 verifyFormat("void f() {\n"
6916 " if (0)\n"
6917 " return\n"
6918 "}\n"
6919 "42");
6920}
6921
6922TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6923 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6924 EXPECT_EQ("void f() {\n"
6925 " if (a)\n"
6926 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006927 "}",
6928 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006929 EXPECT_EQ("namespace N {\n"
6930 "void f()\n"
6931 "}",
6932 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006933 EXPECT_EQ("namespace N {\n"
6934 "void f() {}\n"
6935 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006936 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006937 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006938}
6939
Daniel Jasper2df93312013-01-09 10:16:05 +00006940TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6941 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006942 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006943 " b;",
6944 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006945 verifyFormat("function(\n"
6946 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006947 " LoooooooooooongArgument);\n",
6948 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006949}
6950
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006951TEST_F(FormatTest, IncorrectAccessSpecifier) {
6952 verifyFormat("public:");
6953 verifyFormat("class A {\n"
6954 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006955 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006956 "};");
6957 verifyFormat("public\n"
6958 "int qwerty;");
6959 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006960 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006961 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006962 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006963 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006964 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006965}
Daniel Jasperf7935112012-12-03 18:12:45 +00006966
Daniel Jasper291f9362013-03-20 15:58:10 +00006967TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6968 verifyFormat("{");
6969 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006970 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006971}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006972
Krasimir Georgiev067ec702018-05-22 11:44:03 +00006973TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
6974 // Found by oss-fuzz:
6975 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
6976 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
6977 Style.ColumnLimit = 60;
6978 verifyNoCrash(
6979 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
6980 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
6981 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
6982 Style);
6983}
6984
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006985TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006986 verifyFormat("do {\n}");
6987 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006988 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006989 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006990 "wheeee(fun);");
6991 verifyFormat("do {\n"
6992 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006993 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006994}
6995
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006996TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006997 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006998 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006999 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007000 verifyFormat("while {\n foo;\n foo();\n}");
7001 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00007002}
7003
Daniel Jasperc0880a92013-01-04 18:52:56 +00007004TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007005 verifyIncompleteFormat("namespace {\n"
7006 "class Foo { Foo (\n"
7007 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00007008 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00007009}
7010
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007011TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007012 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007013 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
7014 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007015 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007016
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007017 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007018 " {\n"
7019 " breakme(\n"
7020 " qwe);\n"
7021 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007022 format("{\n"
7023 " {\n"
7024 " breakme(qwe);\n"
7025 "}\n",
7026 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007027}
7028
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007029TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007030 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007031 " avariable,\n"
7032 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007033 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007034}
7035
Manuel Klimek762dd182013-01-21 10:07:49 +00007036TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007037 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00007038}
7039
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007040TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007041 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00007042 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00007043 " 1,\n"
7044 " 2,\n"
7045 " 3,\n"
7046 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00007047 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007048 verifyFormat("vector<T> x{{}, {}, {}, {}};");
7049 verifyFormat("f({1, 2});");
7050 verifyFormat("auto v = Foo{-1};");
7051 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
7052 verifyFormat("Class::Class : member{1, 2, 3} {}");
7053 verifyFormat("new vector<int>{1, 2, 3};");
7054 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00007055 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007056 verifyFormat("return {arg1, arg2};");
7057 verifyFormat("return {arg1, SomeType{parameter}};");
7058 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
7059 verifyFormat("new T{arg1, arg2};");
7060 verifyFormat("f(MyMap[{composite, key}]);");
7061 verifyFormat("class Class {\n"
7062 " T member = {arg1, arg2};\n"
7063 "};");
7064 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00007065 verifyFormat("const struct A a = {.a = 1, .b = 2};");
7066 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00007067 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
7068 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00007069
Daniel Jasper438059e2014-05-22 12:11:13 +00007070 verifyFormat("int foo(int i) { return fo1{}(i); }");
7071 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007072 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00007073 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00007074 verifyFormat("Node n{1, Node{1000}, //\n"
7075 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00007076 verifyFormat("Aaaa aaaaaaa{\n"
7077 " {\n"
7078 " aaaa,\n"
7079 " },\n"
7080 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00007081 verifyFormat("class C : public D {\n"
7082 " SomeClass SC{2};\n"
7083 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00007084 verifyFormat("class C : public A {\n"
7085 " class D : public B {\n"
7086 " void f() { int i{2}; }\n"
7087 " };\n"
7088 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00007089 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00007090
Francois Ferrandf92f8062018-05-16 08:03:52 +00007091 // Avoid breaking between equal sign and opening brace
7092 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
7093 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
7094 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
7095 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
7096 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
7097 " {\"ccccccccccccccccccccc\", 2}};",
7098 AvoidBreakingFirstArgument);
7099
Francois Ferrandd2130f52017-06-30 20:00:02 +00007100 // Binpacking only if there is no trailing comma
7101 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
7102 " cccccccccc, dddddddddd};",
7103 getLLVMStyleWithColumns(50));
7104 verifyFormat("const Aaaaaa aaaaa = {\n"
7105 " aaaaaaaaaaa,\n"
7106 " bbbbbbbbbbb,\n"
7107 " ccccccccccc,\n"
7108 " ddddddddddd,\n"
7109 "};", getLLVMStyleWithColumns(50));
7110
Daniel Jaspere4ada022016-12-13 10:05:03 +00007111 // Cases where distinguising braced lists and blocks is hard.
7112 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7113 verifyFormat("void f() {\n"
7114 " return; // comment\n"
7115 "}\n"
7116 "SomeType t;");
7117 verifyFormat("void f() {\n"
7118 " if (a) {\n"
7119 " f();\n"
7120 " }\n"
7121 "}\n"
7122 "SomeType t;");
7123
Daniel Jasper08434342015-05-26 07:26:26 +00007124 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007125 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00007126 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007127 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7128 " bbbbb,\n"
7129 " ccccc,\n"
7130 " ddddd,\n"
7131 " eeeee,\n"
7132 " ffffff,\n"
7133 " ggggg,\n"
7134 " hhhhhh,\n"
7135 " iiiiii,\n"
7136 " jjjjjj,\n"
7137 " kkkkkk};",
7138 NoBinPacking);
7139 verifyFormat("const Aaaaaa aaaaa = {\n"
7140 " aaaaa,\n"
7141 " bbbbb,\n"
7142 " ccccc,\n"
7143 " ddddd,\n"
7144 " eeeee,\n"
7145 " ffffff,\n"
7146 " ggggg,\n"
7147 " hhhhhh,\n"
7148 " iiiiii,\n"
7149 " jjjjjj,\n"
7150 " kkkkkk,\n"
7151 "};",
7152 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00007153 verifyFormat(
7154 "const Aaaaaa aaaaa = {\n"
7155 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
7156 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
7157 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7158 "};",
7159 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007160
Chandler Carruthf8b72662014-03-02 12:37:31 +00007161 // FIXME: The alignment of these trailing comments might be bad. Then again,
7162 // this might be utterly useless in real code.
7163 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007164 " : some_value{ //\n"
7165 " aaaaaaa, //\n"
7166 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00007167
Chandler Carruthf8b72662014-03-02 12:37:31 +00007168 // In braced lists, the first comment is always assumed to belong to the
7169 // first element. Thus, it can be moved to the next or previous line as
7170 // appropriate.
7171 EXPECT_EQ("function({// First element:\n"
7172 " 1,\n"
7173 " // Second element:\n"
7174 " 2});",
7175 format("function({\n"
7176 " // First element:\n"
7177 " 1,\n"
7178 " // Second element:\n"
7179 " 2});"));
7180 EXPECT_EQ("std::vector<int> MyNumbers{\n"
7181 " // First element:\n"
7182 " 1,\n"
7183 " // Second element:\n"
7184 " 2};",
7185 format("std::vector<int> MyNumbers{// First element:\n"
7186 " 1,\n"
7187 " // Second element:\n"
7188 " 2};",
7189 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00007190 // A trailing comma should still lead to an enforced line break and no
7191 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00007192 EXPECT_EQ("vector<int> SomeVector = {\n"
7193 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00007194 " 1,\n"
7195 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007196 "};",
7197 format("vector<int> SomeVector = { // aaa\n"
7198 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00007199
Chandler Carruthf8b72662014-03-02 12:37:31 +00007200 FormatStyle ExtraSpaces = getLLVMStyle();
7201 ExtraSpaces.Cpp11BracedListStyle = false;
7202 ExtraSpaces.ColumnLimit = 75;
7203 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7204 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7205 verifyFormat("f({ 1, 2 });", ExtraSpaces);
7206 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7207 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7208 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7209 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7210 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7211 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7212 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7213 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7214 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7215 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7216 verifyFormat("class Class {\n"
7217 " T member = { arg1, arg2 };\n"
7218 "};",
7219 ExtraSpaces);
7220 verifyFormat(
7221 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7222 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7223 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7224 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7225 ExtraSpaces);
7226 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00007227 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007228 ExtraSpaces);
7229 verifyFormat(
7230 "someFunction(OtherParam,\n"
7231 " BracedList{ // comment 1 (Forcing interesting break)\n"
7232 " param1, param2,\n"
7233 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00007234 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007235 ExtraSpaces);
7236 verifyFormat(
7237 "std::this_thread::sleep_for(\n"
7238 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7239 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00007240 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00007241 " aaaaaaa,\n"
7242 " aaaaaaaaaa,\n"
7243 " aaaaa,\n"
7244 " aaaaaaaaaaaaaaa,\n"
7245 " aaa,\n"
7246 " aaaaaaaaaa,\n"
7247 " a,\n"
7248 " aaaaaaaaaaaaaaaaaaaaa,\n"
7249 " aaaaaaaaaaaa,\n"
7250 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7251 " aaaaaaa,\n"
7252 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007253 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00007254 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
7255 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Francois Ferrandf92f8062018-05-16 08:03:52 +00007256
7257 // Avoid breaking between initializer/equal sign and opening brace
7258 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
7259 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
7260 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7261 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7262 " { \"ccccccccccccccccccccc\", 2 }\n"
7263 "};",
7264 ExtraSpaces);
7265 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
7266 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7267 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7268 " { \"ccccccccccccccccccccc\", 2 }\n"
7269 "};",
7270 ExtraSpaces);
Hans Wennborgbfc34062018-06-14 08:01:09 +00007271
7272 FormatStyle SpaceBeforeBrace = getLLVMStyle();
7273 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
7274 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
7275 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
Manuel Klimekab419912013-05-23 09:41:43 +00007276}
7277
Daniel Jasper33b909c2013-10-25 14:29:37 +00007278TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007279 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7280 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7281 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7282 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7283 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7284 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007285 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007286 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00007287 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007288 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7289 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007290 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007291 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7292 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7293 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
7294 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7295 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7296 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7297 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007298 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007299 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7300 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007301 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7302 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7303 " // Separating comment.\n"
7304 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7305 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7306 " // Leading comment\n"
7307 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7308 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007309 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7310 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007311 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00007312 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7313 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007314 getLLVMStyleWithColumns(38));
7315 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007316 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7317 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007318 verifyFormat(
7319 "static unsigned SomeValues[10][3] = {\n"
7320 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
7321 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7322 verifyFormat("static auto fields = new vector<string>{\n"
7323 " \"aaaaaaaaaaaaa\",\n"
7324 " \"aaaaaaaaaaaaa\",\n"
7325 " \"aaaaaaaaaaaa\",\n"
7326 " \"aaaaaaaaaaaaaa\",\n"
7327 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7328 " \"aaaaaaaaaaaa\",\n"
7329 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7330 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00007331 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7332 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7333 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7334 " 3, cccccccccccccccccccccc};",
7335 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00007336
7337 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00007338 verifyFormat("vector<int> x = {\n"
7339 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
7340 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00007341 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00007342 verifyFormat("vector<int> x = {\n"
7343 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00007344 "};",
7345 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00007346 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7347 " 1, 1, 1, 1,\n"
7348 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00007349 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007350
Daniel Jasper60c27072015-05-13 08:16:00 +00007351 // Trailing comment in the first line.
7352 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
7353 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
7354 " 111111111, 222222222, 3333333333, 444444444, //\n"
7355 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00007356 // Trailing comment in the last line.
7357 verifyFormat("int aaaaa[] = {\n"
7358 " 1, 2, 3, // comment\n"
7359 " 4, 5, 6 // comment\n"
7360 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00007361
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007362 // With nested lists, we should either format one item per line or all nested
7363 // lists one on line.
7364 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007365 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7366 " {aaaaaaaaaaaaaaaaaaa},\n"
7367 " {aaaaaaaaaaaaaaaaaaaaa},\n"
7368 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00007369 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00007370 verifyFormat(
7371 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007372 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7373 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7374 " {aaa, aaa},\n"
7375 " {aaa, aaa},\n"
7376 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7377 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7378 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00007379
7380 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00007381 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007382 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00007383
7384 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00007385
Daniel Jaspereb65e912015-12-21 18:31:15 +00007386 // No braced initializer here.
7387 verifyFormat("void f() {\n"
7388 " struct Dummy {};\n"
7389 " f(v);\n"
7390 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00007391
7392 // Long lists should be formatted in columns even if they are nested.
7393 verifyFormat(
7394 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7395 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7396 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7397 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7398 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7399 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00007400
7401 // Allow "single-column" layout even if that violates the column limit. There
7402 // isn't going to be a better way.
7403 verifyFormat("std::vector<int> a = {\n"
7404 " aaaaaaaa,\n"
7405 " aaaaaaaa,\n"
7406 " aaaaaaaa,\n"
7407 " aaaaaaaa,\n"
7408 " aaaaaaaaaa,\n"
7409 " aaaaaaaa,\n"
7410 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7411 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00007412 verifyFormat("vector<int> aaaa = {\n"
7413 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7414 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7415 " aaaaaa.aaaaaaa,\n"
7416 " aaaaaa.aaaaaaa,\n"
7417 " aaaaaa.aaaaaaa,\n"
7418 " aaaaaa.aaaaaaa,\n"
7419 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007420
7421 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00007422 verifyFormat("someFunction(Param, {List1, List2,\n"
7423 " List3});",
7424 getLLVMStyleWithColumns(35));
7425 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007426 " {List1, List2,\n"
7427 " List3});",
7428 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00007429 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7430 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007431}
7432
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007433TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007434 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007435 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007436
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007437 verifyFormat("void f() { return 42; }");
7438 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007439 " return 42;\n"
7440 "}",
7441 DoNotMerge);
7442 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007443 " // Comment\n"
7444 "}");
7445 verifyFormat("{\n"
7446 "#error {\n"
7447 " int a;\n"
7448 "}");
7449 verifyFormat("{\n"
7450 " int a;\n"
7451 "#error {\n"
7452 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007453 verifyFormat("void f() {} // comment");
7454 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007455 verifyFormat("void f() {\n"
7456 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007457 DoNotMerge);
7458 verifyFormat("void f() {\n"
7459 " int a;\n"
7460 "} // comment",
7461 DoNotMerge);
7462 verifyFormat("void f() {\n"
7463 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007464 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007465
7466 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7467 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7468
7469 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7470 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007471 verifyFormat("class C {\n"
7472 " C()\n"
7473 " : iiiiiiii(nullptr),\n"
7474 " kkkkkkk(nullptr),\n"
7475 " mmmmmmm(nullptr),\n"
7476 " nnnnnnn(nullptr) {}\n"
7477 "};",
7478 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007479
7480 FormatStyle NoColumnLimit = getLLVMStyle();
7481 NoColumnLimit.ColumnLimit = 0;
7482 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7483 EXPECT_EQ("class C {\n"
7484 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007485 "};",
7486 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007487 EXPECT_EQ("A()\n"
7488 " : b(0) {\n"
7489 "}",
7490 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7491
7492 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007493 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7494 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007495 EXPECT_EQ("A()\n"
7496 " : b(0) {\n"
7497 "}",
7498 format("A():b(0){}", DoNotMergeNoColumnLimit));
7499 EXPECT_EQ("A()\n"
7500 " : b(0) {\n"
7501 "}",
7502 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007503
7504 verifyFormat("#define A \\\n"
7505 " void f() { \\\n"
7506 " int i; \\\n"
7507 " }",
7508 getLLVMStyleWithColumns(20));
7509 verifyFormat("#define A \\\n"
7510 " void f() { int i; }",
7511 getLLVMStyleWithColumns(21));
7512 verifyFormat("#define A \\\n"
7513 " void f() { \\\n"
7514 " int i; \\\n"
7515 " } \\\n"
7516 " int j;",
7517 getLLVMStyleWithColumns(22));
7518 verifyFormat("#define A \\\n"
7519 " void f() { int i; } \\\n"
7520 " int j;",
7521 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007522}
7523
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007524TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
7525 FormatStyle MergeEmptyOnly = getLLVMStyle();
7526 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7527 verifyFormat("class C {\n"
7528 " int f() {}\n"
7529 "};",
7530 MergeEmptyOnly);
7531 verifyFormat("class C {\n"
7532 " int f() {\n"
7533 " return 42;\n"
7534 " }\n"
7535 "};",
7536 MergeEmptyOnly);
7537 verifyFormat("int f() {}", MergeEmptyOnly);
7538 verifyFormat("int f() {\n"
7539 " return 42;\n"
7540 "}",
7541 MergeEmptyOnly);
7542
7543 // Also verify behavior when BraceWrapping.AfterFunction = true
7544 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7545 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
7546 verifyFormat("int f() {}", MergeEmptyOnly);
7547 verifyFormat("class C {\n"
7548 " int f() {}\n"
7549 "};",
7550 MergeEmptyOnly);
7551}
7552
Daniel Jasperd74cf402014-04-08 12:46:38 +00007553TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7554 FormatStyle MergeInlineOnly = getLLVMStyle();
7555 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7556 verifyFormat("class C {\n"
7557 " int f() { return 42; }\n"
7558 "};",
7559 MergeInlineOnly);
7560 verifyFormat("int f() {\n"
7561 " return 42;\n"
7562 "}",
7563 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007564
7565 // SFS_Inline implies SFS_Empty
7566 verifyFormat("class C {\n"
7567 " int f() {}\n"
7568 "};",
7569 MergeInlineOnly);
7570 verifyFormat("int f() {}", MergeInlineOnly);
7571
7572 // Also verify behavior when BraceWrapping.AfterFunction = true
7573 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7574 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7575 verifyFormat("class C {\n"
7576 " int f() { return 42; }\n"
7577 "};",
7578 MergeInlineOnly);
7579 verifyFormat("int f()\n"
7580 "{\n"
7581 " return 42;\n"
7582 "}",
7583 MergeInlineOnly);
7584
7585 // SFS_Inline implies SFS_Empty
7586 verifyFormat("int f() {}", MergeInlineOnly);
7587 verifyFormat("class C {\n"
7588 " int f() {}\n"
7589 "};",
7590 MergeInlineOnly);
7591}
7592
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00007593TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
7594 FormatStyle MergeInlineOnly = getLLVMStyle();
7595 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
7596 FormatStyle::SFS_InlineOnly;
7597 verifyFormat("class C {\n"
7598 " int f() { return 42; }\n"
7599 "};",
7600 MergeInlineOnly);
7601 verifyFormat("int f() {\n"
7602 " return 42;\n"
7603 "}",
7604 MergeInlineOnly);
7605
7606 // SFS_InlineOnly does not imply SFS_Empty
7607 verifyFormat("class C {\n"
7608 " int f() {}\n"
7609 "};",
7610 MergeInlineOnly);
7611 verifyFormat("int f() {\n"
7612 "}",
7613 MergeInlineOnly);
7614
7615 // Also verify behavior when BraceWrapping.AfterFunction = true
7616 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7617 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7618 verifyFormat("class C {\n"
7619 " int f() { return 42; }\n"
7620 "};",
7621 MergeInlineOnly);
7622 verifyFormat("int f()\n"
7623 "{\n"
7624 " return 42;\n"
7625 "}",
7626 MergeInlineOnly);
7627
7628 // SFS_InlineOnly does not imply SFS_Empty
7629 verifyFormat("int f()\n"
7630 "{\n"
7631 "}",
7632 MergeInlineOnly);
7633 verifyFormat("class C {\n"
7634 " int f() {}\n"
7635 "};",
7636 MergeInlineOnly);
7637}
7638
Francois Ferrandad722562017-06-30 20:25:55 +00007639TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007640 FormatStyle Style = getLLVMStyle();
7641 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7642 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7643 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00007644 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007645 Style.ColumnLimit = 40;
7646
7647 verifyFormat("int f()\n"
7648 "{}",
7649 Style);
7650 verifyFormat("int f()\n"
7651 "{\n"
7652 " return 42;\n"
7653 "}",
7654 Style);
7655 verifyFormat("int f()\n"
7656 "{\n"
7657 " // some comment\n"
7658 "}",
7659 Style);
7660
7661 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7662 verifyFormat("int f() {}", Style);
7663 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7664 "{}",
7665 Style);
7666 verifyFormat("int f()\n"
7667 "{\n"
7668 " return 0;\n"
7669 "}",
7670 Style);
7671
7672 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7673 verifyFormat("class Foo {\n"
7674 " int f() {}\n"
7675 "};\n",
7676 Style);
7677 verifyFormat("class Foo {\n"
7678 " int f() { return 0; }\n"
7679 "};\n",
7680 Style);
7681 verifyFormat("class Foo {\n"
7682 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7683 " {}\n"
7684 "};\n",
7685 Style);
7686 verifyFormat("class Foo {\n"
7687 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7688 " {\n"
7689 " return 0;\n"
7690 " }\n"
7691 "};\n",
7692 Style);
7693
7694 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7695 verifyFormat("int f() {}", Style);
7696 verifyFormat("int f() { return 0; }", Style);
7697 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7698 "{}",
7699 Style);
7700 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7701 "{\n"
7702 " return 0;\n"
7703 "}",
7704 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00007705}
Krasimir Georgiev6a1c9d52017-10-02 15:53:37 +00007706TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
7707 FormatStyle Style = getLLVMStyle();
7708 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7709 verifyFormat("#ifdef A\n"
7710 "int f() {}\n"
7711 "#else\n"
7712 "int g() {}\n"
7713 "#endif",
7714 Style);
7715}
Daniel Jasperd74cf402014-04-08 12:46:38 +00007716
Francois Ferrandad722562017-06-30 20:25:55 +00007717TEST_F(FormatTest, SplitEmptyClass) {
7718 FormatStyle Style = getLLVMStyle();
7719 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7720 Style.BraceWrapping.AfterClass = true;
7721 Style.BraceWrapping.SplitEmptyRecord = false;
7722
7723 verifyFormat("class Foo\n"
7724 "{};",
7725 Style);
7726 verifyFormat("/* something */ class Foo\n"
7727 "{};",
7728 Style);
7729 verifyFormat("template <typename X> class Foo\n"
7730 "{};",
7731 Style);
7732 verifyFormat("class Foo\n"
7733 "{\n"
7734 " Foo();\n"
7735 "};",
7736 Style);
7737 verifyFormat("typedef class Foo\n"
7738 "{\n"
7739 "} Foo_t;",
7740 Style);
7741}
7742
7743TEST_F(FormatTest, SplitEmptyStruct) {
7744 FormatStyle Style = getLLVMStyle();
7745 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7746 Style.BraceWrapping.AfterStruct = true;
7747 Style.BraceWrapping.SplitEmptyRecord = false;
7748
7749 verifyFormat("struct Foo\n"
7750 "{};",
7751 Style);
7752 verifyFormat("/* something */ struct Foo\n"
7753 "{};",
7754 Style);
7755 verifyFormat("template <typename X> struct Foo\n"
7756 "{};",
7757 Style);
7758 verifyFormat("struct Foo\n"
7759 "{\n"
7760 " Foo();\n"
7761 "};",
7762 Style);
7763 verifyFormat("typedef struct Foo\n"
7764 "{\n"
7765 "} Foo_t;",
7766 Style);
7767 //typedef struct Bar {} Bar_t;
7768}
7769
7770TEST_F(FormatTest, SplitEmptyUnion) {
7771 FormatStyle Style = getLLVMStyle();
7772 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7773 Style.BraceWrapping.AfterUnion = true;
7774 Style.BraceWrapping.SplitEmptyRecord = false;
7775
7776 verifyFormat("union Foo\n"
7777 "{};",
7778 Style);
7779 verifyFormat("/* something */ union Foo\n"
7780 "{};",
7781 Style);
7782 verifyFormat("union Foo\n"
7783 "{\n"
7784 " A,\n"
7785 "};",
7786 Style);
7787 verifyFormat("typedef union Foo\n"
7788 "{\n"
7789 "} Foo_t;",
7790 Style);
7791}
7792
7793TEST_F(FormatTest, SplitEmptyNamespace) {
7794 FormatStyle Style = getLLVMStyle();
7795 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7796 Style.BraceWrapping.AfterNamespace = true;
7797 Style.BraceWrapping.SplitEmptyNamespace = false;
7798
7799 verifyFormat("namespace Foo\n"
7800 "{};",
7801 Style);
7802 verifyFormat("/* something */ namespace Foo\n"
7803 "{};",
7804 Style);
7805 verifyFormat("inline namespace Foo\n"
7806 "{};",
7807 Style);
Sam McCall6f3778c2018-09-05 07:44:02 +00007808 verifyFormat("/* something */ inline namespace Foo\n"
7809 "{};",
7810 Style);
7811 verifyFormat("export namespace Foo\n"
7812 "{};",
7813 Style);
Francois Ferrandad722562017-06-30 20:25:55 +00007814 verifyFormat("namespace Foo\n"
7815 "{\n"
7816 "void Bar();\n"
7817 "};",
7818 Style);
7819}
7820
7821TEST_F(FormatTest, NeverMergeShortRecords) {
7822 FormatStyle Style = getLLVMStyle();
7823
7824 verifyFormat("class Foo {\n"
7825 " Foo();\n"
7826 "};",
7827 Style);
7828 verifyFormat("typedef class Foo {\n"
7829 " Foo();\n"
7830 "} Foo_t;",
7831 Style);
7832 verifyFormat("struct Foo {\n"
7833 " Foo();\n"
7834 "};",
7835 Style);
7836 verifyFormat("typedef struct Foo {\n"
7837 " Foo();\n"
7838 "} Foo_t;",
7839 Style);
7840 verifyFormat("union Foo {\n"
7841 " A,\n"
7842 "};",
7843 Style);
7844 verifyFormat("typedef union Foo {\n"
7845 " A,\n"
7846 "} Foo_t;",
7847 Style);
7848 verifyFormat("namespace Foo {\n"
7849 "void Bar();\n"
7850 "};",
7851 Style);
7852
7853 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7854 Style.BraceWrapping.AfterClass = true;
7855 Style.BraceWrapping.AfterStruct = true;
7856 Style.BraceWrapping.AfterUnion = true;
7857 Style.BraceWrapping.AfterNamespace = true;
7858 verifyFormat("class Foo\n"
7859 "{\n"
7860 " Foo();\n"
7861 "};",
7862 Style);
7863 verifyFormat("typedef class Foo\n"
7864 "{\n"
7865 " Foo();\n"
7866 "} Foo_t;",
7867 Style);
7868 verifyFormat("struct Foo\n"
7869 "{\n"
7870 " Foo();\n"
7871 "};",
7872 Style);
7873 verifyFormat("typedef struct Foo\n"
7874 "{\n"
7875 " Foo();\n"
7876 "} Foo_t;",
7877 Style);
7878 verifyFormat("union Foo\n"
7879 "{\n"
7880 " A,\n"
7881 "};",
7882 Style);
7883 verifyFormat("typedef union Foo\n"
7884 "{\n"
7885 " A,\n"
7886 "} Foo_t;",
7887 Style);
7888 verifyFormat("namespace Foo\n"
7889 "{\n"
7890 "void Bar();\n"
7891 "};",
7892 Style);
7893}
7894
Manuel Klimeke01bab52013-01-15 13:38:33 +00007895TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7896 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007897 verifyFormat("struct foo a = {bar};\nint n;");
7898 verifyFormat("class foo a = {bar};\nint n;");
7899 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007900
7901 // Elaborate types inside function definitions.
7902 verifyFormat("struct foo f() {}\nint n;");
7903 verifyFormat("class foo f() {}\nint n;");
7904 verifyFormat("union foo f() {}\nint n;");
7905
7906 // Templates.
7907 verifyFormat("template <class X> void f() {}\nint n;");
7908 verifyFormat("template <struct X> void f() {}\nint n;");
7909 verifyFormat("template <union X> void f() {}\nint n;");
7910
7911 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007912 verifyFormat("struct {\n} n;");
7913 verifyFormat(
7914 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007915 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007916 verifyFormat("class MACRO Z {\n} n;");
7917 verifyFormat("class MACRO(X) Z {\n} n;");
7918 verifyFormat("class __attribute__(X) Z {\n} n;");
7919 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007920 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007921 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007922 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7923 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007924
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007925 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007926 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007927
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007928 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007929 verifyFormat(
7930 "template <typename F>\n"
7931 "Matcher(const Matcher<F> &Other,\n"
7932 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7933 " !is_same<F, T>::value>::type * = 0)\n"
7934 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7935
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007936 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007937 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007938 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007939
7940 // FIXME:
7941 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007942 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007943
Manuel Klimeke01bab52013-01-15 13:38:33 +00007944 // Elaborate types where incorrectly parsing the structural element would
7945 // break the indent.
7946 verifyFormat("if (true)\n"
7947 " class X x;\n"
7948 "else\n"
7949 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007950
7951 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007952 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007953}
7954
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007955TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007956 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7957 format("#error Leave all white!!!!! space* alone!\n"));
7958 EXPECT_EQ(
7959 "#warning Leave all white!!!!! space* alone!\n",
7960 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007961 EXPECT_EQ("#error 1", format(" # error 1"));
7962 EXPECT_EQ("#warning 1", format(" # warning 1"));
7963}
7964
Daniel Jasper4431aa92013-04-23 13:54:04 +00007965TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007966 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007967 verifyFormat("#if (AAAA && BBBB)");
7968 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007969 // FIXME: Come up with a better indentation for #elif.
7970 verifyFormat(
7971 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7972 " defined(BBBBBBBB)\n"
7973 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7974 " defined(BBBBBBBB)\n"
7975 "#endif",
7976 getLLVMStyleWithColumns(65));
7977}
7978
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007979TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7980 FormatStyle AllowsMergedIf = getGoogleStyle();
7981 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7982 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7983 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007984 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7985 EXPECT_EQ("if (true) return 42;",
7986 format("if (true)\nreturn 42;", AllowsMergedIf));
7987 FormatStyle ShortMergedIf = AllowsMergedIf;
7988 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007989 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007990 " if (true) return 42;",
7991 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007992 verifyFormat("#define A \\\n"
7993 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007994 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007995 "#define B",
7996 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007997 verifyFormat("#define A \\\n"
7998 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007999 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00008000 "g();",
8001 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00008002 verifyFormat("{\n"
8003 "#ifdef A\n"
8004 " // Comment\n"
8005 " if (true) continue;\n"
8006 "#endif\n"
8007 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00008008 " if (true) continue;\n"
8009 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00008010 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00008011 ShortMergedIf.ColumnLimit = 33;
8012 verifyFormat("#define A \\\n"
8013 " if constexpr (true) return 42;",
8014 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00008015 ShortMergedIf.ColumnLimit = 29;
8016 verifyFormat("#define A \\\n"
8017 " if (aaaaaaaaaa) return 1; \\\n"
8018 " return 2;",
8019 ShortMergedIf);
8020 ShortMergedIf.ColumnLimit = 28;
8021 verifyFormat("#define A \\\n"
8022 " if (aaaaaaaaaa) \\\n"
8023 " return 1; \\\n"
8024 " return 2;",
8025 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00008026 verifyFormat("#define A \\\n"
8027 " if constexpr (aaaaaaa) \\\n"
8028 " return 1; \\\n"
8029 " return 2;",
8030 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00008031}
8032
Manuel Klimekd33516e2013-01-23 10:09:28 +00008033TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00008034 verifyFormat("void f(int *a);");
8035 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00008036 verifyFormat("class A {\n void f(int *a);\n};");
8037 verifyFormat("class A {\n int *a;\n};");
8038 verifyFormat("namespace a {\n"
8039 "namespace b {\n"
8040 "class A {\n"
8041 " void f() {}\n"
8042 " int *a;\n"
8043 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00008044 "} // namespace b\n"
8045 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00008046}
8047
Manuel Klimekd33516e2013-01-23 10:09:28 +00008048TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
8049 verifyFormat("while");
8050 verifyFormat("operator");
8051}
8052
Daniel Jasperfda47cd2016-10-31 13:23:00 +00008053TEST_F(FormatTest, SkipsDeeplyNestedLines) {
8054 // This code would be painfully slow to format if we didn't skip it.
8055 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
8056 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8057 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8058 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8059 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8060 "A(1, 1)\n"
8061 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
8062 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8063 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8064 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8065 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8066 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8067 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8068 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8069 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8070 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
8071 // Deeply nested part is untouched, rest is formatted.
8072 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
8073 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00008074 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00008075}
8076
Nico Weber7e6a7a12013-01-08 17:56:31 +00008077//===----------------------------------------------------------------------===//
8078// Objective-C tests.
8079//===----------------------------------------------------------------------===//
8080
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008081TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
8082 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
8083 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
8084 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00008085 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008086 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
8087 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
8088 format("-(NSInteger)Method3:(id)anObject;"));
8089 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
8090 format("-(NSInteger)Method4:(id)anObject;"));
8091 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
8092 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
8093 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
8094 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00008095 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8096 "forAllCells:(BOOL)flag;",
8097 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8098 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00008099
8100 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00008101 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
8102 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00008103 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
8104 " inRange:(NSRange)range\n"
8105 " outRange:(NSRange)out_range\n"
8106 " outRange1:(NSRange)out_range1\n"
8107 " outRange2:(NSRange)out_range2\n"
8108 " outRange3:(NSRange)out_range3\n"
8109 " outRange4:(NSRange)out_range4\n"
8110 " outRange5:(NSRange)out_range5\n"
8111 " outRange6:(NSRange)out_range6\n"
8112 " outRange7:(NSRange)out_range7\n"
8113 " outRange8:(NSRange)out_range8\n"
8114 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00008115
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008116 // When the function name has to be wrapped.
8117 FormatStyle Style = getLLVMStyle();
Ben Hamilton416348e2018-04-12 15:11:48 +00008118 // ObjC ignores IndentWrappedFunctionNames when wrapping methods
8119 // and always indents instead.
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008120 Style.IndentWrappedFunctionNames = false;
8121 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
Ben Hamilton416348e2018-04-12 15:11:48 +00008122 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
8123 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008124 "}",
8125 Style);
8126 Style.IndentWrappedFunctionNames = true;
8127 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
Ben Hamilton416348e2018-04-12 15:11:48 +00008128 " veryLooooooooooongName:(NSString)cccccccccccccc\n"
8129 " anotherName:(NSString)dddddddddddddd {\n"
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008130 "}",
8131 Style);
8132
Nico Weberd6f962f2013-01-10 20:18:33 +00008133 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00008134 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00008135 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
8136 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00008137 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00008138
Daniel Jasper37194282013-05-28 08:33:00 +00008139 verifyFormat("- (int (*)())foo:(int (*)())f;");
8140 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00008141
8142 // If there's no return type (very rare in practice!), LLVM and Google style
8143 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00008144 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00008145 verifyFormat("- foo:(int)f;");
8146 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008147}
8148
Nico Weber0588b502013-02-07 00:19:29 +00008149
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008150TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00008151 EXPECT_EQ("\"some text \"\n"
8152 "\"other\";",
8153 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00008154 EXPECT_EQ("\"some text \"\n"
8155 "\"other\";",
8156 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008157 EXPECT_EQ(
8158 "#define A \\\n"
8159 " \"some \" \\\n"
8160 " \"text \" \\\n"
8161 " \"other\";",
8162 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
8163 EXPECT_EQ(
8164 "#define A \\\n"
8165 " \"so \" \\\n"
8166 " \"text \" \\\n"
8167 " \"other\";",
8168 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
8169
8170 EXPECT_EQ("\"some text\"",
8171 format("\"some text\"", getLLVMStyleWithColumns(1)));
8172 EXPECT_EQ("\"some text\"",
8173 format("\"some text\"", getLLVMStyleWithColumns(11)));
8174 EXPECT_EQ("\"some \"\n"
8175 "\"text\"",
8176 format("\"some text\"", getLLVMStyleWithColumns(10)));
8177 EXPECT_EQ("\"some \"\n"
8178 "\"text\"",
8179 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00008180 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008181 "\" tex\"\n"
8182 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008183 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00008184 EXPECT_EQ("\"some\"\n"
8185 "\" tex\"\n"
8186 "\" and\"",
8187 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
8188 EXPECT_EQ("\"some\"\n"
8189 "\"/tex\"\n"
8190 "\"/and\"",
8191 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008192
8193 EXPECT_EQ("variable =\n"
8194 " \"long string \"\n"
8195 " \"literal\";",
8196 format("variable = \"long string literal\";",
8197 getLLVMStyleWithColumns(20)));
8198
8199 EXPECT_EQ("variable = f(\n"
8200 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00008201 " \"literal\",\n"
8202 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00008203 " loooooooooooooooooooong);",
8204 format("variable = f(\"long string literal\", short, "
8205 "loooooooooooooooooooong);",
8206 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008207
Daniel Jaspera44991332015-04-29 13:06:49 +00008208 EXPECT_EQ(
8209 "f(g(\"long string \"\n"
8210 " \"literal\"),\n"
8211 " b);",
8212 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008213 EXPECT_EQ("f(g(\"long string \"\n"
8214 " \"literal\",\n"
8215 " a),\n"
8216 " b);",
8217 format("f(g(\"long string literal\", a), b);",
8218 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008219 EXPECT_EQ(
8220 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00008221 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008222 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8223 EXPECT_EQ("f(\"one two three four five six \"\n"
8224 " \"seven\".split(\n"
8225 " really_looooong_variable));",
8226 format("f(\"one two three four five six seven\"."
8227 "split(really_looooong_variable));",
8228 getLLVMStyleWithColumns(33)));
8229
8230 EXPECT_EQ("f(\"some \"\n"
8231 " \"text\",\n"
8232 " other);",
8233 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008234
8235 // Only break as a last resort.
8236 verifyFormat(
8237 "aaaaaaaaaaaaaaaaaaaa(\n"
8238 " aaaaaaaaaaaaaaaaaaaa,\n"
8239 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008240
Daniel Jaspera44991332015-04-29 13:06:49 +00008241 EXPECT_EQ("\"splitmea\"\n"
8242 "\"trandomp\"\n"
8243 "\"oint\"",
8244 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008245
Daniel Jaspera44991332015-04-29 13:06:49 +00008246 EXPECT_EQ("\"split/\"\n"
8247 "\"pathat/\"\n"
8248 "\"slashes\"",
8249 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008250
Daniel Jaspera44991332015-04-29 13:06:49 +00008251 EXPECT_EQ("\"split/\"\n"
8252 "\"pathat/\"\n"
8253 "\"slashes\"",
8254 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008255 EXPECT_EQ("\"split at \"\n"
8256 "\"spaces/at/\"\n"
8257 "\"slashes.at.any$\"\n"
8258 "\"non-alphanumeric%\"\n"
8259 "\"1111111111characte\"\n"
8260 "\"rs\"",
8261 format("\"split at "
8262 "spaces/at/"
8263 "slashes.at."
8264 "any$non-"
8265 "alphanumeric%"
8266 "1111111111characte"
8267 "rs\"",
8268 getLLVMStyleWithColumns(20)));
8269
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008270 // Verify that splitting the strings understands
8271 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008272 EXPECT_EQ(
8273 "aaaaaaaaaaaa(\n"
8274 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8275 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8276 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8277 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8278 "aaaaaaaaaaaaaaaaaaaaaa\");",
8279 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008280 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8281 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8282 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8283 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8284 "aaaaaaaaaaaaaaaaaaaaaa\";",
8285 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008286 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8287 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8288 format("llvm::outs() << "
8289 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8290 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008291 EXPECT_EQ("ffff(\n"
8292 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8293 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8294 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8295 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8296 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008297
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008298 FormatStyle Style = getLLVMStyleWithColumns(12);
8299 Style.BreakStringLiterals = false;
8300 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8301
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008302 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008303 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00008304 EXPECT_EQ("#define A \\\n"
8305 " \"some \" \\\n"
8306 " \"text \" \\\n"
8307 " \"other\";",
8308 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008309}
8310
Manuel Klimek93699f42017-11-29 14:29:43 +00008311TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
8312 EXPECT_EQ("C a = \"some more \"\n"
8313 " \"text\";",
8314 format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
8315}
8316
Manuel Klimek9e321992015-07-28 15:50:24 +00008317TEST_F(FormatTest, FullyRemoveEmptyLines) {
8318 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8319 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8320 EXPECT_EQ("int i = a(b());",
8321 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8322}
8323
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008324TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8325 EXPECT_EQ(
8326 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8327 "(\n"
8328 " \"x\t\");",
8329 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8330 "aaaaaaa("
8331 "\"x\t\");"));
8332}
8333
Daniel Jasper174b0122014-01-09 14:18:12 +00008334TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008335 EXPECT_EQ(
8336 "u8\"utf8 string \"\n"
8337 "u8\"literal\";",
8338 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8339 EXPECT_EQ(
8340 "u\"utf16 string \"\n"
8341 "u\"literal\";",
8342 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8343 EXPECT_EQ(
8344 "U\"utf32 string \"\n"
8345 "U\"literal\";",
8346 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8347 EXPECT_EQ("L\"wide string \"\n"
8348 "L\"literal\";",
8349 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008350 EXPECT_EQ("@\"NSString \"\n"
8351 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008352 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00008353 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008354
8355 // This input makes clang-format try to split the incomplete unicode escape
8356 // sequence, which used to lead to a crasher.
8357 verifyNoCrash(
8358 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8359 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008360}
8361
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008362TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8363 FormatStyle Style = getGoogleStyleWithColumns(15);
8364 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8365 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8366 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8367 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8368 EXPECT_EQ("u8R\"x(raw literal)x\";",
8369 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008370}
8371
8372TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8373 FormatStyle Style = getLLVMStyleWithColumns(20);
8374 EXPECT_EQ(
8375 "_T(\"aaaaaaaaaaaaaa\")\n"
8376 "_T(\"aaaaaaaaaaaaaa\")\n"
8377 "_T(\"aaaaaaaaaaaa\")",
8378 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00008379 EXPECT_EQ("f(x,\n"
8380 " _T(\"aaaaaaaaaaaa\")\n"
8381 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00008382 " z);",
8383 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8384
8385 // FIXME: Handle embedded spaces in one iteration.
8386 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8387 // "_T(\"aaaaaaaaaaaaa\")\n"
8388 // "_T(\"aaaaaaaaaaaaa\")\n"
8389 // "_T(\"a\")",
8390 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8391 // getLLVMStyleWithColumns(20)));
8392 EXPECT_EQ(
8393 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8394 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008395 EXPECT_EQ("f(\n"
8396 "#if !TEST\n"
8397 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8398 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00008399 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008400 format("f(\n"
8401 "#if !TEST\n"
8402 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8403 "#endif\n"
8404 ");"));
8405 EXPECT_EQ("f(\n"
8406 "\n"
8407 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8408 format("f(\n"
8409 "\n"
8410 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008411}
8412
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00008413TEST_F(FormatTest, BreaksStringLiteralOperands) {
8414 // In a function call with two operands, the second can be broken with no line
8415 // break before it.
8416 EXPECT_EQ("func(a, \"long long \"\n"
8417 " \"long long\");",
8418 format("func(a, \"long long long long\");",
8419 getLLVMStyleWithColumns(24)));
8420 // In a function call with three operands, the second must be broken with a
8421 // line break before it.
8422 EXPECT_EQ("func(a,\n"
8423 " \"long long long \"\n"
8424 " \"long\",\n"
8425 " c);",
8426 format("func(a, \"long long long long\", c);",
8427 getLLVMStyleWithColumns(24)));
8428 // In a function call with three operands, the third must be broken with a
8429 // line break before it.
8430 EXPECT_EQ("func(a, b,\n"
8431 " \"long long long \"\n"
8432 " \"long\");",
8433 format("func(a, b, \"long long long long\");",
8434 getLLVMStyleWithColumns(24)));
8435 // In a function call with three operands, both the second and the third must
8436 // be broken with a line break before them.
8437 EXPECT_EQ("func(a,\n"
8438 " \"long long long \"\n"
8439 " \"long\",\n"
8440 " \"long long long \"\n"
8441 " \"long\");",
8442 format("func(a, \"long long long long\", \"long long long long\");",
8443 getLLVMStyleWithColumns(24)));
8444 // In a chain of << with two operands, the second can be broken with no line
8445 // break before it.
8446 EXPECT_EQ("a << \"line line \"\n"
8447 " \"line\";",
8448 format("a << \"line line line\";",
8449 getLLVMStyleWithColumns(20)));
8450 // In a chain of << with three operands, the second can be broken with no line
8451 // break before it.
8452 EXPECT_EQ("abcde << \"line \"\n"
8453 " \"line line\"\n"
8454 " << c;",
8455 format("abcde << \"line line line\" << c;",
8456 getLLVMStyleWithColumns(20)));
8457 // In a chain of << with three operands, the third must be broken with a line
8458 // break before it.
8459 EXPECT_EQ("a << b\n"
8460 " << \"line line \"\n"
8461 " \"line\";",
8462 format("a << b << \"line line line\";",
8463 getLLVMStyleWithColumns(20)));
8464 // In a chain of << with three operands, the second can be broken with no line
8465 // break before it and the third must be broken with a line break before it.
8466 EXPECT_EQ("abcd << \"line line \"\n"
8467 " \"line\"\n"
8468 " << \"line line \"\n"
8469 " \"line\";",
8470 format("abcd << \"line line line\" << \"line line line\";",
8471 getLLVMStyleWithColumns(20)));
8472 // In a chain of binary operators with two operands, the second can be broken
8473 // with no line break before it.
8474 EXPECT_EQ("abcd + \"line line \"\n"
8475 " \"line line\";",
8476 format("abcd + \"line line line line\";",
8477 getLLVMStyleWithColumns(20)));
8478 // In a chain of binary operators with three operands, the second must be
8479 // broken with a line break before it.
8480 EXPECT_EQ("abcd +\n"
8481 " \"line line \"\n"
8482 " \"line line\" +\n"
8483 " e;",
8484 format("abcd + \"line line line line\" + e;",
8485 getLLVMStyleWithColumns(20)));
8486 // In a function call with two operands, with AlignAfterOpenBracket enabled,
8487 // the first must be broken with a line break before it.
8488 FormatStyle Style = getLLVMStyleWithColumns(25);
8489 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8490 EXPECT_EQ("someFunction(\n"
8491 " \"long long long \"\n"
8492 " \"long\",\n"
8493 " a);",
8494 format("someFunction(\"long long long long\", a);", Style));
8495}
8496
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008497TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008498 EXPECT_EQ(
8499 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8500 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8501 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8502 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8503 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8505}
8506
8507TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8508 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008509 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008510 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8511 "multiline raw string literal xxxxxxxxxxxxxx\n"
8512 ")x\",\n"
8513 " a),\n"
8514 " b);",
8515 format("fffffffffff(g(R\"x(\n"
8516 "multiline raw string literal xxxxxxxxxxxxxx\n"
8517 ")x\", a), b);",
8518 getGoogleStyleWithColumns(20)));
8519 EXPECT_EQ("fffffffffff(\n"
8520 " g(R\"x(qqq\n"
8521 "multiline raw string literal xxxxxxxxxxxxxx\n"
8522 ")x\",\n"
8523 " a),\n"
8524 " b);",
8525 format("fffffffffff(g(R\"x(qqq\n"
8526 "multiline raw string literal xxxxxxxxxxxxxx\n"
8527 ")x\", a), b);",
8528 getGoogleStyleWithColumns(20)));
8529
8530 EXPECT_EQ("fffffffffff(R\"x(\n"
8531 "multiline raw string literal xxxxxxxxxxxxxx\n"
8532 ")x\");",
8533 format("fffffffffff(R\"x(\n"
8534 "multiline raw string literal xxxxxxxxxxxxxx\n"
8535 ")x\");",
8536 getGoogleStyleWithColumns(20)));
8537 EXPECT_EQ("fffffffffff(R\"x(\n"
8538 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008539 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008540 format("fffffffffff(R\"x(\n"
8541 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008542 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008543 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008544 EXPECT_EQ("fffffffffff(\n"
8545 " R\"x(\n"
8546 "multiline raw string literal xxxxxxxxxxxxxx\n"
8547 ")x\" +\n"
8548 " bbbbbb);",
8549 format("fffffffffff(\n"
8550 " R\"x(\n"
8551 "multiline raw string literal xxxxxxxxxxxxxx\n"
8552 ")x\" + bbbbbb);",
8553 getGoogleStyleWithColumns(20)));
Daniel Jasperfd327672018-03-22 14:43:54 +00008554 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
8555 format("fffffffffff(\n"
8556 " R\"(single line raw string)\" + bbbbbb);"));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008557}
8558
Alexander Kornienkobe633902013-06-14 11:46:10 +00008559TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008560 verifyFormat("string a = \"unterminated;");
8561 EXPECT_EQ("function(\"unterminated,\n"
8562 " OtherParameter);",
8563 format("function( \"unterminated,\n"
8564 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008565}
8566
8567TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008568 FormatStyle Style = getLLVMStyle();
8569 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008570 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008571 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008572}
8573
Daniel Jaspera44991332015-04-29 13:06:49 +00008574TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008575
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008576TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8577 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8578 " \"ddeeefff\");",
8579 format("someFunction(\"aaabbbcccdddeeefff\");",
8580 getLLVMStyleWithColumns(25)));
8581 EXPECT_EQ("someFunction1234567890(\n"
8582 " \"aaabbbcccdddeeefff\");",
8583 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8584 getLLVMStyleWithColumns(26)));
8585 EXPECT_EQ("someFunction1234567890(\n"
8586 " \"aaabbbcccdddeeeff\"\n"
8587 " \"f\");",
8588 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8589 getLLVMStyleWithColumns(25)));
8590 EXPECT_EQ("someFunction1234567890(\n"
8591 " \"aaabbbcccdddeeeff\"\n"
8592 " \"f\");",
8593 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8594 getLLVMStyleWithColumns(24)));
Manuel Klimek77866142017-11-17 11:17:15 +00008595 EXPECT_EQ("someFunction(\n"
8596 " \"aaabbbcc ddde \"\n"
8597 " \"efff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008598 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008599 getLLVMStyleWithColumns(25)));
8600 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8601 " \"ddeeefff\");",
8602 format("someFunction(\"aaabbbccc ddeeefff\");",
8603 getLLVMStyleWithColumns(25)));
8604 EXPECT_EQ("someFunction1234567890(\n"
8605 " \"aaabb \"\n"
8606 " \"cccdddeeefff\");",
8607 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8608 getLLVMStyleWithColumns(25)));
8609 EXPECT_EQ("#define A \\\n"
8610 " string s = \\\n"
8611 " \"123456789\" \\\n"
8612 " \"0\"; \\\n"
8613 " int i;",
8614 format("#define A string s = \"1234567890\"; int i;",
8615 getLLVMStyleWithColumns(20)));
Manuel Klimek77866142017-11-17 11:17:15 +00008616 EXPECT_EQ("someFunction(\n"
8617 " \"aaabbbcc \"\n"
8618 " \"dddeeefff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008619 format("someFunction(\"aaabbbcc dddeeefff\");",
8620 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008621}
8622
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008623TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008624 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8625 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008626 EXPECT_EQ("\"test\"\n"
8627 "\"\\n\"",
8628 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8629 EXPECT_EQ("\"tes\\\\\"\n"
8630 "\"n\"",
8631 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8632 EXPECT_EQ("\"\\\\\\\\\"\n"
8633 "\"\\n\"",
8634 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008635 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008636 EXPECT_EQ("\"\\uff01\"\n"
8637 "\"test\"",
8638 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8639 EXPECT_EQ("\"\\Uff01ff02\"",
8640 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8641 EXPECT_EQ("\"\\x000000000001\"\n"
8642 "\"next\"",
8643 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8644 EXPECT_EQ("\"\\x000000000001next\"",
8645 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8646 EXPECT_EQ("\"\\x000000000001\"",
8647 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8648 EXPECT_EQ("\"test\"\n"
8649 "\"\\000000\"\n"
8650 "\"000001\"",
8651 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8652 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008653 "\"00000000\"\n"
8654 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008655 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008656}
8657
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008658TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8659 verifyFormat("void f() {\n"
8660 " return g() {}\n"
8661 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008662 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008663 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008664 "}");
8665}
8666
Manuel Klimek421147e2014-01-24 09:25:23 +00008667TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8668 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008669 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008670}
8671
Manuel Klimek13b97d82013-05-13 08:42:42 +00008672TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8673 verifyFormat("class X {\n"
8674 " void f() {\n"
8675 " }\n"
8676 "};",
8677 getLLVMStyleWithColumns(12));
8678}
8679
8680TEST_F(FormatTest, ConfigurableIndentWidth) {
8681 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8682 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008683 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008684 verifyFormat("void f() {\n"
8685 " someFunction();\n"
8686 " if (true) {\n"
8687 " f();\n"
8688 " }\n"
8689 "}",
8690 EightIndent);
8691 verifyFormat("class X {\n"
8692 " void f() {\n"
8693 " }\n"
8694 "};",
8695 EightIndent);
8696 verifyFormat("int x[] = {\n"
8697 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008698 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008699 EightIndent);
8700}
8701
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008702TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008703 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008704 "f();",
8705 getLLVMStyleWithColumns(8));
8706}
8707
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008708TEST_F(FormatTest, ConfigurableUseOfTab) {
8709 FormatStyle Tab = getLLVMStyleWithColumns(42);
8710 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008711 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008712 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008713
8714 EXPECT_EQ("if (aaaaaaaa && // q\n"
8715 " bb)\t\t// w\n"
8716 "\t;",
8717 format("if (aaaaaaaa &&// q\n"
8718 "bb)// w\n"
8719 ";",
8720 Tab));
8721 EXPECT_EQ("if (aaa && bbb) // w\n"
8722 "\t;",
8723 format("if(aaa&&bbb)// w\n"
8724 ";",
8725 Tab));
8726
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008727 verifyFormat("class X {\n"
8728 "\tvoid f() {\n"
8729 "\t\tsomeFunction(parameter1,\n"
8730 "\t\t\t parameter2);\n"
8731 "\t}\n"
8732 "};",
8733 Tab);
8734 verifyFormat("#define A \\\n"
8735 "\tvoid f() { \\\n"
8736 "\t\tsomeFunction( \\\n"
8737 "\t\t parameter1, \\\n"
8738 "\t\t parameter2); \\\n"
8739 "\t}",
8740 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008741
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008742 Tab.TabWidth = 4;
8743 Tab.IndentWidth = 8;
8744 verifyFormat("class TabWidth4Indent8 {\n"
8745 "\t\tvoid f() {\n"
8746 "\t\t\t\tsomeFunction(parameter1,\n"
8747 "\t\t\t\t\t\t\t parameter2);\n"
8748 "\t\t}\n"
8749 "};",
8750 Tab);
8751
8752 Tab.TabWidth = 4;
8753 Tab.IndentWidth = 4;
8754 verifyFormat("class TabWidth4Indent4 {\n"
8755 "\tvoid f() {\n"
8756 "\t\tsomeFunction(parameter1,\n"
8757 "\t\t\t\t\t parameter2);\n"
8758 "\t}\n"
8759 "};",
8760 Tab);
8761
8762 Tab.TabWidth = 8;
8763 Tab.IndentWidth = 4;
8764 verifyFormat("class TabWidth8Indent4 {\n"
8765 " void f() {\n"
8766 "\tsomeFunction(parameter1,\n"
8767 "\t\t parameter2);\n"
8768 " }\n"
8769 "};",
8770 Tab);
8771
Alexander Kornienko39856b72013-09-10 09:38:25 +00008772 Tab.TabWidth = 8;
8773 Tab.IndentWidth = 8;
8774 EXPECT_EQ("/*\n"
8775 "\t a\t\tcomment\n"
8776 "\t in multiple lines\n"
8777 " */",
8778 format(" /*\t \t \n"
8779 " \t \t a\t\tcomment\t \t\n"
8780 " \t \t in multiple lines\t\n"
8781 " \t */",
8782 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008783
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008784 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008785 verifyFormat("{\n"
8786 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8787 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8788 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8789 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8790 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8791 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008792 "};",
8793 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008794 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008795 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008796 "\ta2,\n"
8797 "\ta3\n"
8798 "};",
8799 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008800 EXPECT_EQ("if (aaaaaaaa && // q\n"
8801 " bb) // w\n"
8802 "\t;",
8803 format("if (aaaaaaaa &&// q\n"
8804 "bb)// w\n"
8805 ";",
8806 Tab));
8807 verifyFormat("class X {\n"
8808 "\tvoid f() {\n"
8809 "\t\tsomeFunction(parameter1,\n"
8810 "\t\t parameter2);\n"
8811 "\t}\n"
8812 "};",
8813 Tab);
8814 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008815 "\tQ(\n"
8816 "\t {\n"
8817 "\t\t int a;\n"
8818 "\t\t someFunction(aaaaaaaa,\n"
8819 "\t\t bbbbbbb);\n"
8820 "\t },\n"
8821 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008822 "}",
8823 Tab);
8824 EXPECT_EQ("{\n"
8825 "\t/* aaaa\n"
8826 "\t bbbb */\n"
8827 "}",
8828 format("{\n"
8829 "/* aaaa\n"
8830 " bbbb */\n"
8831 "}",
8832 Tab));
8833 EXPECT_EQ("{\n"
8834 "\t/*\n"
8835 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8836 "\t bbbbbbbbbbbbb\n"
8837 "\t*/\n"
8838 "}",
8839 format("{\n"
8840 "/*\n"
8841 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8842 "*/\n"
8843 "}",
8844 Tab));
8845 EXPECT_EQ("{\n"
8846 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8847 "\t// bbbbbbbbbbbbb\n"
8848 "}",
8849 format("{\n"
8850 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8851 "}",
8852 Tab));
8853 EXPECT_EQ("{\n"
8854 "\t/*\n"
8855 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8856 "\t bbbbbbbbbbbbb\n"
8857 "\t*/\n"
8858 "}",
8859 format("{\n"
8860 "\t/*\n"
8861 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8862 "\t*/\n"
8863 "}",
8864 Tab));
8865 EXPECT_EQ("{\n"
8866 "\t/*\n"
8867 "\n"
8868 "\t*/\n"
8869 "}",
8870 format("{\n"
8871 "\t/*\n"
8872 "\n"
8873 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008874 "}",
8875 Tab));
8876 EXPECT_EQ("{\n"
8877 "\t/*\n"
8878 " asdf\n"
8879 "\t*/\n"
8880 "}",
8881 format("{\n"
8882 "\t/*\n"
8883 " asdf\n"
8884 "\t*/\n"
8885 "}",
8886 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008887
8888 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008889 EXPECT_EQ("/*\n"
8890 " a\t\tcomment\n"
8891 " in multiple lines\n"
8892 " */",
8893 format(" /*\t \t \n"
8894 " \t \t a\t\tcomment\t \t\n"
8895 " \t \t in multiple lines\t\n"
8896 " \t */",
8897 Tab));
8898 EXPECT_EQ("/* some\n"
8899 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008900 format(" \t \t /* some\n"
8901 " \t \t comment */",
8902 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008903 EXPECT_EQ("int a; /* some\n"
8904 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008905 format(" \t \t int a; /* some\n"
8906 " \t \t comment */",
8907 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008908
Alexander Kornienko39856b72013-09-10 09:38:25 +00008909 EXPECT_EQ("int a; /* some\n"
8910 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008911 format(" \t \t int\ta; /* some\n"
8912 " \t \t comment */",
8913 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008914 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8915 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008916 format(" \t \t f(\"\t\t\"); /* some\n"
8917 " \t \t comment */",
8918 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008919 EXPECT_EQ("{\n"
8920 " /*\n"
8921 " * Comment\n"
8922 " */\n"
8923 " int i;\n"
8924 "}",
8925 format("{\n"
8926 "\t/*\n"
8927 "\t * Comment\n"
8928 "\t */\n"
8929 "\t int i;\n"
8930 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008931
8932 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8933 Tab.TabWidth = 8;
8934 Tab.IndentWidth = 8;
8935 EXPECT_EQ("if (aaaaaaaa && // q\n"
8936 " bb) // w\n"
8937 "\t;",
8938 format("if (aaaaaaaa &&// q\n"
8939 "bb)// w\n"
8940 ";",
8941 Tab));
8942 EXPECT_EQ("if (aaa && bbb) // w\n"
8943 "\t;",
8944 format("if(aaa&&bbb)// w\n"
8945 ";",
8946 Tab));
8947 verifyFormat("class X {\n"
8948 "\tvoid f() {\n"
8949 "\t\tsomeFunction(parameter1,\n"
8950 "\t\t\t parameter2);\n"
8951 "\t}\n"
8952 "};",
8953 Tab);
8954 verifyFormat("#define A \\\n"
8955 "\tvoid f() { \\\n"
8956 "\t\tsomeFunction( \\\n"
8957 "\t\t parameter1, \\\n"
8958 "\t\t parameter2); \\\n"
8959 "\t}",
8960 Tab);
8961 Tab.TabWidth = 4;
8962 Tab.IndentWidth = 8;
8963 verifyFormat("class TabWidth4Indent8 {\n"
8964 "\t\tvoid f() {\n"
8965 "\t\t\t\tsomeFunction(parameter1,\n"
8966 "\t\t\t\t\t\t\t parameter2);\n"
8967 "\t\t}\n"
8968 "};",
8969 Tab);
8970 Tab.TabWidth = 4;
8971 Tab.IndentWidth = 4;
8972 verifyFormat("class TabWidth4Indent4 {\n"
8973 "\tvoid f() {\n"
8974 "\t\tsomeFunction(parameter1,\n"
8975 "\t\t\t\t\t parameter2);\n"
8976 "\t}\n"
8977 "};",
8978 Tab);
8979 Tab.TabWidth = 8;
8980 Tab.IndentWidth = 4;
8981 verifyFormat("class TabWidth8Indent4 {\n"
8982 " void f() {\n"
8983 "\tsomeFunction(parameter1,\n"
8984 "\t\t parameter2);\n"
8985 " }\n"
8986 "};",
8987 Tab);
8988 Tab.TabWidth = 8;
8989 Tab.IndentWidth = 8;
8990 EXPECT_EQ("/*\n"
8991 "\t a\t\tcomment\n"
8992 "\t in multiple lines\n"
8993 " */",
8994 format(" /*\t \t \n"
8995 " \t \t a\t\tcomment\t \t\n"
8996 " \t \t in multiple lines\t\n"
8997 " \t */",
8998 Tab));
8999 verifyFormat("{\n"
9000 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9001 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9002 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9003 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9004 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9005 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9006 "};",
9007 Tab);
9008 verifyFormat("enum AA {\n"
9009 "\ta1, // Force multiple lines\n"
9010 "\ta2,\n"
9011 "\ta3\n"
9012 "};",
9013 Tab);
9014 EXPECT_EQ("if (aaaaaaaa && // q\n"
9015 " bb) // w\n"
9016 "\t;",
9017 format("if (aaaaaaaa &&// q\n"
9018 "bb)// w\n"
9019 ";",
9020 Tab));
9021 verifyFormat("class X {\n"
9022 "\tvoid f() {\n"
9023 "\t\tsomeFunction(parameter1,\n"
9024 "\t\t\t parameter2);\n"
9025 "\t}\n"
9026 "};",
9027 Tab);
9028 verifyFormat("{\n"
9029 "\tQ(\n"
9030 "\t {\n"
9031 "\t\t int a;\n"
9032 "\t\t someFunction(aaaaaaaa,\n"
9033 "\t\t\t\t bbbbbbb);\n"
9034 "\t },\n"
9035 "\t p);\n"
9036 "}",
9037 Tab);
9038 EXPECT_EQ("{\n"
9039 "\t/* aaaa\n"
9040 "\t bbbb */\n"
9041 "}",
9042 format("{\n"
9043 "/* aaaa\n"
9044 " bbbb */\n"
9045 "}",
9046 Tab));
9047 EXPECT_EQ("{\n"
9048 "\t/*\n"
9049 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9050 "\t bbbbbbbbbbbbb\n"
9051 "\t*/\n"
9052 "}",
9053 format("{\n"
9054 "/*\n"
9055 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9056 "*/\n"
9057 "}",
9058 Tab));
9059 EXPECT_EQ("{\n"
9060 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9061 "\t// bbbbbbbbbbbbb\n"
9062 "}",
9063 format("{\n"
9064 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9065 "}",
9066 Tab));
9067 EXPECT_EQ("{\n"
9068 "\t/*\n"
9069 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9070 "\t bbbbbbbbbbbbb\n"
9071 "\t*/\n"
9072 "}",
9073 format("{\n"
9074 "\t/*\n"
9075 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9076 "\t*/\n"
9077 "}",
9078 Tab));
9079 EXPECT_EQ("{\n"
9080 "\t/*\n"
9081 "\n"
9082 "\t*/\n"
9083 "}",
9084 format("{\n"
9085 "\t/*\n"
9086 "\n"
9087 "\t*/\n"
9088 "}",
9089 Tab));
9090 EXPECT_EQ("{\n"
9091 "\t/*\n"
9092 " asdf\n"
9093 "\t*/\n"
9094 "}",
9095 format("{\n"
9096 "\t/*\n"
9097 " asdf\n"
9098 "\t*/\n"
9099 "}",
9100 Tab));
9101 EXPECT_EQ("/*\n"
9102 "\t a\t\tcomment\n"
9103 "\t in multiple lines\n"
9104 " */",
9105 format(" /*\t \t \n"
9106 " \t \t a\t\tcomment\t \t\n"
9107 " \t \t in multiple lines\t\n"
9108 " \t */",
9109 Tab));
9110 EXPECT_EQ("/* some\n"
9111 " comment */",
9112 format(" \t \t /* some\n"
9113 " \t \t comment */",
9114 Tab));
9115 EXPECT_EQ("int a; /* some\n"
9116 " comment */",
9117 format(" \t \t int a; /* some\n"
9118 " \t \t comment */",
9119 Tab));
9120 EXPECT_EQ("int a; /* some\n"
9121 "comment */",
9122 format(" \t \t int\ta; /* some\n"
9123 " \t \t comment */",
9124 Tab));
9125 EXPECT_EQ("f(\"\t\t\"); /* some\n"
9126 " comment */",
9127 format(" \t \t f(\"\t\t\"); /* some\n"
9128 " \t \t comment */",
9129 Tab));
9130 EXPECT_EQ("{\n"
9131 " /*\n"
9132 " * Comment\n"
9133 " */\n"
9134 " int i;\n"
9135 "}",
9136 format("{\n"
9137 "\t/*\n"
9138 "\t * Comment\n"
9139 "\t */\n"
9140 "\t int i;\n"
9141 "}"));
9142 Tab.AlignConsecutiveAssignments = true;
9143 Tab.AlignConsecutiveDeclarations = true;
9144 Tab.TabWidth = 4;
9145 Tab.IndentWidth = 4;
9146 verifyFormat("class Assign {\n"
9147 "\tvoid f() {\n"
9148 "\t\tint x = 123;\n"
9149 "\t\tint random = 4;\n"
9150 "\t\tstd::string alphabet =\n"
9151 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
9152 "\t}\n"
9153 "};",
9154 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00009155}
9156
Alexander Kornienko917f9e02013-09-10 12:29:48 +00009157TEST_F(FormatTest, CalculatesOriginalColumn) {
9158 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9159 "q\"; /* some\n"
9160 " comment */",
9161 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9162 "q\"; /* some\n"
9163 " comment */",
9164 getLLVMStyle()));
9165 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9166 "/* some\n"
9167 " comment */",
9168 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9169 " /* some\n"
9170 " comment */",
9171 getLLVMStyle()));
9172 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9173 "qqq\n"
9174 "/* some\n"
9175 " comment */",
9176 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9177 "qqq\n"
9178 " /* some\n"
9179 " comment */",
9180 getLLVMStyle()));
9181 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9182 "wwww; /* some\n"
9183 " comment */",
9184 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9185 "wwww; /* some\n"
9186 " comment */",
9187 getLLVMStyle()));
9188}
9189
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009190TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00009191 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009192 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009193
9194 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009195 " continue;",
9196 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009197 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009198 " continue;",
9199 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009200 verifyFormat("if(true)\n"
9201 " f();\n"
9202 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009203 " f();",
9204 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009205 verifyFormat("do {\n"
9206 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009207 "} while(something());",
9208 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009209 verifyFormat("switch(x) {\n"
9210 "default:\n"
9211 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009212 "}",
9213 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00009214 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00009215 verifyFormat("size_t x = sizeof(x);", NoSpace);
9216 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
9217 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
9218 verifyFormat("alignas(128) char a[128];", NoSpace);
9219 verifyFormat("size_t x = alignof(MyType);", NoSpace);
9220 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
9221 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009222 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009223 verifyFormat("T A::operator()();", NoSpace);
9224 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009225
9226 FormatStyle Space = getLLVMStyle();
9227 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
9228
9229 verifyFormat("int f ();", Space);
9230 verifyFormat("void f (int a, T b) {\n"
9231 " while (true)\n"
9232 " continue;\n"
9233 "}",
9234 Space);
9235 verifyFormat("if (true)\n"
9236 " f ();\n"
9237 "else if (true)\n"
9238 " f ();",
9239 Space);
9240 verifyFormat("do {\n"
9241 " do_something ();\n"
9242 "} while (something ());",
9243 Space);
9244 verifyFormat("switch (x) {\n"
9245 "default:\n"
9246 " break;\n"
9247 "}",
9248 Space);
9249 verifyFormat("A::A () : a (1) {}", Space);
9250 verifyFormat("void f () __attribute__ ((asdf));", Space);
9251 verifyFormat("*(&a + 1);\n"
9252 "&((&a)[1]);\n"
9253 "a[(b + c) * d];\n"
9254 "(((a + 1) * 2) + 3) * 4;",
9255 Space);
9256 verifyFormat("#define A(x) x", Space);
9257 verifyFormat("#define A (x) x", Space);
9258 verifyFormat("#if defined(x)\n"
9259 "#endif",
9260 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00009261 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00009262 verifyFormat("size_t x = sizeof (x);", Space);
9263 verifyFormat("auto f (int x) -> decltype (x);", Space);
9264 verifyFormat("int f (T x) noexcept (x.create ());", Space);
9265 verifyFormat("alignas (128) char a[128];", Space);
9266 verifyFormat("size_t x = alignof (MyType);", Space);
9267 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
9268 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009269 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009270 verifyFormat("T A::operator() ();", Space);
9271 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009272}
9273
9274TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
9275 FormatStyle Spaces = getLLVMStyle();
9276
9277 Spaces.SpacesInParentheses = true;
Daniel Jasperd5e9ff42018-03-22 14:30:28 +00009278 verifyFormat("do_something( ::globalVar );", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009279 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009280 verifyFormat("call();", Spaces);
9281 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009282 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
9283 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009284 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009285 " continue;",
9286 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009287 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009288 " continue;",
9289 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009290 verifyFormat("if ( true )\n"
9291 " f();\n"
9292 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009293 " f();",
9294 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009295 verifyFormat("do {\n"
9296 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009297 "} while ( something() );",
9298 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009299 verifyFormat("switch ( x ) {\n"
9300 "default:\n"
9301 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009302 "}",
9303 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009304
9305 Spaces.SpacesInParentheses = false;
9306 Spaces.SpacesInCStyleCastParentheses = true;
9307 verifyFormat("Type *A = ( Type * )P;", Spaces);
9308 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9309 verifyFormat("x = ( int32 )y;", Spaces);
9310 verifyFormat("int a = ( int )(2.0f);", Spaces);
9311 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9312 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9313 verifyFormat("#define x (( int )-1)", Spaces);
9314
Daniel Jasper92e09822015-03-18 12:59:19 +00009315 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00009316 Spaces.SpacesInParentheses = false;
9317 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009318 Spaces.SpacesInCStyleCastParentheses = true;
9319 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009320 verifyFormat("call( );", Spaces);
9321 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009322 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009323 " continue;",
9324 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009325 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009326 " continue;",
9327 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009328 verifyFormat("if (true)\n"
9329 " f( );\n"
9330 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009331 " f( );",
9332 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009333 verifyFormat("do {\n"
9334 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009335 "} while (something( ));",
9336 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009337 verifyFormat("switch (x) {\n"
9338 "default:\n"
9339 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009340 "}",
9341 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009342
Daniel Jasper92e09822015-03-18 12:59:19 +00009343 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009344 Spaces.SpaceAfterCStyleCast = true;
9345 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009346 verifyFormat("call( );", Spaces);
9347 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009348 verifyFormat("while (( bool ) 1)\n"
9349 " continue;",
9350 Spaces);
9351 verifyFormat("for (;;)\n"
9352 " continue;",
9353 Spaces);
9354 verifyFormat("if (true)\n"
9355 " f( );\n"
9356 "else if (true)\n"
9357 " f( );",
9358 Spaces);
9359 verifyFormat("do {\n"
9360 " do_something(( int ) i);\n"
9361 "} while (something( ));",
9362 Spaces);
9363 verifyFormat("switch (x) {\n"
9364 "default:\n"
9365 " break;\n"
9366 "}",
9367 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009368
9369 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009370 Spaces.SpacesInCStyleCastParentheses = false;
9371 Spaces.SpaceAfterCStyleCast = true;
9372 verifyFormat("while ((bool) 1)\n"
9373 " continue;",
9374 Spaces);
9375 verifyFormat("do {\n"
9376 " do_something((int) i);\n"
9377 "} while (something( ));",
9378 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009379}
9380
Daniel Jasperad981f82014-08-26 11:41:14 +00009381TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9382 verifyFormat("int a[5];");
9383 verifyFormat("a[3] += 42;");
9384
9385 FormatStyle Spaces = getLLVMStyle();
9386 Spaces.SpacesInSquareBrackets = true;
9387 // Lambdas unchanged.
9388 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9389 verifyFormat("return [i, args...] {};", Spaces);
9390
9391 // Not lambdas.
9392 verifyFormat("int a[ 5 ];", Spaces);
9393 verifyFormat("a[ 3 ] += 42;", Spaces);
9394 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9395 verifyFormat("double &operator[](int i) { return 0; }\n"
9396 "int i;",
9397 Spaces);
9398 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9399 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9400 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9401}
9402
Daniel Jasperd94bff32013-09-25 15:15:02 +00009403TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9404 verifyFormat("int a = 5;");
9405 verifyFormat("a += 42;");
9406 verifyFormat("a or_eq 8;");
9407
9408 FormatStyle Spaces = getLLVMStyle();
9409 Spaces.SpaceBeforeAssignmentOperators = false;
9410 verifyFormat("int a= 5;", Spaces);
9411 verifyFormat("a+= 42;", Spaces);
9412 verifyFormat("a or_eq 8;", Spaces);
9413}
9414
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009415TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
9416 verifyFormat("class Foo : public Bar {};");
9417 verifyFormat("Foo::Foo() : foo(1) {}");
9418 verifyFormat("for (auto a : b) {\n}");
9419 verifyFormat("int x = a ? b : c;");
9420 verifyFormat("{\n"
9421 "label0:\n"
9422 " int x = 0;\n"
9423 "}");
9424 verifyFormat("switch (x) {\n"
9425 "case 1:\n"
9426 "default:\n"
9427 "}");
9428
9429 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
9430 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
9431 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
9432 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
9433 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
9434 verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
9435 verifyFormat("{\n"
9436 "label1:\n"
9437 " int x = 0;\n"
9438 "}",
9439 CtorInitializerStyle);
9440 verifyFormat("switch (x) {\n"
9441 "case 1:\n"
9442 "default:\n"
9443 "}",
9444 CtorInitializerStyle);
9445 CtorInitializerStyle.BreakConstructorInitializers =
9446 FormatStyle::BCIS_AfterColon;
9447 verifyFormat("Fooooooooooo::Fooooooooooo():\n"
9448 " aaaaaaaaaaaaaaaa(1),\n"
9449 " bbbbbbbbbbbbbbbb(2) {}",
9450 CtorInitializerStyle);
9451 CtorInitializerStyle.BreakConstructorInitializers =
9452 FormatStyle::BCIS_BeforeComma;
9453 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9454 " : aaaaaaaaaaaaaaaa(1)\n"
9455 " , bbbbbbbbbbbbbbbb(2) {}",
9456 CtorInitializerStyle);
9457 CtorInitializerStyle.BreakConstructorInitializers =
9458 FormatStyle::BCIS_BeforeColon;
9459 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9460 " : aaaaaaaaaaaaaaaa(1),\n"
9461 " bbbbbbbbbbbbbbbb(2) {}",
9462 CtorInitializerStyle);
9463 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
9464 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9465 ": aaaaaaaaaaaaaaaa(1),\n"
9466 " bbbbbbbbbbbbbbbb(2) {}",
9467 CtorInitializerStyle);
9468
Francois Ferrand6bb103f2018-06-11 14:41:26 +00009469 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009470 InheritanceStyle.SpaceBeforeInheritanceColon = false;
9471 verifyFormat("class Foo: public Bar {};", InheritanceStyle);
9472 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
9473 verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
9474 verifyFormat("int x = a ? b : c;", InheritanceStyle);
9475 verifyFormat("{\n"
9476 "label2:\n"
9477 " int x = 0;\n"
9478 "}",
9479 InheritanceStyle);
9480 verifyFormat("switch (x) {\n"
9481 "case 1:\n"
9482 "default:\n"
9483 "}",
9484 InheritanceStyle);
Francois Ferrand6bb103f2018-06-11 14:41:26 +00009485 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
9486 verifyFormat("class Foooooooooooooooooooooo:\n"
9487 " public aaaaaaaaaaaaaaaaaa,\n"
9488 " public bbbbbbbbbbbbbbbbbb {\n"
9489 "}",
9490 InheritanceStyle);
9491 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
9492 verifyFormat("class Foooooooooooooooooooooo\n"
9493 " : public aaaaaaaaaaaaaaaaaa\n"
9494 " , public bbbbbbbbbbbbbbbbbb {\n"
9495 "}",
9496 InheritanceStyle);
9497 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
9498 verifyFormat("class Foooooooooooooooooooooo\n"
9499 " : public aaaaaaaaaaaaaaaaaa,\n"
9500 " public bbbbbbbbbbbbbbbbbb {\n"
9501 "}",
9502 InheritanceStyle);
9503 InheritanceStyle.ConstructorInitializerIndentWidth = 0;
9504 verifyFormat("class Foooooooooooooooooooooo\n"
9505 ": public aaaaaaaaaaaaaaaaaa,\n"
9506 " public bbbbbbbbbbbbbbbbbb {}",
9507 InheritanceStyle);
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009508
9509 FormatStyle ForLoopStyle = getLLVMStyle();
9510 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
9511 verifyFormat("class Foo : public Bar {};", ForLoopStyle);
9512 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
9513 verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
9514 verifyFormat("int x = a ? b : c;", ForLoopStyle);
9515 verifyFormat("{\n"
9516 "label2:\n"
9517 " int x = 0;\n"
9518 "}",
9519 ForLoopStyle);
9520 verifyFormat("switch (x) {\n"
9521 "case 1:\n"
9522 "default:\n"
9523 "}",
9524 ForLoopStyle);
9525
9526 FormatStyle NoSpaceStyle = getLLVMStyle();
9527 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
9528 NoSpaceStyle.SpaceBeforeInheritanceColon = false;
9529 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
9530 verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
9531 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
9532 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
9533 verifyFormat("int x = a ? b : c;", NoSpaceStyle);
9534 verifyFormat("{\n"
9535 "label3:\n"
9536 " int x = 0;\n"
9537 "}",
9538 NoSpaceStyle);
9539 verifyFormat("switch (x) {\n"
9540 "case 1:\n"
9541 "default:\n"
9542 "}",
9543 NoSpaceStyle);
9544}
9545
Daniel Jaspera44991332015-04-29 13:06:49 +00009546TEST_F(FormatTest, AlignConsecutiveAssignments) {
9547 FormatStyle Alignment = getLLVMStyle();
9548 Alignment.AlignConsecutiveAssignments = false;
9549 verifyFormat("int a = 5;\n"
9550 "int oneTwoThree = 123;",
9551 Alignment);
9552 verifyFormat("int a = 5;\n"
9553 "int oneTwoThree = 123;",
9554 Alignment);
9555
9556 Alignment.AlignConsecutiveAssignments = true;
9557 verifyFormat("int a = 5;\n"
9558 "int oneTwoThree = 123;",
9559 Alignment);
9560 verifyFormat("int a = method();\n"
9561 "int oneTwoThree = 133;",
9562 Alignment);
9563 verifyFormat("a &= 5;\n"
9564 "bcd *= 5;\n"
9565 "ghtyf += 5;\n"
9566 "dvfvdb -= 5;\n"
9567 "a /= 5;\n"
9568 "vdsvsv %= 5;\n"
9569 "sfdbddfbdfbb ^= 5;\n"
9570 "dvsdsv |= 5;\n"
9571 "int dsvvdvsdvvv = 123;",
9572 Alignment);
9573 verifyFormat("int i = 1, j = 10;\n"
9574 "something = 2000;",
9575 Alignment);
9576 verifyFormat("something = 2000;\n"
9577 "int i = 1, j = 10;\n",
9578 Alignment);
9579 verifyFormat("something = 2000;\n"
9580 "another = 911;\n"
9581 "int i = 1, j = 10;\n"
9582 "oneMore = 1;\n"
9583 "i = 2;",
9584 Alignment);
9585 verifyFormat("int a = 5;\n"
9586 "int one = 1;\n"
9587 "method();\n"
9588 "int oneTwoThree = 123;\n"
9589 "int oneTwo = 12;",
9590 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009591 verifyFormat("int oneTwoThree = 123;\n"
9592 "int oneTwo = 12;\n"
9593 "method();\n",
9594 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009595 verifyFormat("int oneTwoThree = 123; // comment\n"
9596 "int oneTwo = 12; // comment",
9597 Alignment);
9598 EXPECT_EQ("int a = 5;\n"
9599 "\n"
9600 "int oneTwoThree = 123;",
9601 format("int a = 5;\n"
9602 "\n"
9603 "int oneTwoThree= 123;",
9604 Alignment));
9605 EXPECT_EQ("int a = 5;\n"
9606 "int one = 1;\n"
9607 "\n"
9608 "int oneTwoThree = 123;",
9609 format("int a = 5;\n"
9610 "int one = 1;\n"
9611 "\n"
9612 "int oneTwoThree = 123;",
9613 Alignment));
9614 EXPECT_EQ("int a = 5;\n"
9615 "int one = 1;\n"
9616 "\n"
9617 "int oneTwoThree = 123;\n"
9618 "int oneTwo = 12;",
9619 format("int a = 5;\n"
9620 "int one = 1;\n"
9621 "\n"
9622 "int oneTwoThree = 123;\n"
9623 "int oneTwo = 12;",
9624 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009625 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9626 verifyFormat("#define A \\\n"
9627 " int aaaa = 12; \\\n"
9628 " int b = 23; \\\n"
9629 " int ccc = 234; \\\n"
9630 " int dddddddddd = 2345;",
9631 Alignment);
9632 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00009633 verifyFormat("#define A \\\n"
9634 " int aaaa = 12; \\\n"
9635 " int b = 23; \\\n"
9636 " int ccc = 234; \\\n"
9637 " int dddddddddd = 2345;",
9638 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009639 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00009640 verifyFormat("#define A "
9641 " \\\n"
9642 " int aaaa = 12; "
9643 " \\\n"
9644 " int b = 23; "
9645 " \\\n"
9646 " int ccc = 234; "
9647 " \\\n"
9648 " int dddddddddd = 2345;",
9649 Alignment);
9650 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9651 "k = 4, int l = 5,\n"
9652 " int m = 6) {\n"
9653 " int j = 10;\n"
9654 " otherThing = 1;\n"
9655 "}",
9656 Alignment);
9657 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9658 " int i = 1;\n"
9659 " int j = 2;\n"
9660 " int big = 10000;\n"
9661 "}",
9662 Alignment);
9663 verifyFormat("class C {\n"
9664 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009665 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009666 " virtual void f() = 0;\n"
9667 "};",
9668 Alignment);
9669 verifyFormat("int i = 1;\n"
9670 "if (SomeType t = getSomething()) {\n"
9671 "}\n"
9672 "int j = 2;\n"
9673 "int big = 10000;",
9674 Alignment);
9675 verifyFormat("int j = 7;\n"
9676 "for (int k = 0; k < N; ++k) {\n"
9677 "}\n"
9678 "int j = 2;\n"
9679 "int big = 10000;\n"
9680 "}",
9681 Alignment);
9682 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9683 verifyFormat("int i = 1;\n"
9684 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9685 " = someLooooooooooooooooongFunction();\n"
9686 "int j = 2;",
9687 Alignment);
9688 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9689 verifyFormat("int i = 1;\n"
9690 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9691 " someLooooooooooooooooongFunction();\n"
9692 "int j = 2;",
9693 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009694
9695 verifyFormat("auto lambda = []() {\n"
9696 " auto i = 0;\n"
9697 " return 0;\n"
9698 "};\n"
9699 "int i = 0;\n"
9700 "auto v = type{\n"
9701 " i = 1, //\n"
9702 " (i = 2), //\n"
9703 " i = 3 //\n"
9704 "};",
9705 Alignment);
9706
Daniel Jaspera44991332015-04-29 13:06:49 +00009707 verifyFormat(
9708 "int i = 1;\n"
9709 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9710 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009711 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00009712 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009713
9714 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9715 " typename B = very_long_type_name_1,\n"
9716 " typename T_2 = very_long_type_name_2>\n"
9717 "auto foo() {}\n",
9718 Alignment);
9719 verifyFormat("int a, b = 1;\n"
9720 "int c = 2;\n"
9721 "int dd = 3;\n",
9722 Alignment);
9723 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9724 "float b[1][] = {{3.f}};\n",
9725 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009726 verifyFormat("for (int i = 0; i < 1; i++)\n"
9727 " int x = 1;\n",
9728 Alignment);
9729 verifyFormat("for (i = 0; i < 1; i++)\n"
9730 " x = 1;\n"
9731 "y = 1;\n",
9732 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009733}
9734
Daniel Jaspere12597c2015-10-01 10:06:54 +00009735TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9736 FormatStyle Alignment = getLLVMStyle();
9737 Alignment.AlignConsecutiveDeclarations = false;
9738 verifyFormat("float const a = 5;\n"
9739 "int oneTwoThree = 123;",
9740 Alignment);
9741 verifyFormat("int a = 5;\n"
9742 "float const oneTwoThree = 123;",
9743 Alignment);
9744
9745 Alignment.AlignConsecutiveDeclarations = true;
9746 verifyFormat("float const a = 5;\n"
9747 "int oneTwoThree = 123;",
9748 Alignment);
9749 verifyFormat("int a = method();\n"
9750 "float const oneTwoThree = 133;",
9751 Alignment);
9752 verifyFormat("int i = 1, j = 10;\n"
9753 "something = 2000;",
9754 Alignment);
9755 verifyFormat("something = 2000;\n"
9756 "int i = 1, j = 10;\n",
9757 Alignment);
9758 verifyFormat("float something = 2000;\n"
9759 "double another = 911;\n"
9760 "int i = 1, j = 10;\n"
9761 "const int *oneMore = 1;\n"
9762 "unsigned i = 2;",
9763 Alignment);
9764 verifyFormat("float a = 5;\n"
9765 "int one = 1;\n"
9766 "method();\n"
9767 "const double oneTwoThree = 123;\n"
9768 "const unsigned int oneTwo = 12;",
9769 Alignment);
9770 verifyFormat("int oneTwoThree{0}; // comment\n"
9771 "unsigned oneTwo; // comment",
9772 Alignment);
9773 EXPECT_EQ("float const a = 5;\n"
9774 "\n"
9775 "int oneTwoThree = 123;",
9776 format("float const a = 5;\n"
9777 "\n"
9778 "int oneTwoThree= 123;",
9779 Alignment));
9780 EXPECT_EQ("float a = 5;\n"
9781 "int one = 1;\n"
9782 "\n"
9783 "unsigned oneTwoThree = 123;",
9784 format("float a = 5;\n"
9785 "int one = 1;\n"
9786 "\n"
9787 "unsigned oneTwoThree = 123;",
9788 Alignment));
9789 EXPECT_EQ("float a = 5;\n"
9790 "int one = 1;\n"
9791 "\n"
9792 "unsigned oneTwoThree = 123;\n"
9793 "int oneTwo = 12;",
9794 format("float a = 5;\n"
9795 "int one = 1;\n"
9796 "\n"
9797 "unsigned oneTwoThree = 123;\n"
9798 "int oneTwo = 12;",
9799 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009800 // Function prototype alignment
9801 verifyFormat("int a();\n"
9802 "double b();",
9803 Alignment);
9804 verifyFormat("int a(int x);\n"
9805 "double b();",
9806 Alignment);
9807 unsigned OldColumnLimit = Alignment.ColumnLimit;
9808 // We need to set ColumnLimit to zero, in order to stress nested alignments,
9809 // otherwise the function parameters will be re-flowed onto a single line.
9810 Alignment.ColumnLimit = 0;
9811 EXPECT_EQ("int a(int x,\n"
9812 " float y);\n"
9813 "double b(int x,\n"
9814 " double y);",
9815 format("int a(int x,\n"
9816 " float y);\n"
9817 "double b(int x,\n"
9818 " double y);",
9819 Alignment));
9820 // This ensures that function parameters of function declarations are
9821 // correctly indented when their owning functions are indented.
9822 // The failure case here is for 'double y' to not be indented enough.
9823 EXPECT_EQ("double a(int x);\n"
9824 "int b(int y,\n"
9825 " double z);",
9826 format("double a(int x);\n"
9827 "int b(int y,\n"
9828 " double z);",
9829 Alignment));
9830 // Set ColumnLimit low so that we induce wrapping immediately after
9831 // the function name and opening paren.
9832 Alignment.ColumnLimit = 13;
9833 verifyFormat("int function(\n"
9834 " int x,\n"
9835 " bool y);",
9836 Alignment);
9837 Alignment.ColumnLimit = OldColumnLimit;
9838 // Ensure function pointers don't screw up recursive alignment
9839 verifyFormat("int a(int x, void (*fp)(int y));\n"
9840 "double b();",
9841 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009842 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009843 // Ensure recursive alignment is broken by function braces, so that the
9844 // "a = 1" does not align with subsequent assignments inside the function
9845 // body.
9846 verifyFormat("int func(int a = 1) {\n"
9847 " int b = 2;\n"
9848 " int cc = 3;\n"
9849 "}",
9850 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009851 verifyFormat("float something = 2000;\n"
9852 "double another = 911;\n"
9853 "int i = 1, j = 10;\n"
9854 "const int *oneMore = 1;\n"
9855 "unsigned i = 2;",
9856 Alignment);
9857 verifyFormat("int oneTwoThree = {0}; // comment\n"
9858 "unsigned oneTwo = 0; // comment",
9859 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009860 // Make sure that scope is correctly tracked, in the absence of braces
9861 verifyFormat("for (int i = 0; i < n; i++)\n"
9862 " j = i;\n"
9863 "double x = 1;\n",
9864 Alignment);
9865 verifyFormat("if (int i = 0)\n"
9866 " j = i;\n"
9867 "double x = 1;\n",
9868 Alignment);
9869 // Ensure operator[] and operator() are comprehended
9870 verifyFormat("struct test {\n"
9871 " long long int foo();\n"
9872 " int operator[](int a);\n"
9873 " double bar();\n"
9874 "};\n",
9875 Alignment);
9876 verifyFormat("struct test {\n"
9877 " long long int foo();\n"
9878 " int operator()(int a);\n"
9879 " double bar();\n"
9880 "};\n",
9881 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009882 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9883 " int const i = 1;\n"
9884 " int * j = 2;\n"
9885 " int big = 10000;\n"
9886 "\n"
9887 " unsigned oneTwoThree = 123;\n"
9888 " int oneTwo = 12;\n"
9889 " method();\n"
9890 " float k = 2;\n"
9891 " int ll = 10000;\n"
9892 "}",
9893 format("void SomeFunction(int parameter= 0) {\n"
9894 " int const i= 1;\n"
9895 " int *j=2;\n"
9896 " int big = 10000;\n"
9897 "\n"
9898 "unsigned oneTwoThree =123;\n"
9899 "int oneTwo = 12;\n"
9900 " method();\n"
9901 "float k= 2;\n"
9902 "int ll=10000;\n"
9903 "}",
9904 Alignment));
9905 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009906 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9907 verifyFormat("#define A \\\n"
9908 " int aaaa = 12; \\\n"
9909 " float b = 23; \\\n"
9910 " const int ccc = 234; \\\n"
9911 " unsigned dddddddddd = 2345;",
9912 Alignment);
9913 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009914 verifyFormat("#define A \\\n"
9915 " int aaaa = 12; \\\n"
9916 " float b = 23; \\\n"
9917 " const int ccc = 234; \\\n"
9918 " unsigned dddddddddd = 2345;",
9919 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009920 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009921 Alignment.ColumnLimit = 30;
9922 verifyFormat("#define A \\\n"
9923 " int aaaa = 12; \\\n"
9924 " float b = 23; \\\n"
9925 " const int ccc = 234; \\\n"
9926 " int dddddddddd = 2345;",
9927 Alignment);
9928 Alignment.ColumnLimit = 80;
9929 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9930 "k = 4, int l = 5,\n"
9931 " int m = 6) {\n"
9932 " const int j = 10;\n"
9933 " otherThing = 1;\n"
9934 "}",
9935 Alignment);
9936 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9937 " int const i = 1;\n"
9938 " int * j = 2;\n"
9939 " int big = 10000;\n"
9940 "}",
9941 Alignment);
9942 verifyFormat("class C {\n"
9943 "public:\n"
9944 " int i = 1;\n"
9945 " virtual void f() = 0;\n"
9946 "};",
9947 Alignment);
9948 verifyFormat("float i = 1;\n"
9949 "if (SomeType t = getSomething()) {\n"
9950 "}\n"
9951 "const unsigned j = 2;\n"
9952 "int big = 10000;",
9953 Alignment);
9954 verifyFormat("float j = 7;\n"
9955 "for (int k = 0; k < N; ++k) {\n"
9956 "}\n"
9957 "unsigned j = 2;\n"
9958 "int big = 10000;\n"
9959 "}",
9960 Alignment);
9961 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9962 verifyFormat("float i = 1;\n"
9963 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9964 " = someLooooooooooooooooongFunction();\n"
9965 "int j = 2;",
9966 Alignment);
9967 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9968 verifyFormat("int i = 1;\n"
9969 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9970 " someLooooooooooooooooongFunction();\n"
9971 "int j = 2;",
9972 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009973
9974 Alignment.AlignConsecutiveAssignments = true;
9975 verifyFormat("auto lambda = []() {\n"
9976 " auto ii = 0;\n"
9977 " float j = 0;\n"
9978 " return 0;\n"
9979 "};\n"
9980 "int i = 0;\n"
9981 "float i2 = 0;\n"
9982 "auto v = type{\n"
9983 " i = 1, //\n"
9984 " (i = 2), //\n"
9985 " i = 3 //\n"
9986 "};",
9987 Alignment);
9988 Alignment.AlignConsecutiveAssignments = false;
9989
Daniel Jaspere12597c2015-10-01 10:06:54 +00009990 verifyFormat(
9991 "int i = 1;\n"
9992 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9993 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009994 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009995 Alignment);
9996
9997 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9998 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009999 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +000010000 // happens.
10001 Alignment.AlignConsecutiveAssignments = true;
10002 Alignment.ColumnLimit = 30;
10003 verifyFormat("float ii = 1;\n"
10004 "unsigned j = 2;\n"
10005 "int someVerylongVariable = 1;\n"
10006 "AnotherLongType ll = 123456;\n"
10007 "VeryVeryLongType k = 2;\n"
10008 "int myvar = 1;",
10009 Alignment);
10010 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +000010011 Alignment.AlignConsecutiveAssignments = false;
10012
10013 verifyFormat(
10014 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
10015 " typename LongType, typename B>\n"
10016 "auto foo() {}\n",
10017 Alignment);
10018 verifyFormat("float a, b = 1;\n"
10019 "int c = 2;\n"
10020 "int dd = 3;\n",
10021 Alignment);
10022 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
10023 "float b[1][] = {{3.f}};\n",
10024 Alignment);
10025 Alignment.AlignConsecutiveAssignments = true;
10026 verifyFormat("float a, b = 1;\n"
10027 "int c = 2;\n"
10028 "int dd = 3;\n",
10029 Alignment);
10030 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
10031 "float b[1][] = {{3.f}};\n",
10032 Alignment);
10033 Alignment.AlignConsecutiveAssignments = false;
10034
10035 Alignment.ColumnLimit = 30;
10036 Alignment.BinPackParameters = false;
10037 verifyFormat("void foo(float a,\n"
10038 " float b,\n"
10039 " int c,\n"
10040 " uint32_t *d) {\n"
10041 " int * e = 0;\n"
10042 " float f = 0;\n"
10043 " double g = 0;\n"
10044 "}\n"
10045 "void bar(ino_t a,\n"
10046 " int b,\n"
10047 " uint32_t *c,\n"
10048 " bool d) {}\n",
10049 Alignment);
10050 Alignment.BinPackParameters = true;
10051 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +000010052
10053 // Bug 33507
10054 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
10055 verifyFormat(
10056 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
10057 " static const Version verVs2017;\n"
10058 " return true;\n"
10059 "});\n",
10060 Alignment);
10061 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Ilya Biryukovf16a6fa2018-08-01 15:32:56 +000010062
10063 // See llvm.org/PR35641
10064 Alignment.AlignConsecutiveDeclarations = true;
10065 verifyFormat("int func() { //\n"
10066 " int b;\n"
10067 " unsigned c;\n"
10068 "}",
10069 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010070}
10071
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010072TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010073 FormatStyle LinuxBraceStyle = getLLVMStyle();
10074 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010075 verifyFormat("namespace a\n"
10076 "{\n"
10077 "class A\n"
10078 "{\n"
10079 " void f()\n"
10080 " {\n"
10081 " if (true) {\n"
10082 " a();\n"
10083 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +000010084 " } else {\n"
10085 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010086 " }\n"
10087 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +000010088 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010089 "};\n"
10090 "struct B {\n"
10091 " int x;\n"
10092 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010093 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010094 LinuxBraceStyle);
10095 verifyFormat("enum X {\n"
10096 " Y = 0,\n"
10097 "}\n",
10098 LinuxBraceStyle);
10099 verifyFormat("struct S {\n"
10100 " int Type;\n"
10101 " union {\n"
10102 " int x;\n"
10103 " double y;\n"
10104 " } Value;\n"
10105 " class C\n"
10106 " {\n"
10107 " MyFavoriteType Value;\n"
10108 " } Class;\n"
10109 "}\n",
10110 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010111}
10112
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010113TEST_F(FormatTest, MozillaBraceBreaking) {
10114 FormatStyle MozillaBraceStyle = getLLVMStyle();
10115 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010116 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010117 verifyFormat("namespace a {\n"
10118 "class A\n"
10119 "{\n"
10120 " void f()\n"
10121 " {\n"
10122 " if (true) {\n"
10123 " a();\n"
10124 " b();\n"
10125 " }\n"
10126 " }\n"
10127 " void g() { return; }\n"
10128 "};\n"
10129 "enum E\n"
10130 "{\n"
10131 " A,\n"
10132 " // foo\n"
10133 " B,\n"
10134 " C\n"
10135 "};\n"
10136 "struct B\n"
10137 "{\n"
10138 " int x;\n"
10139 "};\n"
10140 "}\n",
10141 MozillaBraceStyle);
10142 verifyFormat("struct S\n"
10143 "{\n"
10144 " int Type;\n"
10145 " union\n"
10146 " {\n"
10147 " int x;\n"
10148 " double y;\n"
10149 " } Value;\n"
10150 " class C\n"
10151 " {\n"
10152 " MyFavoriteType Value;\n"
10153 " } Class;\n"
10154 "}\n",
10155 MozillaBraceStyle);
10156}
10157
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010158TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010159 FormatStyle StroustrupBraceStyle = getLLVMStyle();
10160 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010161 verifyFormat("namespace a {\n"
10162 "class A {\n"
10163 " void f()\n"
10164 " {\n"
10165 " if (true) {\n"
10166 " a();\n"
10167 " b();\n"
10168 " }\n"
10169 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +000010170 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010171 "};\n"
10172 "struct B {\n"
10173 " int x;\n"
10174 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000010175 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010176 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010177
Daniel Jasperd9670872014-08-05 12:06:20 +000010178 verifyFormat("void foo()\n"
10179 "{\n"
10180 " if (a) {\n"
10181 " a();\n"
10182 " }\n"
10183 " else {\n"
10184 " b();\n"
10185 " }\n"
10186 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010187 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +000010188
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010189 verifyFormat("#ifdef _DEBUG\n"
10190 "int foo(int i = 0)\n"
10191 "#else\n"
10192 "int foo(int i = 5)\n"
10193 "#endif\n"
10194 "{\n"
10195 " return i;\n"
10196 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010197 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010198
10199 verifyFormat("void foo() {}\n"
10200 "void bar()\n"
10201 "#ifdef _DEBUG\n"
10202 "{\n"
10203 " foo();\n"
10204 "}\n"
10205 "#else\n"
10206 "{\n"
10207 "}\n"
10208 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010209 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010210
10211 verifyFormat("void foobar() { int i = 5; }\n"
10212 "#ifdef _DEBUG\n"
10213 "void bar() {}\n"
10214 "#else\n"
10215 "void bar() { foobar(); }\n"
10216 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010217 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010218}
10219
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010220TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010221 FormatStyle AllmanBraceStyle = getLLVMStyle();
10222 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010223
10224 EXPECT_EQ("namespace a\n"
10225 "{\n"
10226 "void f();\n"
10227 "void g();\n"
10228 "} // namespace a\n",
10229 format("namespace a\n"
10230 "{\n"
10231 "void f();\n"
10232 "void g();\n"
10233 "}\n",
10234 AllmanBraceStyle));
10235
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010236 verifyFormat("namespace a\n"
10237 "{\n"
10238 "class A\n"
10239 "{\n"
10240 " void f()\n"
10241 " {\n"
10242 " if (true)\n"
10243 " {\n"
10244 " a();\n"
10245 " b();\n"
10246 " }\n"
10247 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +000010248 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010249 "};\n"
10250 "struct B\n"
10251 "{\n"
10252 " int x;\n"
10253 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010254 "} // namespace a",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010255 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010256
10257 verifyFormat("void f()\n"
10258 "{\n"
10259 " if (true)\n"
10260 " {\n"
10261 " a();\n"
10262 " }\n"
10263 " else if (false)\n"
10264 " {\n"
10265 " b();\n"
10266 " }\n"
10267 " else\n"
10268 " {\n"
10269 " c();\n"
10270 " }\n"
10271 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010272 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010273
10274 verifyFormat("void f()\n"
10275 "{\n"
10276 " for (int i = 0; i < 10; ++i)\n"
10277 " {\n"
10278 " a();\n"
10279 " }\n"
10280 " while (false)\n"
10281 " {\n"
10282 " b();\n"
10283 " }\n"
10284 " do\n"
10285 " {\n"
10286 " c();\n"
10287 " } while (false)\n"
10288 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010289 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010290
10291 verifyFormat("void f(int a)\n"
10292 "{\n"
10293 " switch (a)\n"
10294 " {\n"
10295 " case 0:\n"
10296 " break;\n"
10297 " case 1:\n"
10298 " {\n"
10299 " break;\n"
10300 " }\n"
10301 " case 2:\n"
10302 " {\n"
10303 " }\n"
10304 " break;\n"
10305 " default:\n"
10306 " break;\n"
10307 " }\n"
10308 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010309 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +000010310
10311 verifyFormat("enum X\n"
10312 "{\n"
10313 " Y = 0,\n"
10314 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010315 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +000010316 verifyFormat("enum X\n"
10317 "{\n"
10318 " Y = 0\n"
10319 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010320 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +000010321
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010322 verifyFormat("@interface BSApplicationController ()\n"
10323 "{\n"
10324 "@private\n"
10325 " id _extraIvar;\n"
10326 "}\n"
10327 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010328 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010329
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010330 verifyFormat("#ifdef _DEBUG\n"
10331 "int foo(int i = 0)\n"
10332 "#else\n"
10333 "int foo(int i = 5)\n"
10334 "#endif\n"
10335 "{\n"
10336 " return i;\n"
10337 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010338 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010339
10340 verifyFormat("void foo() {}\n"
10341 "void bar()\n"
10342 "#ifdef _DEBUG\n"
10343 "{\n"
10344 " foo();\n"
10345 "}\n"
10346 "#else\n"
10347 "{\n"
10348 "}\n"
10349 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010350 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010351
10352 verifyFormat("void foobar() { int i = 5; }\n"
10353 "#ifdef _DEBUG\n"
10354 "void bar() {}\n"
10355 "#else\n"
10356 "void bar() { foobar(); }\n"
10357 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010358 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010359
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010360 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010361 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010362 " // ...\n"
10363 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010364 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010365 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010366 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010367 " // ...\n"
10368 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010369 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010370 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010371 // .. or dict literals.
10372 verifyFormat("void f()\n"
10373 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +000010374 " // ...\n"
10375 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
10376 "}",
10377 AllmanBraceStyle);
10378 verifyFormat("void f()\n"
10379 "{\n"
10380 " // ...\n"
10381 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010382 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010383 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +000010384 verifyFormat("int f()\n"
10385 "{ // comment\n"
10386 " return 42;\n"
10387 "}",
10388 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010389
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010390 AllmanBraceStyle.ColumnLimit = 19;
10391 verifyFormat("void f() { int i; }", AllmanBraceStyle);
10392 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +000010393 verifyFormat("void f()\n"
10394 "{\n"
10395 " int i;\n"
10396 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010397 AllmanBraceStyle);
10398 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +000010399
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010400 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +000010401 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
10402 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
10403 verifyFormat("void f(bool b)\n"
10404 "{\n"
10405 " if (b)\n"
10406 " {\n"
10407 " return;\n"
10408 " }\n"
10409 "}\n",
10410 BreakBeforeBraceShortIfs);
10411 verifyFormat("void f(bool b)\n"
10412 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010413 " if constexpr (b)\n"
10414 " {\n"
10415 " return;\n"
10416 " }\n"
10417 "}\n",
10418 BreakBeforeBraceShortIfs);
10419 verifyFormat("void f(bool b)\n"
10420 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +000010421 " if (b) return;\n"
10422 "}\n",
10423 BreakBeforeBraceShortIfs);
10424 verifyFormat("void f(bool b)\n"
10425 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010426 " if constexpr (b) return;\n"
10427 "}\n",
10428 BreakBeforeBraceShortIfs);
10429 verifyFormat("void f(bool b)\n"
10430 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +000010431 " while (b)\n"
10432 " {\n"
10433 " return;\n"
10434 " }\n"
10435 "}\n",
10436 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010437}
10438
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010439TEST_F(FormatTest, GNUBraceBreaking) {
10440 FormatStyle GNUBraceStyle = getLLVMStyle();
10441 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
10442 verifyFormat("namespace a\n"
10443 "{\n"
10444 "class A\n"
10445 "{\n"
10446 " void f()\n"
10447 " {\n"
10448 " int a;\n"
10449 " {\n"
10450 " int b;\n"
10451 " }\n"
10452 " if (true)\n"
10453 " {\n"
10454 " a();\n"
10455 " b();\n"
10456 " }\n"
10457 " }\n"
10458 " void g() { return; }\n"
10459 "}\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010460 "} // namespace a",
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010461 GNUBraceStyle);
10462
10463 verifyFormat("void f()\n"
10464 "{\n"
10465 " if (true)\n"
10466 " {\n"
10467 " a();\n"
10468 " }\n"
10469 " else if (false)\n"
10470 " {\n"
10471 " b();\n"
10472 " }\n"
10473 " else\n"
10474 " {\n"
10475 " c();\n"
10476 " }\n"
10477 "}\n",
10478 GNUBraceStyle);
10479
10480 verifyFormat("void f()\n"
10481 "{\n"
10482 " for (int i = 0; i < 10; ++i)\n"
10483 " {\n"
10484 " a();\n"
10485 " }\n"
10486 " while (false)\n"
10487 " {\n"
10488 " b();\n"
10489 " }\n"
10490 " do\n"
10491 " {\n"
10492 " c();\n"
10493 " }\n"
10494 " while (false);\n"
10495 "}\n",
10496 GNUBraceStyle);
10497
10498 verifyFormat("void f(int a)\n"
10499 "{\n"
10500 " switch (a)\n"
10501 " {\n"
10502 " case 0:\n"
10503 " break;\n"
10504 " case 1:\n"
10505 " {\n"
10506 " break;\n"
10507 " }\n"
10508 " case 2:\n"
10509 " {\n"
10510 " }\n"
10511 " break;\n"
10512 " default:\n"
10513 " break;\n"
10514 " }\n"
10515 "}\n",
10516 GNUBraceStyle);
10517
10518 verifyFormat("enum X\n"
10519 "{\n"
10520 " Y = 0,\n"
10521 "}\n",
10522 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010523
10524 verifyFormat("@interface BSApplicationController ()\n"
10525 "{\n"
10526 "@private\n"
10527 " id _extraIvar;\n"
10528 "}\n"
10529 "@end\n",
10530 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010531
10532 verifyFormat("#ifdef _DEBUG\n"
10533 "int foo(int i = 0)\n"
10534 "#else\n"
10535 "int foo(int i = 5)\n"
10536 "#endif\n"
10537 "{\n"
10538 " return i;\n"
10539 "}",
10540 GNUBraceStyle);
10541
10542 verifyFormat("void foo() {}\n"
10543 "void bar()\n"
10544 "#ifdef _DEBUG\n"
10545 "{\n"
10546 " foo();\n"
10547 "}\n"
10548 "#else\n"
10549 "{\n"
10550 "}\n"
10551 "#endif",
10552 GNUBraceStyle);
10553
10554 verifyFormat("void foobar() { int i = 5; }\n"
10555 "#ifdef _DEBUG\n"
10556 "void bar() {}\n"
10557 "#else\n"
10558 "void bar() { foobar(); }\n"
10559 "#endif",
10560 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010561}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010562
10563TEST_F(FormatTest, WebKitBraceBreaking) {
10564 FormatStyle WebKitBraceStyle = getLLVMStyle();
10565 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010566 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010567 verifyFormat("namespace a {\n"
10568 "class A {\n"
10569 " void f()\n"
10570 " {\n"
10571 " if (true) {\n"
10572 " a();\n"
10573 " b();\n"
10574 " }\n"
10575 " }\n"
10576 " void g() { return; }\n"
10577 "};\n"
10578 "enum E {\n"
10579 " A,\n"
10580 " // foo\n"
10581 " B,\n"
10582 " C\n"
10583 "};\n"
10584 "struct B {\n"
10585 " int x;\n"
10586 "};\n"
10587 "}\n",
10588 WebKitBraceStyle);
10589 verifyFormat("struct S {\n"
10590 " int Type;\n"
10591 " union {\n"
10592 " int x;\n"
10593 " double y;\n"
10594 " } Value;\n"
10595 " class C {\n"
10596 " MyFavoriteType Value;\n"
10597 " } Class;\n"
10598 "};\n",
10599 WebKitBraceStyle);
10600}
10601
Manuel Klimekd5735502013-08-12 03:51:17 +000010602TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10603 verifyFormat("void f() {\n"
10604 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010605 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010606 " }\n"
10607 "}\n",
10608 getLLVMStyle());
10609}
10610
Daniel Jasper9613c812013-08-07 16:29:23 +000010611TEST_F(FormatTest, UnderstandsPragmas) {
10612 verifyFormat("#pragma omp reduction(| : var)");
10613 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010614
10615 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10616 "(including parentheses).",
10617 format("#pragma mark Any non-hyphenated or hyphenated string "
10618 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010619}
10620
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010621TEST_F(FormatTest, UnderstandPragmaOption) {
10622 verifyFormat("#pragma option -C -A");
10623
10624 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10625}
10626
Manuel Klimek77866142017-11-17 11:17:15 +000010627TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
10628 FormatStyle Style = getLLVMStyle();
10629 Style.ColumnLimit = 20;
10630
10631 verifyFormat("int a; // the\n"
10632 " // comment", Style);
10633 EXPECT_EQ("int a; /* first line\n"
10634 " * second\n"
10635 " * line third\n"
10636 " * line\n"
10637 " */",
10638 format("int a; /* first line\n"
10639 " * second\n"
10640 " * line third\n"
10641 " * line\n"
10642 " */",
10643 Style));
10644 EXPECT_EQ("int a; // first line\n"
10645 " // second\n"
10646 " // line third\n"
10647 " // line",
10648 format("int a; // first line\n"
10649 " // second line\n"
10650 " // third line",
10651 Style));
10652
10653 Style.PenaltyExcessCharacter = 90;
10654 verifyFormat("int a; // the comment", Style);
Manuel Klimek93699f42017-11-29 14:29:43 +000010655 EXPECT_EQ("int a; // the comment\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010656 " // aaa",
10657 format("int a; // the comment aaa", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010658 EXPECT_EQ("int a; /* first line\n"
10659 " * second line\n"
10660 " * third line\n"
10661 " */",
10662 format("int a; /* first line\n"
10663 " * second line\n"
10664 " * third line\n"
10665 " */",
10666 Style));
Manuel Klimek93699f42017-11-29 14:29:43 +000010667 EXPECT_EQ("int a; // first line\n"
10668 " // second line\n"
10669 " // third line",
10670 format("int a; // first line\n"
10671 " // second line\n"
10672 " // third line",
10673 Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010674 // FIXME: Investigate why this is not getting the same layout as the test
10675 // above.
10676 EXPECT_EQ("int a; /* first line\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010677 " * second line\n"
10678 " * third line\n"
Manuel Klimek77866142017-11-17 11:17:15 +000010679 " */",
10680 format("int a; /* first line second line third line"
10681 "\n*/",
10682 Style));
10683
10684 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010685 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010686 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010687 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010688 Style));
10689 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010690 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010691 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010692 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010693 Style));
10694
10695 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
10696 // next one.
Manuel Klimek93699f42017-11-29 14:29:43 +000010697 EXPECT_EQ("// foo bar baz bazfoo\n"
10698 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010699 format("// foo bar baz bazfoo bar\n"
10700 "// foo bar\n",
10701 Style));
10702
10703 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010704 "// foo bar baz bazfoo\n"
10705 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010706 format("// foo bar baz bazfoo\n"
10707 "// foo bar baz bazfoo bar\n"
10708 "// foo bar\n",
10709 Style));
10710
Manuel Klimek77866142017-11-17 11:17:15 +000010711 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010712 "// foo bar baz bazfoo\n"
10713 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010714 format("// foo bar baz bazfoo\n"
10715 "// foo bar baz bazfoo bar\n"
10716 "// foo bar\n",
10717 Style));
Manuel Klimek0b58c322017-12-01 13:28:08 +000010718
10719 // Make sure we do not keep protruding characters if strict mode reflow is
10720 // cheaper than keeping protruding characters.
10721 Style.ColumnLimit = 21;
10722 EXPECT_EQ("// foo foo foo foo\n"
10723 "// foo foo foo foo\n"
10724 "// foo foo foo foo\n",
10725 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
10726 Style));
10727
10728 EXPECT_EQ("int a = /* long block\n"
10729 " comment */\n"
10730 " 42;",
10731 format("int a = /* long block comment */ 42;", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010732}
10733
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010734#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10735 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010736 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10737 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010738
10739TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010740 SmallVector<FormatStyle, 3> Styles;
10741 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010742
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010743 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010744 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10745 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10746 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010747
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010748 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010749 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10750 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10751 EXPECT_ALL_STYLES_EQUAL(Styles);
10752
Nico Weber514ecc82014-02-02 20:50:45 +000010753 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010754 EXPECT_TRUE(
10755 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10756 EXPECT_TRUE(
10757 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10758 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010759
Nico Weber514ecc82014-02-02 20:50:45 +000010760 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010761 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10762 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10763 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010764
10765 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010766 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10767 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10768 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010769
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010770 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010771 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10772 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10773 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010774
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010775 Styles[0] = getGNUStyle();
10776 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10777 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10778 EXPECT_ALL_STYLES_EQUAL(Styles);
10779
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010780 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10781}
10782
10783TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10784 SmallVector<FormatStyle, 8> Styles;
10785 Styles.resize(2);
10786
10787 Styles[0] = getGoogleStyle();
10788 Styles[1] = getLLVMStyle();
10789 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10790 EXPECT_ALL_STYLES_EQUAL(Styles);
10791
10792 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010793 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010794 Styles[1] = getLLVMStyle();
10795 Styles[1].Language = FormatStyle::LK_JavaScript;
10796 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10797
10798 Styles[2] = getLLVMStyle();
10799 Styles[2].Language = FormatStyle::LK_JavaScript;
10800 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10801 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010802 &Styles[2])
10803 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010804
10805 Styles[3] = getLLVMStyle();
10806 Styles[3].Language = FormatStyle::LK_JavaScript;
10807 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10808 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010809 &Styles[3])
10810 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010811
10812 Styles[4] = getLLVMStyle();
10813 Styles[4].Language = FormatStyle::LK_JavaScript;
10814 EXPECT_EQ(0, parseConfiguration("---\n"
10815 "BasedOnStyle: LLVM\n"
10816 "IndentWidth: 123\n"
10817 "---\n"
10818 "BasedOnStyle: Google\n"
10819 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010820 &Styles[4])
10821 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010822 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010823}
10824
Daniel Jasper91881d92014-09-29 08:07:46 +000010825#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010826 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010827 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010828 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010829 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010830 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010831
Daniel Jasper91881d92014-09-29 08:07:46 +000010832#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10833
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010834#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10835 Style.STRUCT.FIELD = false; \
10836 EXPECT_EQ(0, \
10837 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10838 .value()); \
10839 EXPECT_TRUE(Style.STRUCT.FIELD); \
10840 EXPECT_EQ(0, \
10841 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10842 .value()); \
10843 EXPECT_FALSE(Style.STRUCT.FIELD);
10844
10845#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10846 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10847
Daniel Jasper00853002014-09-16 16:22:30 +000010848#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10849 EXPECT_NE(VALUE, Style.FIELD); \
10850 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10851 EXPECT_EQ(VALUE, Style.FIELD)
10852
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010853TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010854 FormatStyle Style = {};
10855 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +000010856 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010857 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010858 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010859 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010860 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010861 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010862 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010863 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010864 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper18210d72014-10-09 09:52:05 +000010865 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010866 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010867 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010868 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010869 CHECK_PARSE_BOOL(BreakStringLiterals);
Francois Ferrande56a8292017-06-14 12:29:47 +000010870 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010871 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010872 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010873 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010874 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010875 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010876 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010877 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010878 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010879 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010880 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010881 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010882 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +000010883 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010884 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010885 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010886 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010887 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010888 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010889 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010890 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010891 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010892 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Hans Wennborgbfc34062018-06-14 08:01:09 +000010893 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
Francois Ferrand2a9ea782018-03-01 10:09:13 +000010894 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
10895 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
10896 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010897
10898 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10899 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10900 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10901 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10902 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10903 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10904 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10905 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
Krasimir Georgievd6ce9372017-09-15 11:23:50 +000010906 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010907 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10908 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10909 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +000010910 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10911 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10912 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010913}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010914
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010915#undef CHECK_PARSE_BOOL
10916
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010917TEST_F(FormatTest, ParsesConfiguration) {
10918 FormatStyle Style = {};
10919 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010920 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010921 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10922 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010923 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010924 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10925 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +000010926 CHECK_PARSE("PenaltyBreakAssignment: 1234",
10927 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010928 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10929 PenaltyBreakBeforeFirstCallParameter, 1234u);
Francois Ferrand58e6fe52018-05-16 08:25:03 +000010930 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
10931 PenaltyBreakTemplateDeclaration, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010932 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10933 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10934 PenaltyReturnTypeOnItsOwnLine, 1234u);
10935 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10936 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010937 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010938 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010939 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010940
Daniel Jasper553d4872014-06-17 12:40:34 +000010941 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010942 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10943 FormatStyle::PAS_Left);
10944 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10945 FormatStyle::PAS_Right);
10946 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10947 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010948 // For backward compatibility:
10949 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10950 FormatStyle::PAS_Left);
10951 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10952 FormatStyle::PAS_Right);
10953 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10954 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010955
Alexander Kornienkod6538332013-05-07 15:32:14 +000010956 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010957 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10958 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010959 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10960 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10961 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10962
Daniel Jasperac043c92014-09-15 11:11:00 +000010963 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010964 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10965 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010966 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10967 FormatStyle::BOS_None);
10968 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10969 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010970 // For backward compatibility:
10971 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10972 FormatStyle::BOS_None);
10973 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10974 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010975
Francois Ferranda6b6d512017-05-24 11:36:58 +000010976 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10977 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10978 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10979 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10980 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10981 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10982 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10983 // For backward compatibility:
10984 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10985 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10986
Francois Ferrand6bb103f2018-06-11 14:41:26 +000010987 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
10988 CHECK_PARSE("BreakInheritanceList: BeforeComma",
10989 BreakInheritanceList, FormatStyle::BILS_BeforeComma);
10990 CHECK_PARSE("BreakInheritanceList: AfterColon",
10991 BreakInheritanceList, FormatStyle::BILS_AfterColon);
10992 CHECK_PARSE("BreakInheritanceList: BeforeColon",
10993 BreakInheritanceList, FormatStyle::BILS_BeforeColon);
10994 // For backward compatibility:
10995 CHECK_PARSE("BreakBeforeInheritanceComma: true",
10996 BreakInheritanceList, FormatStyle::BILS_BeforeComma);
10997
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010998 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10999 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
11000 FormatStyle::BAS_Align);
11001 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
11002 FormatStyle::BAS_DontAlign);
11003 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
11004 FormatStyle::BAS_AlwaysBreak);
11005 // For backward compatibility:
11006 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
11007 FormatStyle::BAS_DontAlign);
11008 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
11009 FormatStyle::BAS_Align);
11010
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +000011011 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
11012 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
11013 FormatStyle::ENAS_DontAlign);
11014 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
11015 FormatStyle::ENAS_Left);
11016 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
11017 FormatStyle::ENAS_Right);
11018 // For backward compatibility:
11019 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
11020 FormatStyle::ENAS_Left);
11021 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
11022 FormatStyle::ENAS_Right);
11023
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000011024 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000011025 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
11026 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
11027 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000011028 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
11029 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000011030 // For backward compatibility:
11031 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
11032 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000011033
Daniel Jasperd74cf402014-04-08 12:46:38 +000011034 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000011035 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
11036 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
11037 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
11038 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000011039 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
11040 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000011041 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
11042 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000011043 // For backward compatibility:
11044 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
11045 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
11046 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
11047 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000011048
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000011049 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
11050 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
11051 FormatStyle::SBPO_Never);
11052 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
11053 FormatStyle::SBPO_Always);
11054 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
11055 FormatStyle::SBPO_ControlStatements);
11056 // For backward compatibility:
11057 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
11058 FormatStyle::SBPO_Never);
11059 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
11060 FormatStyle::SBPO_ControlStatements);
11061
Alexander Kornienkod6538332013-05-07 15:32:14 +000011062 Style.ColumnLimit = 123;
11063 FormatStyle BaseStyle = getLLVMStyle();
11064 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
11065 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
11066
Manuel Klimeka8eb9142013-05-13 12:51:40 +000011067 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
11068 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
11069 FormatStyle::BS_Attach);
11070 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
11071 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000011072 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
11073 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000011074 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
11075 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000011076 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
11077 FormatStyle::BS_Allman);
11078 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000011079 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
11080 FormatStyle::BS_WebKit);
11081 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
11082 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000011083
Zachary Turner448592e2015-12-18 22:20:15 +000011084 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
11085 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
11086 FormatStyle::RTBS_None);
11087 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
11088 FormatStyle::RTBS_All);
11089 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000011090 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000011091 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
11092 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
11093 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
11094 AlwaysBreakAfterReturnType,
11095 FormatStyle::RTBS_TopLevelDefinitions);
11096
Francois Ferrand58e6fe52018-05-16 08:25:03 +000011097 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
11098 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", AlwaysBreakTemplateDeclarations,
11099 FormatStyle::BTDS_No);
11100 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", AlwaysBreakTemplateDeclarations,
11101 FormatStyle::BTDS_MultiLine);
11102 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", AlwaysBreakTemplateDeclarations,
11103 FormatStyle::BTDS_Yes);
11104 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", AlwaysBreakTemplateDeclarations,
11105 FormatStyle::BTDS_MultiLine);
11106 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", AlwaysBreakTemplateDeclarations,
11107 FormatStyle::BTDS_Yes);
11108
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000011109 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
11110 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
11111 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
11112 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
11113 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
11114 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
11115 AlwaysBreakAfterDefinitionReturnType,
11116 FormatStyle::DRTBS_TopLevel);
11117
Daniel Jasper65ee3472013-07-31 23:16:02 +000011118 Style.NamespaceIndentation = FormatStyle::NI_All;
11119 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
11120 FormatStyle::NI_None);
11121 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
11122 FormatStyle::NI_Inner);
11123 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
11124 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000011125
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000011126 // FIXME: This is required because parsing a configuration simply overwrites
11127 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000011128 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000011129 std::vector<std::string> BoostForeach;
11130 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000011131 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000011132 std::vector<std::string> BoostAndQForeach;
11133 BoostAndQForeach.push_back("BOOST_FOREACH");
11134 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000011135 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
11136 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000011137
Francois Ferrand6f40e212018-10-02 16:37:51 +000011138 Style.StatementMacros.clear();
11139 CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros,
11140 std::vector<std::string>{"QUNUSED"});
11141 CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros,
11142 std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"}));
11143
Eric Liu9d92c022018-05-14 19:51:33 +000011144 Style.IncludeStyle.IncludeCategories.clear();
11145 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
11146 {"abc/.*", 2}, {".*", 1}};
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000011147 CHECK_PARSE("IncludeCategories:\n"
11148 " - Regex: abc/.*\n"
11149 " Priority: 2\n"
11150 " - Regex: .*\n"
11151 " Priority: 1",
Eric Liu9d92c022018-05-14 19:51:33 +000011152 IncludeStyle.IncludeCategories, ExpectedCategories);
11153 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
11154 "abc$");
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011155
11156 Style.RawStringFormats.clear();
11157 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011158 {
11159 FormatStyle::LK_TextProto,
11160 {"pb", "proto"},
11161 {"PARSE_TEXT_PROTO"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000011162 /*CanonicalDelimiter=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011163 "llvm",
11164 },
11165 {
11166 FormatStyle::LK_Cpp,
11167 {"cc", "cpp"},
11168 {"C_CODEBLOCK", "CPPEVAL"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000011169 /*CanonicalDelimiter=*/"cc",
11170 /*BasedOnStyle=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011171 },
Krasimir Georgiev4527f132018-01-17 12:24:59 +000011172 };
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011173
11174 CHECK_PARSE("RawStringFormats:\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000011175 " - Language: TextProto\n"
11176 " Delimiters:\n"
11177 " - 'pb'\n"
11178 " - 'proto'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011179 " EnclosingFunctions:\n"
11180 " - 'PARSE_TEXT_PROTO'\n"
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011181 " BasedOnStyle: llvm\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000011182 " - Language: Cpp\n"
11183 " Delimiters:\n"
11184 " - 'cc'\n"
11185 " - 'cpp'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011186 " EnclosingFunctions:\n"
11187 " - 'C_CODEBLOCK'\n"
Krasimir Georgiev412ed092018-01-19 16:18:47 +000011188 " - 'CPPEVAL'\n"
11189 " CanonicalDelimiter: 'cc'",
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011190 RawStringFormats, ExpectedRawStringFormats);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011191}
11192
11193TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
11194 FormatStyle Style = {};
11195 Style.Language = FormatStyle::LK_Cpp;
11196 CHECK_PARSE("Language: Cpp\n"
11197 "IndentWidth: 12",
11198 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000011199 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
11200 "IndentWidth: 34",
11201 &Style),
11202 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011203 EXPECT_EQ(12u, Style.IndentWidth);
11204 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
11205 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
11206
11207 Style.Language = FormatStyle::LK_JavaScript;
11208 CHECK_PARSE("Language: JavaScript\n"
11209 "IndentWidth: 12",
11210 IndentWidth, 12u);
11211 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000011212 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
11213 "IndentWidth: 34",
11214 &Style),
11215 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011216 EXPECT_EQ(23u, Style.IndentWidth);
11217 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
11218 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
11219
11220 CHECK_PARSE("BasedOnStyle: LLVM\n"
11221 "IndentWidth: 67",
11222 IndentWidth, 67u);
11223
11224 CHECK_PARSE("---\n"
11225 "Language: JavaScript\n"
11226 "IndentWidth: 12\n"
11227 "---\n"
11228 "Language: Cpp\n"
11229 "IndentWidth: 34\n"
11230 "...\n",
11231 IndentWidth, 12u);
11232
11233 Style.Language = FormatStyle::LK_Cpp;
11234 CHECK_PARSE("---\n"
11235 "Language: JavaScript\n"
11236 "IndentWidth: 12\n"
11237 "---\n"
11238 "Language: Cpp\n"
11239 "IndentWidth: 34\n"
11240 "...\n",
11241 IndentWidth, 34u);
11242 CHECK_PARSE("---\n"
11243 "IndentWidth: 78\n"
11244 "---\n"
11245 "Language: JavaScript\n"
11246 "IndentWidth: 56\n"
11247 "...\n",
11248 IndentWidth, 78u);
11249
11250 Style.ColumnLimit = 123;
11251 Style.IndentWidth = 234;
11252 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
11253 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000011254 EXPECT_FALSE(parseConfiguration("---\n"
11255 "IndentWidth: 456\n"
11256 "BreakBeforeBraces: Allman\n"
11257 "---\n"
11258 "Language: JavaScript\n"
11259 "IndentWidth: 111\n"
11260 "TabWidth: 111\n"
11261 "---\n"
11262 "Language: Cpp\n"
11263 "BreakBeforeBraces: Stroustrup\n"
11264 "TabWidth: 789\n"
11265 "...\n",
11266 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011267 EXPECT_EQ(123u, Style.ColumnLimit);
11268 EXPECT_EQ(456u, Style.IndentWidth);
11269 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
11270 EXPECT_EQ(789u, Style.TabWidth);
11271
Rafael Espindola1f243172014-06-12 11:35:17 +000011272 EXPECT_EQ(parseConfiguration("---\n"
11273 "Language: JavaScript\n"
11274 "IndentWidth: 56\n"
11275 "---\n"
11276 "IndentWidth: 78\n"
11277 "...\n",
11278 &Style),
11279 ParseError::Error);
11280 EXPECT_EQ(parseConfiguration("---\n"
11281 "Language: JavaScript\n"
11282 "IndentWidth: 56\n"
11283 "---\n"
11284 "Language: JavaScript\n"
11285 "IndentWidth: 78\n"
11286 "...\n",
11287 &Style),
11288 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011289
11290 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
11291}
Daniel Jasper65ee3472013-07-31 23:16:02 +000011292
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011293#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011294
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011295TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
11296 FormatStyle Style = {};
11297 Style.Language = FormatStyle::LK_JavaScript;
11298 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011299 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000011300 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011301
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011302 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011303 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011304 "BasedOnStyle: Google\n"
11305 "---\n"
11306 "Language: JavaScript\n"
11307 "IndentWidth: 76\n"
11308 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011309 &Style)
11310 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000011311 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011312 EXPECT_EQ(76u, Style.IndentWidth);
11313 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
11314}
11315
Alexander Kornienkod6538332013-05-07 15:32:14 +000011316TEST_F(FormatTest, ConfigurationRoundTripTest) {
11317 FormatStyle Style = getLLVMStyle();
11318 std::string YAML = configurationAsText(Style);
11319 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011320 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000011321 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
11322 EXPECT_EQ(Style, ParsedStyle);
11323}
11324
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011325TEST_F(FormatTest, WorksFor8bitEncodings) {
11326 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
11327 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
11328 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
11329 "\"\xef\xee\xf0\xf3...\"",
11330 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
11331 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
11332 "\xef\xee\xf0\xf3...\"",
11333 getLLVMStyleWithColumns(12)));
11334}
11335
Alexander Kornienko393e3082013-11-13 14:04:17 +000011336TEST_F(FormatTest, HandlesUTF8BOM) {
11337 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
11338 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
11339 format("\xef\xbb\xbf#include <iostream>"));
11340 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
11341 format("\xef\xbb\xbf\n#include <iostream>"));
11342}
11343
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000011344// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
11345#if !defined(_MSC_VER)
11346
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011347TEST_F(FormatTest, CountsUTF8CharactersProperly) {
11348 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
11349 getLLVMStyleWithColumns(35));
11350 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011351 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011352 verifyFormat("// Однажды в студёную зимнюю пору...",
11353 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000011354 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011355 verifyFormat("/* Однажды в студёную зимнюю пору... */",
11356 getLLVMStyleWithColumns(39));
11357 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011358 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011359}
11360
11361TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000011362 // Non-printable characters' width is currently considered to be the length in
11363 // bytes in UTF8. The characters can be displayed in very different manner
11364 // (zero-width, single width with a substitution glyph, expanded to their code
11365 // (e.g. "<8d>"), so there's no single correct way to handle them.
11366 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011367 "\"\xc2\x8d\";",
11368 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000011369 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011370 "\"\xc2\x8d\";",
11371 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000011372 EXPECT_EQ("\"Однажды, в \"\n"
11373 "\"студёную \"\n"
11374 "\"зимнюю \"\n"
11375 "\"пору,\"",
11376 format("\"Однажды, в студёную зимнюю пору,\"",
11377 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011378 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000011379 "\"一 二 三 \"\n"
11380 "\"四 五六 \"\n"
11381 "\"七 八 九 \"\n"
11382 "\"十\"",
11383 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Manuel Klimek93699f42017-11-29 14:29:43 +000011384 EXPECT_EQ("\"一\t\"\n"
11385 "\"二 \t\"\n"
11386 "\"三 四 \"\n"
11387 "\"五\t\"\n"
11388 "\"六 \t\"\n"
11389 "\"七 \"\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011390 "\"八九十\tqq\"",
11391 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
11392 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000011393
11394 // UTF8 character in an escape sequence.
11395 EXPECT_EQ("\"aaaaaa\"\n"
11396 "\"\\\xC2\x8D\"",
11397 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011398}
11399
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011400TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
11401 EXPECT_EQ("const char *sssss =\n"
11402 " \"一二三四五六七八\\\n"
11403 " 九 十\";",
11404 format("const char *sssss = \"一二三四五六七八\\\n"
11405 " 九 十\";",
11406 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011407}
11408
11409TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011410 EXPECT_EQ("// aaaaÄ\xc2\x8d",
11411 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011412 EXPECT_EQ("// Я из лесу\n"
11413 "// вышел; был\n"
11414 "// сильный\n"
11415 "// мороз.",
11416 format("// Я из лесу вышел; был сильный мороз.",
11417 getLLVMStyleWithColumns(13)));
11418 EXPECT_EQ("// 一二三\n"
11419 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011420 "// 八 九\n"
11421 "// 十",
11422 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011423}
11424
11425TEST_F(FormatTest, SplitsUTF8BlockComments) {
11426 EXPECT_EQ("/* Гляжу,\n"
11427 " * поднимается\n"
11428 " * медленно в\n"
11429 " * гору\n"
11430 " * Лошадка,\n"
11431 " * везущая\n"
11432 " * хворосту\n"
11433 " * воз. */",
11434 format("/* Гляжу, поднимается медленно в гору\n"
11435 " * Лошадка, везущая хворосту воз. */",
11436 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011437 EXPECT_EQ(
11438 "/* 一二三\n"
11439 " * 四五六七\n"
11440 " * 八 九\n"
11441 " * 十 */",
11442 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000011443 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
11444 " * 𝕓𝕪𝕥𝕖\n"
11445 " * 𝖀𝕿𝕱-𝟠 */",
11446 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011447}
11448
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011449#endif // _MSC_VER
11450
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011451TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
11452 FormatStyle Style = getLLVMStyle();
11453
11454 Style.ConstructorInitializerIndentWidth = 4;
11455 verifyFormat(
11456 "SomeClass::Constructor()\n"
11457 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11458 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11459 Style);
11460
11461 Style.ConstructorInitializerIndentWidth = 2;
11462 verifyFormat(
11463 "SomeClass::Constructor()\n"
11464 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11465 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11466 Style);
11467
11468 Style.ConstructorInitializerIndentWidth = 0;
11469 verifyFormat(
11470 "SomeClass::Constructor()\n"
11471 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11472 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11473 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000011474 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
11475 verifyFormat(
11476 "SomeLongTemplateVariableName<\n"
11477 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
11478 Style);
11479 verifyFormat(
11480 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
11481 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
11482 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000011483}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011484
Daniel Jasper00853002014-09-16 16:22:30 +000011485TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
11486 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000011487 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011488 Style.ConstructorInitializerIndentWidth = 4;
11489 verifyFormat("SomeClass::Constructor()\n"
11490 " : a(a)\n"
11491 " , b(b)\n"
11492 " , c(c) {}",
11493 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011494 verifyFormat("SomeClass::Constructor()\n"
11495 " : a(a) {}",
11496 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011497
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011498 Style.ColumnLimit = 0;
11499 verifyFormat("SomeClass::Constructor()\n"
11500 " : a(a) {}",
11501 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000011502 verifyFormat("SomeClass::Constructor() noexcept\n"
11503 " : a(a) {}",
11504 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011505 verifyFormat("SomeClass::Constructor()\n"
11506 " : a(a)\n"
11507 " , b(b)\n"
11508 " , c(c) {}",
11509 Style);
11510 verifyFormat("SomeClass::Constructor()\n"
11511 " : a(a) {\n"
11512 " foo();\n"
11513 " bar();\n"
11514 "}",
11515 Style);
11516
Daniel Jasperd74cf402014-04-08 12:46:38 +000011517 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011518 verifyFormat("SomeClass::Constructor()\n"
11519 " : a(a)\n"
11520 " , b(b)\n"
11521 " , c(c) {\n}",
11522 Style);
11523 verifyFormat("SomeClass::Constructor()\n"
11524 " : a(a) {\n}",
11525 Style);
11526
11527 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000011528 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011529 Style.ConstructorInitializerIndentWidth = 2;
11530 verifyFormat("SomeClass::Constructor()\n"
11531 " : a(a)\n"
11532 " , b(b)\n"
11533 " , c(c) {}",
11534 Style);
11535
11536 Style.ConstructorInitializerIndentWidth = 0;
11537 verifyFormat("SomeClass::Constructor()\n"
11538 ": a(a)\n"
11539 ", b(b)\n"
11540 ", c(c) {}",
11541 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011542
11543 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
11544 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011545 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
11546 verifyFormat(
11547 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
11548 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011549 verifyFormat(
11550 "SomeClass::Constructor()\n"
11551 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
11552 Style);
11553 Style.ConstructorInitializerIndentWidth = 4;
11554 Style.ColumnLimit = 60;
11555 verifyFormat("SomeClass::Constructor()\n"
11556 " : aaaaaaaa(aaaaaaaa)\n"
11557 " , aaaaaaaa(aaaaaaaa)\n"
11558 " , aaaaaaaa(aaaaaaaa) {}",
11559 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011560}
11561
Daniel Jasper38efc132014-10-21 07:51:54 +000011562TEST_F(FormatTest, Destructors) {
11563 verifyFormat("void F(int &i) { i.~int(); }");
11564 verifyFormat("void F(int &i) { i->~int(); }");
11565}
11566
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011567TEST_F(FormatTest, FormatsWithWebKitStyle) {
11568 FormatStyle Style = getWebKitStyle();
11569
11570 // Don't indent in outer namespaces.
11571 verifyFormat("namespace outer {\n"
11572 "int i;\n"
11573 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000011574 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011575 "} // namespace inner\n"
11576 "} // namespace outer\n"
11577 "namespace other_outer {\n"
11578 "int i;\n"
11579 "}",
11580 Style);
11581
11582 // Don't indent case labels.
11583 verifyFormat("switch (variable) {\n"
11584 "case 1:\n"
11585 "case 2:\n"
11586 " doSomething();\n"
11587 " break;\n"
11588 "default:\n"
11589 " ++variable;\n"
11590 "}",
11591 Style);
11592
11593 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000011594 EXPECT_EQ("void f()\n"
11595 "{\n"
11596 " if (aaaaaaaaaaaaaaaa\n"
11597 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
11598 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11599 " return;\n"
11600 "}",
11601 format("void f() {\n"
11602 "if (aaaaaaaaaaaaaaaa\n"
11603 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
11604 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11605 "return;\n"
11606 "}",
11607 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011608
Daniel Jasper35995672014-04-29 14:05:20 +000011609 // Allow functions on a single line.
11610 verifyFormat("void f() { return; }", Style);
11611
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011612 // Constructor initializers are formatted one per line with the "," on the
11613 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011614 verifyFormat("Constructor()\n"
11615 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
11616 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000011617 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011618 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
11619 "{\n"
11620 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011621 Style);
11622 verifyFormat("SomeClass::Constructor()\n"
11623 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011624 "{\n"
11625 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011626 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000011627 EXPECT_EQ("SomeClass::Constructor()\n"
11628 " : a(a)\n"
11629 "{\n"
11630 "}",
11631 format("SomeClass::Constructor():a(a){}", Style));
11632 verifyFormat("SomeClass::Constructor()\n"
11633 " : a(a)\n"
11634 " , b(b)\n"
11635 " , c(c)\n"
11636 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011637 "}",
11638 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011639 verifyFormat("SomeClass::Constructor()\n"
11640 " : a(a)\n"
11641 "{\n"
11642 " foo();\n"
11643 " bar();\n"
11644 "}",
11645 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011646
Daniel Jasper65ee3472013-07-31 23:16:02 +000011647 // Access specifiers should be aligned left.
11648 verifyFormat("class C {\n"
11649 "public:\n"
11650 " int i;\n"
11651 "};",
11652 Style);
11653
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011654 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000011655 verifyFormat("int a; // Do not\n"
11656 "double b; // align comments.",
11657 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011658
Daniel Jasper3219e432014-12-02 13:24:51 +000011659 // Do not align operands.
11660 EXPECT_EQ("ASSERT(aaaa\n"
11661 " || bbbb);",
11662 format("ASSERT ( aaaa\n||bbbb);", Style));
11663
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011664 // Accept input's line breaks.
11665 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
11666 " || bbbbbbbbbbbbbbb) {\n"
11667 " i++;\n"
11668 "}",
11669 format("if (aaaaaaaaaaaaaaa\n"
11670 "|| bbbbbbbbbbbbbbb) { i++; }",
11671 Style));
11672 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
11673 " i++;\n"
11674 "}",
11675 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000011676
11677 // Don't automatically break all macro definitions (llvm.org/PR17842).
11678 verifyFormat("#define aNumber 10", Style);
11679 // However, generally keep the line breaks that the user authored.
11680 EXPECT_EQ("#define aNumber \\\n"
11681 " 10",
11682 format("#define aNumber \\\n"
11683 " 10",
11684 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000011685
11686 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011687 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
11688 " copyItems:YES];",
11689 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
11690 "copyItems:YES];",
11691 Style));
11692 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
11693 " copyItems:YES];",
11694 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
11695 " copyItems:YES];",
11696 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000011697 // FIXME: This does not seem right, there should be more indentation before
11698 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011699 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000011700 " @\"a\",\n"
11701 " @\"a\"\n"
11702 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011703 " copyItems:YES];",
11704 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11705 " @\"a\",\n"
11706 " @\"a\"\n"
11707 " ]\n"
11708 " copyItems:YES];",
11709 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011710 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011711 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11712 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011713 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11714 " copyItems:YES];",
11715 Style));
11716
11717 verifyFormat("[self.a b:c c:d];", Style);
11718 EXPECT_EQ("[self.a b:c\n"
11719 " c:d];",
11720 format("[self.a b:c\n"
11721 "c:d];",
11722 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011723}
11724
Manuel Klimekffdeb592013-09-03 15:10:01 +000011725TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011726 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11727 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11728 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11729 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11730 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011731 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Manuel Klimek9f0a4e52017-09-19 09:59:30 +000011732 verifyFormat("auto c = [a = [b = 42] {}] {};\n");
11733 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011734 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011735 verifyFormat("void f() {\n"
11736 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11737 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011738 verifyFormat("void f() {\n"
11739 " other(x.begin(), //\n"
11740 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011741 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011742 "}\n");
Krasimir Georgiev5528cac2018-10-31 17:56:57 +000011743 verifyFormat("void f() {\n"
11744 " other.other.other.other.other(\n"
11745 " x.begin(), x.end(),\n"
11746 " [something, rather](int, int, int, int, int, int, int) { return 1; });\n"
11747 "}\n");
11748 verifyFormat("void f() {\n"
11749 " other.other.other.other.other(\n"
11750 " x.begin(), x.end(),\n"
11751 " [something, rather](int, int, int, int, int, int, int) {\n"
11752 " //\n"
11753 " });\n"
11754 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011755 verifyFormat("SomeFunction([]() { // A cool function...\n"
11756 " return 43;\n"
11757 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011758 EXPECT_EQ("SomeFunction([]() {\n"
11759 "#define A a\n"
11760 " return 43;\n"
11761 "});",
11762 format("SomeFunction([](){\n"
11763 "#define A a\n"
11764 "return 43;\n"
11765 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011766 verifyFormat("void f() {\n"
11767 " SomeFunction([](decltype(x), A *a) {});\n"
11768 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011769 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11770 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011771 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11772 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11773 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011774 verifyFormat("Constructor()\n"
11775 " : Field([] { // comment\n"
11776 " int i;\n"
11777 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011778 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11779 " return some_parameter.size();\n"
11780 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011781 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11782 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011783 verifyFormat("int i = aaaaaa ? 1 //\n"
11784 " : [] {\n"
11785 " return 2; //\n"
11786 " }();");
11787 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11788 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11789 " return x == 2; // force break\n"
11790 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011791 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11792 " [=](int iiiiiiiiiiii) {\n"
11793 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
11794 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
11795 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011796 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011797 verifyFormat("SomeFunction({[&] {\n"
11798 " // comment\n"
11799 " },\n"
11800 " [&] {\n"
11801 " // comment\n"
11802 " }});");
11803 verifyFormat("SomeFunction({[&] {\n"
11804 " // comment\n"
11805 "}});");
Krasimir Georgiev5528cac2018-10-31 17:56:57 +000011806 verifyFormat("virtual aaaaaaaaaaaaaaaa(\n"
11807 " std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n"
11808 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011809
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011810 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011811 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011812 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011813 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11814 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011815 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011816 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011817 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11818 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011819 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011820 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11821 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011822 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011823 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011824 verifyFormat(
11825 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11826 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11827 " return aaaaaaaaaaaaaaaaa;\n"
11828 " });",
11829 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011830 verifyFormat("[]() //\n"
11831 " -> int {\n"
11832 " return 1; //\n"
11833 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011834
Krasimir Georgiev5528cac2018-10-31 17:56:57 +000011835 // Multiple lambdas in the same parentheses change indentation rules. These
11836 // lambdas are forced to start on new lines.
Daniel Jasper4b444492014-11-21 13:38:53 +000011837 verifyFormat("SomeFunction(\n"
11838 " []() {\n"
Krasimir Georgiev5528cac2018-10-31 17:56:57 +000011839 " //\n"
Daniel Jasper4b444492014-11-21 13:38:53 +000011840 " },\n"
11841 " []() {\n"
Krasimir Georgiev5528cac2018-10-31 17:56:57 +000011842 " //\n"
Daniel Jasper4b444492014-11-21 13:38:53 +000011843 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011844
Krasimir Georgiev5528cac2018-10-31 17:56:57 +000011845 // A lambda passed as arg0 is always pushed to the next line.
11846 verifyFormat("SomeFunction(\n"
11847 " [this] {\n"
11848 " //\n"
11849 " },\n"
11850 " 1);\n");
11851
11852 // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like the arg0
11853 // case above.
11854 auto Style = getGoogleStyle();
11855 Style.BinPackArguments = false;
11856 verifyFormat("SomeFunction(\n"
11857 " a,\n"
11858 " [this] {\n"
11859 " //\n"
11860 " },\n"
11861 " b);\n",
11862 Style);
11863 verifyFormat("SomeFunction(\n"
11864 " a,\n"
11865 " [this] {\n"
11866 " //\n"
11867 " },\n"
11868 " b);\n");
11869
11870 // A lambda with a very long line forces arg0 to be pushed out irrespective of
11871 // the BinPackArguments value (as long as the code is wide enough).
11872 verifyFormat("something->SomeFunction(\n"
11873 " a,\n"
11874 " [this] {\n"
11875 " D0000000000000000000000000000000000000000000000000000000000001();\n"
11876 " },\n"
11877 " b);\n");
11878
11879 // A multi-line lambda is pulled up as long as the introducer fits on the previous
11880 // line and there are no further args.
11881 verifyFormat("function(1, [this, that] {\n"
11882 " //\n"
11883 "});\n");
11884 verifyFormat("function([this, that] {\n"
11885 " //\n"
11886 "});\n");
11887 // FIXME: this format is not ideal and we should consider forcing the first arg
11888 // onto its own line.
11889 verifyFormat("function(a, b, c, //\n"
11890 " d, [this, that] {\n"
11891 " //\n"
11892 " });\n");
11893
11894 // Multiple lambdas are treated correctly even when there is a short arg0.
11895 verifyFormat("SomeFunction(\n"
11896 " 1,\n"
11897 " [this] {\n"
11898 " //\n"
11899 " },\n"
11900 " [this] {\n"
11901 " //\n"
11902 " },\n"
11903 " 1);\n");
11904
Daniel Jasperda18fd82014-06-10 06:39:03 +000011905 // More complex introducers.
11906 verifyFormat("return [i, args...] {};");
11907
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011908 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011909 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011910 verifyFormat("double &operator[](int i) { return 0; }\n"
11911 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011912 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011913 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011914 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011915
11916 // Other corner cases.
11917 verifyFormat("void f() {\n"
11918 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000011919 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000011920 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011921
11922 // Lambdas created through weird macros.
11923 verifyFormat("void f() {\n"
11924 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011925 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011926 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011927
11928 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11929 " doo_dah();\n"
11930 " doo_dah();\n"
11931 " })) {\n"
11932 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000011933 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
11934 " doo_dah();\n"
11935 " doo_dah();\n"
11936 " })) {\n"
11937 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011938 verifyFormat("auto lambda = []() {\n"
11939 " int a = 2\n"
11940 "#if A\n"
11941 " + 2\n"
11942 "#endif\n"
11943 " ;\n"
11944 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011945
11946 // Lambdas with complex multiline introducers.
11947 verifyFormat(
11948 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11949 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
11950 " -> ::std::unordered_set<\n"
11951 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
11952 " //\n"
11953 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011954}
11955
Martin Probsta004b3f2017-11-17 18:06:33 +000011956TEST_F(FormatTest, EmptyLinesInLambdas) {
11957 verifyFormat("auto lambda = []() {\n"
11958 " x(); //\n"
11959 "};",
11960 "auto lambda = []() {\n"
11961 "\n"
11962 " x(); //\n"
11963 "\n"
11964 "};");
11965}
11966
Manuel Klimek516e0542013-09-04 13:25:30 +000011967TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011968 FormatStyle ShortBlocks = getLLVMStyle();
11969 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11970 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11971 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11972 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11973 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11974 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11975 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011976
Daniel Jasper76284682014-10-22 09:12:44 +000011977 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11978 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11979 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011980
Daniel Jasper76284682014-10-22 09:12:44 +000011981 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011982 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011983 "}];");
11984 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011985 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011986 "}]};");
11987 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011988 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011989 "}];");
11990 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011991 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011992 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011993 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011994 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011995 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011996 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011997 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011998
11999 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012000 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000012001 "}];",
12002 getLLVMStyleWithColumns(60));
12003 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012004 " NSString *path = [self sessionFilePath];\n"
12005 " if (path) {\n"
12006 " // ...\n"
12007 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000012008 "});");
12009 verifyFormat("[[SessionService sharedService]\n"
12010 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012011 " if (window) {\n"
12012 " [self windowDidLoad:window];\n"
12013 " } else {\n"
12014 " [self errorLoadingWindow];\n"
12015 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000012016 " }];");
12017 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012018 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000012019 "};\n",
12020 getLLVMStyleWithColumns(40));
12021 verifyFormat("[[SessionService sharedService]\n"
12022 " loadWindowWithCompletionBlock: //\n"
12023 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012024 " if (window) {\n"
12025 " [self windowDidLoad:window];\n"
12026 " } else {\n"
12027 " [self errorLoadingWindow];\n"
12028 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000012029 " }];",
12030 getLLVMStyleWithColumns(60));
12031 verifyFormat("[myObject doSomethingWith:arg1\n"
12032 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012033 " // ...\n"
12034 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000012035 " }\n"
12036 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012037 " // ...\n"
12038 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000012039 " }\n"
12040 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012041 " // ...\n"
12042 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000012043 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000012044 verifyFormat("[myObject doSomethingWith:arg1\n"
12045 " firstBlock:-1\n"
12046 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012047 " // ...\n"
12048 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000012049 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000012050
12051 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012052 " @autoreleasepool {\n"
12053 " if (a) {\n"
12054 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000012055 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000012056 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000012057 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000012058 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000012059 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
12060 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000012061
12062 FormatStyle FourIndent = getLLVMStyle();
12063 FourIndent.ObjCBlockIndentWidth = 4;
12064 verifyFormat("[operation setCompletionBlock:^{\n"
12065 " [self onOperationDone];\n"
12066 "}];",
12067 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000012068}
12069
Daniel Jasper289afc02015-04-23 09:23:17 +000012070TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
12071 FormatStyle ZeroColumn = getLLVMStyle();
12072 ZeroColumn.ColumnLimit = 0;
12073
12074 verifyFormat("[[SessionService sharedService] "
12075 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
12076 " if (window) {\n"
12077 " [self windowDidLoad:window];\n"
12078 " } else {\n"
12079 " [self errorLoadingWindow];\n"
12080 " }\n"
12081 "}];",
12082 ZeroColumn);
12083 EXPECT_EQ("[[SessionService sharedService]\n"
12084 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
12085 " if (window) {\n"
12086 " [self windowDidLoad:window];\n"
12087 " } else {\n"
12088 " [self errorLoadingWindow];\n"
12089 " }\n"
12090 " }];",
12091 format("[[SessionService sharedService]\n"
12092 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
12093 " if (window) {\n"
12094 " [self windowDidLoad:window];\n"
12095 " } else {\n"
12096 " [self errorLoadingWindow];\n"
12097 " }\n"
12098 "}];",
12099 ZeroColumn));
12100 verifyFormat("[myObject doSomethingWith:arg1\n"
12101 " firstBlock:^(Foo *a) {\n"
12102 " // ...\n"
12103 " int i;\n"
12104 " }\n"
12105 " secondBlock:^(Bar *b) {\n"
12106 " // ...\n"
12107 " int i;\n"
12108 " }\n"
12109 " thirdBlock:^Foo(Bar *b) {\n"
12110 " // ...\n"
12111 " int i;\n"
12112 " }];",
12113 ZeroColumn);
12114 verifyFormat("f(^{\n"
12115 " @autoreleasepool {\n"
12116 " if (a) {\n"
12117 " g();\n"
12118 " }\n"
12119 " }\n"
12120 "});",
12121 ZeroColumn);
12122 verifyFormat("void (^largeBlock)(void) = ^{\n"
12123 " // ...\n"
12124 "};",
12125 ZeroColumn);
12126
12127 ZeroColumn.AllowShortBlocksOnASingleLine = true;
12128 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000012129 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000012130 ZeroColumn.AllowShortBlocksOnASingleLine = false;
12131 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
12132 " int i;\n"
12133 "};",
12134 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
12135}
12136
Alexander Kornienko9e649af2013-09-11 12:25:57 +000012137TEST_F(FormatTest, SupportsCRLF) {
12138 EXPECT_EQ("int a;\r\n"
12139 "int b;\r\n"
12140 "int c;\r\n",
12141 format("int a;\r\n"
12142 " int b;\r\n"
12143 " int c;\r\n",
12144 getLLVMStyle()));
12145 EXPECT_EQ("int a;\r\n"
12146 "int b;\r\n"
12147 "int c;\r\n",
12148 format("int a;\r\n"
12149 " int b;\n"
12150 " int c;\r\n",
12151 getLLVMStyle()));
12152 EXPECT_EQ("int a;\n"
12153 "int b;\n"
12154 "int c;\n",
12155 format("int a;\r\n"
12156 " int b;\n"
12157 " int c;\n",
12158 getLLVMStyle()));
12159 EXPECT_EQ("\"aaaaaaa \"\r\n"
12160 "\"bbbbbbb\";\r\n",
12161 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
12162 EXPECT_EQ("#define A \\\r\n"
12163 " b; \\\r\n"
12164 " c; \\\r\n"
12165 " d;\r\n",
12166 format("#define A \\\r\n"
12167 " b; \\\r\n"
12168 " c; d; \r\n",
12169 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000012170
12171 EXPECT_EQ("/*\r\n"
12172 "multi line block comments\r\n"
12173 "should not introduce\r\n"
12174 "an extra carriage return\r\n"
12175 "*/\r\n",
12176 format("/*\r\n"
12177 "multi line block comments\r\n"
12178 "should not introduce\r\n"
12179 "an extra carriage return\r\n"
12180 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000012181}
12182
Manuel Klimekb212f3b2013-10-12 22:46:56 +000012183TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
12184 verifyFormat("MY_CLASS(C) {\n"
12185 " int i;\n"
12186 " int j;\n"
12187 "};");
12188}
12189
Daniel Jasper6633ab82013-10-18 10:38:14 +000012190TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
12191 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
12192 TwoIndent.ContinuationIndentWidth = 2;
12193
12194 EXPECT_EQ("int i =\n"
12195 " longFunction(\n"
12196 " arg);",
12197 format("int i = longFunction(arg);", TwoIndent));
12198
12199 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
12200 SixIndent.ContinuationIndentWidth = 6;
12201
12202 EXPECT_EQ("int i =\n"
12203 " longFunction(\n"
12204 " arg);",
12205 format("int i = longFunction(arg);", SixIndent));
12206}
12207
Daniel Jasperdd978ae2013-10-29 14:52:02 +000012208TEST_F(FormatTest, SpacesInAngles) {
12209 FormatStyle Spaces = getLLVMStyle();
12210 Spaces.SpacesInAngles = true;
12211
12212 verifyFormat("static_cast< int >(arg);", Spaces);
12213 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
12214 verifyFormat("f< int, float >();", Spaces);
12215 verifyFormat("template <> g() {}", Spaces);
12216 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000012217 verifyFormat("std::function< void(int, int) > fct;", Spaces);
12218 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
12219 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000012220
12221 Spaces.Standard = FormatStyle::LS_Cpp03;
12222 Spaces.SpacesInAngles = true;
12223 verifyFormat("A< A< int > >();", Spaces);
12224
12225 Spaces.SpacesInAngles = false;
12226 verifyFormat("A<A<int> >();", Spaces);
12227
12228 Spaces.Standard = FormatStyle::LS_Cpp11;
12229 Spaces.SpacesInAngles = true;
12230 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000012231
Daniel Jasperdd978ae2013-10-29 14:52:02 +000012232 Spaces.SpacesInAngles = false;
12233 verifyFormat("A<A<int>>();", Spaces);
12234}
12235
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000012236TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
12237 FormatStyle Style = getLLVMStyle();
12238 Style.SpaceAfterTemplateKeyword = false;
12239 verifyFormat("template<int> void foo();", Style);
12240}
12241
Jacques Pienaarfc275112015-02-18 23:48:37 +000012242TEST_F(FormatTest, TripleAngleBrackets) {
12243 verifyFormat("f<<<1, 1>>>();");
12244 verifyFormat("f<<<1, 1, 1, s>>>();");
12245 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000012246 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000012247 verifyFormat("f<param><<<1, 1>>>();");
12248 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000012249 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000012250 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12251 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000012252 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
12253 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000012254}
12255
12256TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000012257 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000012258 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000012259 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12260 "aaallvm::outs() <<");
12261 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12262 "aaaallvm::outs()\n <<");
12263}
12264
Manuel Klimek819788d2014-03-18 11:22:45 +000012265TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
12266 std::string code = "#if A\n"
12267 "#if B\n"
12268 "a.\n"
12269 "#endif\n"
12270 " a = 1;\n"
12271 "#else\n"
12272 "#endif\n"
12273 "#if C\n"
12274 "#else\n"
12275 "#endif\n";
12276 EXPECT_EQ(code, format(code));
12277}
12278
Manuel Klimek68b03042014-04-14 09:14:11 +000012279TEST_F(FormatTest, HandleConflictMarkers) {
12280 // Git/SVN conflict markers.
12281 EXPECT_EQ("int a;\n"
12282 "void f() {\n"
12283 " callme(some(parameter1,\n"
12284 "<<<<<<< text by the vcs\n"
12285 " parameter2),\n"
12286 "||||||| text by the vcs\n"
12287 " parameter2),\n"
12288 " parameter3,\n"
12289 "======= text by the vcs\n"
12290 " parameter2, parameter3),\n"
12291 ">>>>>>> text by the vcs\n"
12292 " otherparameter);\n",
12293 format("int a;\n"
12294 "void f() {\n"
12295 " callme(some(parameter1,\n"
12296 "<<<<<<< text by the vcs\n"
12297 " parameter2),\n"
12298 "||||||| text by the vcs\n"
12299 " parameter2),\n"
12300 " parameter3,\n"
12301 "======= text by the vcs\n"
12302 " parameter2,\n"
12303 " parameter3),\n"
12304 ">>>>>>> text by the vcs\n"
12305 " otherparameter);\n"));
12306
12307 // Perforce markers.
12308 EXPECT_EQ("void f() {\n"
12309 " function(\n"
12310 ">>>> text by the vcs\n"
12311 " parameter,\n"
12312 "==== text by the vcs\n"
12313 " parameter,\n"
12314 "==== text by the vcs\n"
12315 " parameter,\n"
12316 "<<<< text by the vcs\n"
12317 " parameter);\n",
12318 format("void f() {\n"
12319 " function(\n"
12320 ">>>> text by the vcs\n"
12321 " parameter,\n"
12322 "==== text by the vcs\n"
12323 " parameter,\n"
12324 "==== text by the vcs\n"
12325 " parameter,\n"
12326 "<<<< text by the vcs\n"
12327 " parameter);\n"));
12328
12329 EXPECT_EQ("<<<<<<<\n"
12330 "|||||||\n"
12331 "=======\n"
12332 ">>>>>>>",
12333 format("<<<<<<<\n"
12334 "|||||||\n"
12335 "=======\n"
12336 ">>>>>>>"));
12337
12338 EXPECT_EQ("<<<<<<<\n"
12339 "|||||||\n"
12340 "int i;\n"
12341 "=======\n"
12342 ">>>>>>>",
12343 format("<<<<<<<\n"
12344 "|||||||\n"
12345 "int i;\n"
12346 "=======\n"
12347 ">>>>>>>"));
12348
12349 // FIXME: Handle parsing of macros around conflict markers correctly:
12350 EXPECT_EQ("#define Macro \\\n"
12351 "<<<<<<<\n"
12352 "Something \\\n"
12353 "|||||||\n"
12354 "Else \\\n"
12355 "=======\n"
12356 "Other \\\n"
12357 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000012358 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000012359 format("#define Macro \\\n"
12360 "<<<<<<<\n"
12361 " Something \\\n"
12362 "|||||||\n"
12363 " Else \\\n"
12364 "=======\n"
12365 " Other \\\n"
12366 ">>>>>>>\n"
12367 " End\n"
12368 "int i;\n"));
12369}
12370
Daniel Jasper471894432014-08-06 13:40:26 +000012371TEST_F(FormatTest, DisableRegions) {
12372 EXPECT_EQ("int i;\n"
12373 "// clang-format off\n"
12374 " int j;\n"
12375 "// clang-format on\n"
12376 "int k;",
12377 format(" int i;\n"
12378 " // clang-format off\n"
12379 " int j;\n"
12380 " // clang-format on\n"
12381 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000012382 EXPECT_EQ("int i;\n"
12383 "/* clang-format off */\n"
12384 " int j;\n"
12385 "/* clang-format on */\n"
12386 "int k;",
12387 format(" int i;\n"
12388 " /* clang-format off */\n"
12389 " int j;\n"
12390 " /* clang-format on */\n"
12391 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000012392
12393 // Don't reflow comments within disabled regions.
12394 EXPECT_EQ(
12395 "// clang-format off\n"
12396 "// long long long long long long line\n"
12397 "/* clang-format on */\n"
12398 "/* long long long\n"
12399 " * long long long\n"
12400 " * line */\n"
12401 "int i;\n"
12402 "/* clang-format off */\n"
12403 "/* long long long long long long line */\n",
12404 format("// clang-format off\n"
12405 "// long long long long long long line\n"
12406 "/* clang-format on */\n"
12407 "/* long long long long long long line */\n"
12408 "int i;\n"
12409 "/* clang-format off */\n"
12410 "/* long long long long long long line */\n",
12411 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000012412}
12413
Manuel Klimekf0c95b32015-06-11 10:14:13 +000012414TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
12415 format("? ) =");
12416 verifyNoCrash("#define a\\\n /**/}");
12417}
Manuel Klimek5f594f82014-08-13 14:00:41 +000012418
Daniel Jasper498f5582015-12-25 08:53:31 +000012419TEST_F(FormatTest, FormatsTableGenCode) {
12420 FormatStyle Style = getLLVMStyle();
12421 Style.Language = FormatStyle::LK_TableGen;
12422 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
12423}
12424
Nico Weberb2673a12016-11-10 21:49:25 +000012425TEST_F(FormatTest, ArrayOfTemplates) {
12426 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
12427 format("auto a = new unique_ptr<int > [ 10];"));
12428
12429 FormatStyle Spaces = getLLVMStyle();
12430 Spaces.SpacesInSquareBrackets = true;
12431 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
12432 format("auto a = new unique_ptr<int > [10];", Spaces));
12433}
12434
12435TEST_F(FormatTest, ArrayAsTemplateType) {
12436 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
12437 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
12438
12439 FormatStyle Spaces = getLLVMStyle();
12440 Spaces.SpacesInSquareBrackets = true;
12441 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
12442 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
12443}
12444
Martin Probstc9c51c42017-03-16 10:21:35 +000012445TEST_F(FormatTest, NoSpaceAfterSuper) {
12446 verifyFormat("__super::FooBar();");
12447}
12448
Ben Hamilton07e58362018-02-21 21:27:27 +000012449TEST(FormatStyle, GetStyleWithEmptyFileName) {
Jonas Devliegherefc514902018-10-10 13:27:25 +000012450 llvm::vfs::InMemoryFileSystem FS;
Bjorn Pettersson0b2f7742018-02-26 14:14:11 +000012451 auto Style1 = getStyle("file", "", "Google", "", &FS);
Ben Hamilton07e58362018-02-21 21:27:27 +000012452 ASSERT_TRUE((bool)Style1);
12453 ASSERT_EQ(*Style1, getGoogleStyle());
12454}
12455
Eric Liu547d8792016-03-24 13:22:42 +000012456TEST(FormatStyle, GetStyleOfFile) {
Jonas Devliegherefc514902018-10-10 13:27:25 +000012457 llvm::vfs::InMemoryFileSystem FS;
Eric Liu547d8792016-03-24 13:22:42 +000012458 // Test 1: format file in the same directory.
12459 ASSERT_TRUE(
12460 FS.addFile("/a/.clang-format", 0,
12461 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
12462 ASSERT_TRUE(
12463 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012464 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012465 ASSERT_TRUE((bool)Style1);
12466 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000012467
Antonio Maiorano7eb75072017-01-20 01:22:42 +000012468 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000012469 ASSERT_TRUE(
12470 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012471 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012472 ASSERT_TRUE((bool)Style2);
12473 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000012474
Antonio Maiorano7eb75072017-01-20 01:22:42 +000012475 // Test 2.2: no format on 'none' fallback style.
12476 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
12477 ASSERT_TRUE((bool)Style2);
12478 ASSERT_EQ(*Style2, getNoStyle());
12479
12480 // Test 2.3: format if config is found with no based style while fallback is
12481 // 'none'.
12482 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
12483 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
12484 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
12485 ASSERT_TRUE((bool)Style2);
12486 ASSERT_EQ(*Style2, getLLVMStyle());
12487
12488 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
12489 Style2 = getStyle("{}", "a.h", "none", "", &FS);
12490 ASSERT_TRUE((bool)Style2);
12491 ASSERT_EQ(*Style2, getLLVMStyle());
12492
Eric Liu547d8792016-03-24 13:22:42 +000012493 // Test 3: format file in parent directory.
12494 ASSERT_TRUE(
12495 FS.addFile("/c/.clang-format", 0,
12496 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
12497 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
12498 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012499 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012500 ASSERT_TRUE((bool)Style3);
12501 ASSERT_EQ(*Style3, getGoogleStyle());
12502
12503 // Test 4: error on invalid fallback style
12504 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
12505 ASSERT_FALSE((bool)Style4);
12506 llvm::consumeError(Style4.takeError());
12507
12508 // Test 5: error on invalid yaml on command line
12509 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
12510 ASSERT_FALSE((bool)Style5);
12511 llvm::consumeError(Style5.takeError());
12512
12513 // Test 6: error on invalid style
12514 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
12515 ASSERT_FALSE((bool)Style6);
12516 llvm::consumeError(Style6.takeError());
12517
12518 // Test 7: found config file, error on parsing it
12519 ASSERT_TRUE(
12520 FS.addFile("/d/.clang-format", 0,
12521 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
12522 "InvalidKey: InvalidValue")));
12523 ASSERT_TRUE(
12524 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
12525 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
12526 ASSERT_FALSE((bool)Style7);
12527 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000012528}
12529
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012530TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
12531 // Column limit is 20.
12532 std::string Code = "Type *a =\n"
12533 " new Type();\n"
12534 "g(iiiii, 0, jjjjj,\n"
12535 " 0, kkkkk, 0, mm);\n"
12536 "int bad = format ;";
12537 std::string Expected = "auto a = new Type();\n"
12538 "g(iiiii, nullptr,\n"
12539 " jjjjj, nullptr,\n"
12540 " kkkkk, nullptr,\n"
12541 " mm);\n"
12542 "int bad = format ;";
12543 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000012544 tooling::Replacements Replaces = toReplacements(
12545 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
12546 "auto "),
12547 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
12548 "nullptr"),
12549 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
12550 "nullptr"),
12551 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
12552 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012553
12554 format::FormatStyle Style = format::getLLVMStyle();
12555 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000012556 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
12557 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
12558 << llvm::toString(FormattedReplaces.takeError()) << "\n";
12559 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12560 EXPECT_TRUE(static_cast<bool>(Result));
12561 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012562}
12563
Eric Liubaf58c22016-05-18 13:43:48 +000012564TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
12565 std::string Code = "#include \"a.h\"\n"
12566 "#include \"c.h\"\n"
12567 "\n"
12568 "int main() {\n"
12569 " return 0;\n"
12570 "}";
12571 std::string Expected = "#include \"a.h\"\n"
12572 "#include \"b.h\"\n"
12573 "#include \"c.h\"\n"
12574 "\n"
12575 "int main() {\n"
12576 " return 0;\n"
12577 "}";
12578 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000012579 tooling::Replacements Replaces = toReplacements(
12580 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
12581 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000012582
12583 format::FormatStyle Style = format::getLLVMStyle();
12584 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000012585 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
12586 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
12587 << llvm::toString(FormattedReplaces.takeError()) << "\n";
12588 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12589 EXPECT_TRUE(static_cast<bool>(Result));
12590 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000012591}
12592
Krasimir Georgievac16a202017-06-23 11:46:03 +000012593TEST_F(FormatTest, FormatSortsUsingDeclarations) {
12594 EXPECT_EQ("using std::cin;\n"
12595 "using std::cout;",
12596 format("using std::cout;\n"
12597 "using std::cin;", getGoogleStyle()));
12598}
12599
Nico Weberdc065182017-04-05 18:10:42 +000012600TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
12601 format::FormatStyle Style = format::getLLVMStyle();
12602 Style.Standard = FormatStyle::LS_Cpp03;
12603 // cpp03 recognize this string as identifier u8 and literal character 'a'
12604 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
12605}
12606
12607TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
12608 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
12609 // all modes, including C++11, C++14 and C++17
12610 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
12611}
12612
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000012613TEST_F(FormatTest, DoNotFormatLikelyXml) {
12614 EXPECT_EQ("<!-- ;> -->",
12615 format("<!-- ;> -->", getGoogleStyle()));
12616 EXPECT_EQ(" <!-- >; -->",
12617 format(" <!-- >; -->", getGoogleStyle()));
12618}
12619
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012620TEST_F(FormatTest, StructuredBindings) {
12621 // Structured bindings is a C++17 feature.
12622 // all modes, including C++11, C++14 and C++17
12623 verifyFormat("auto [a, b] = f();");
12624 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
12625 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();"));
12626 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();"));
12627 EXPECT_EQ("auto const volatile [a, b] = f();",
12628 format("auto const volatile[a, b] = f();"));
12629 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012630 EXPECT_EQ("auto &[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012631 format("auto &[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012632 EXPECT_EQ("auto &&[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012633 format("auto &&[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012634 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();"));
12635 EXPECT_EQ("auto const volatile &&[a, b] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012636 format("auto const volatile &&[a, b] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012637 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();"));
12638 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();"));
12639 EXPECT_EQ("const auto volatile &&[a, b] = f();",
12640 format("const auto volatile &&[a, b] = f();"));
12641 EXPECT_EQ("volatile const auto &&[a, b] = f();",
12642 format("volatile const auto &&[a, b] = f();"));
12643 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();"));
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012644
Manuel Klimeke411aa82017-09-20 09:29:37 +000012645 // Make sure we don't mistake structured bindings for lambdas.
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012646 FormatStyle PointerMiddle = getLLVMStyle();
12647 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
12648 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
12649 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
12650 verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
12651 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
12652 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
12653 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
12654 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
12655 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
12656 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
12657 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
12658 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
12659 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
12660
12661 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
12662 format("for (const auto && [a, b] : some_range) {\n}"));
12663 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
12664 format("for (const auto & [a, b] : some_range) {\n}"));
12665 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
12666 format("for (const auto[a, b] : some_range) {\n}"));
12667 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);"));
12668 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);"));
12669 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);"));
12670 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);"));
12671 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);"));
12672 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};"));
12673 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};"));
12674 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};"));
Manuel Klimeke411aa82017-09-20 09:29:37 +000012675
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012676 format::FormatStyle Spaces = format::getLLVMStyle();
12677 Spaces.SpacesInSquareBrackets = true;
12678 verifyFormat("auto [ a, b ] = f();", Spaces);
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012679 verifyFormat("auto &&[ a, b ] = f();", Spaces);
12680 verifyFormat("auto &[ a, b ] = f();", Spaces);
12681 verifyFormat("auto const &&[ a, b ] = f();", Spaces);
12682 verifyFormat("auto const &[ a, b ] = f();", Spaces);
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012683}
12684
Ben Hamilton6e066352018-02-27 15:56:40 +000012685TEST_F(FormatTest, FileAndCode) {
12686 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
12687 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
12688 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
12689 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
12690 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
Ben Hamiltonb1a79192018-04-12 15:11:53 +000012691 EXPECT_EQ(
12692 FormatStyle::LK_ObjC,
12693 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
12694 EXPECT_EQ(FormatStyle::LK_ObjC,
12695 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
12696 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
Ben Hamilton6e066352018-02-27 15:56:40 +000012697 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
12698 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
Ben Hamilton19c782d2018-03-22 03:25:22 +000012699 EXPECT_EQ(FormatStyle::LK_ObjC,
12700 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
12701 EXPECT_EQ(
12702 FormatStyle::LK_ObjC,
12703 guessLanguage("foo.h",
12704 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
Ben Hamilton9dc78162018-04-03 14:07:11 +000012705 EXPECT_EQ(
12706 FormatStyle::LK_Cpp,
12707 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
Ben Hamilton3b345c32018-02-21 15:54:31 +000012708}
12709
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012710TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
12711 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
12712 EXPECT_EQ(FormatStyle::LK_ObjC,
12713 guessLanguage("foo.h", "array[[calculator getIndex]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012714 EXPECT_EQ(FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012715 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012716 EXPECT_EQ(
12717 FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012718 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
12719 EXPECT_EQ(FormatStyle::LK_ObjC,
12720 guessLanguage("foo.h", "[[noreturn foo] bar];"));
12721 EXPECT_EQ(FormatStyle::LK_Cpp,
12722 guessLanguage("foo.h", "[[clang::fallthrough]];"));
12723 EXPECT_EQ(FormatStyle::LK_ObjC,
12724 guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
12725 EXPECT_EQ(FormatStyle::LK_Cpp,
12726 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
12727 EXPECT_EQ(FormatStyle::LK_Cpp,
12728 guessLanguage("foo.h", "[[using clang: fallthrough]];"));
12729 EXPECT_EQ(FormatStyle::LK_ObjC,
12730 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
12731 EXPECT_EQ(FormatStyle::LK_Cpp,
12732 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
12733 EXPECT_EQ(
12734 FormatStyle::LK_Cpp,
12735 guessLanguage("foo.h",
12736 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
12737 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012738}
12739
Ben Hamilton788a2222018-03-12 15:42:40 +000012740TEST_F(FormatTest, GuessLanguageWithCaret) {
12741 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
12742 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
12743 EXPECT_EQ(FormatStyle::LK_ObjC,
12744 guessLanguage("foo.h", "int(^)(char, float);"));
12745 EXPECT_EQ(FormatStyle::LK_ObjC,
12746 guessLanguage("foo.h", "int(^foo)(char, float);"));
12747 EXPECT_EQ(FormatStyle::LK_ObjC,
12748 guessLanguage("foo.h", "int(^foo[10])(char, float);"));
12749 EXPECT_EQ(FormatStyle::LK_ObjC,
12750 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
12751 EXPECT_EQ(
12752 FormatStyle::LK_ObjC,
12753 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
12754}
12755
Ben Hamilton6432afe2018-03-22 17:37:19 +000012756TEST_F(FormatTest, GuessLanguageWithChildLines) {
12757 EXPECT_EQ(FormatStyle::LK_Cpp,
12758 guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
12759 EXPECT_EQ(FormatStyle::LK_ObjC,
12760 guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
Ben Hamiltonea7a27b2018-03-27 15:01:21 +000012761 EXPECT_EQ(
12762 FormatStyle::LK_Cpp,
12763 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
12764 EXPECT_EQ(
12765 FormatStyle::LK_ObjC,
12766 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
Ben Hamilton6432afe2018-03-22 17:37:19 +000012767}
12768
Daniel Jasperd246a5a2015-06-15 15:25:11 +000012769} // end namespace
12770} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000012771} // end namespace clang