blob: 3e23c5e11b5beedebb5dbc3b486ca43d4faa9e73 [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(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002663}
2664
Manuel Klimek4fe43002013-05-22 12:51:29 +00002665TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2666 verifyFormat("#define A \\\n"
2667 " f({ \\\n"
2668 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002669 " });",
2670 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002671}
2672
Krasimir Georgievad47c902017-08-30 14:34:57 +00002673TEST_F(FormatTest, IndentPreprocessorDirectives) {
2674 FormatStyle Style = getLLVMStyle();
2675 Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2676 Style.ColumnLimit = 40;
2677 verifyFormat("#ifdef _WIN32\n"
2678 "#define A 0\n"
2679 "#ifdef VAR2\n"
2680 "#define B 1\n"
2681 "#include <someheader.h>\n"
2682 "#define MACRO \\\n"
2683 " some_very_long_func_aaaaaaaaaa();\n"
2684 "#endif\n"
2685 "#else\n"
2686 "#define A 1\n"
2687 "#endif",
2688 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002689 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2690 verifyFormat("#ifdef _WIN32\n"
2691 "# define A 0\n"
2692 "# ifdef VAR2\n"
2693 "# define B 1\n"
2694 "# include <someheader.h>\n"
2695 "# define MACRO \\\n"
2696 " some_very_long_func_aaaaaaaaaa();\n"
2697 "# endif\n"
2698 "#else\n"
2699 "# define A 1\n"
2700 "#endif",
2701 Style);
2702 verifyFormat("#if A\n"
2703 "# define MACRO \\\n"
2704 " void a(int x) { \\\n"
2705 " b(); \\\n"
2706 " c(); \\\n"
2707 " d(); \\\n"
2708 " e(); \\\n"
2709 " f(); \\\n"
2710 " }\n"
2711 "#endif",
2712 Style);
2713 // Comments before include guard.
2714 verifyFormat("// file comment\n"
2715 "// file comment\n"
2716 "#ifndef HEADER_H\n"
2717 "#define HEADER_H\n"
2718 "code();\n"
2719 "#endif",
2720 Style);
2721 // Test with include guards.
Krasimir Georgievad47c902017-08-30 14:34:57 +00002722 verifyFormat("#ifndef HEADER_H\n"
2723 "#define HEADER_H\n"
2724 "code();\n"
2725 "#endif",
2726 Style);
2727 // Include guards must have a #define with the same variable immediately
2728 // after #ifndef.
2729 verifyFormat("#ifndef NOT_GUARD\n"
2730 "# define FOO\n"
2731 "code();\n"
2732 "#endif",
2733 Style);
2734
2735 // Include guards must cover the entire file.
2736 verifyFormat("code();\n"
2737 "code();\n"
2738 "#ifndef NOT_GUARD\n"
2739 "# define NOT_GUARD\n"
2740 "code();\n"
2741 "#endif",
2742 Style);
2743 verifyFormat("#ifndef NOT_GUARD\n"
2744 "# define NOT_GUARD\n"
2745 "code();\n"
2746 "#endif\n"
2747 "code();",
2748 Style);
2749 // Test with trailing blank lines.
2750 verifyFormat("#ifndef HEADER_H\n"
2751 "#define HEADER_H\n"
2752 "code();\n"
2753 "#endif\n",
2754 Style);
2755 // Include guards don't have #else.
2756 verifyFormat("#ifndef NOT_GUARD\n"
2757 "# define NOT_GUARD\n"
2758 "code();\n"
2759 "#else\n"
2760 "#endif",
2761 Style);
2762 verifyFormat("#ifndef NOT_GUARD\n"
2763 "# define NOT_GUARD\n"
2764 "code();\n"
2765 "#elif FOO\n"
2766 "#endif",
2767 Style);
Mark Zeren1c3afaf2018-02-05 15:59:00 +00002768 // Non-identifier #define after potential include guard.
2769 verifyFormat("#ifndef FOO\n"
2770 "# define 1\n"
2771 "#endif\n",
2772 Style);
2773 // #if closes past last non-preprocessor line.
2774 verifyFormat("#ifndef FOO\n"
2775 "#define FOO\n"
2776 "#if 1\n"
2777 "int i;\n"
2778 "# define A 0\n"
2779 "#endif\n"
2780 "#endif\n",
2781 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002782 // FIXME: This doesn't handle the case where there's code between the
2783 // #ifndef and #define but all other conditions hold. This is because when
2784 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2785 // previous code line yet, so we can't detect it.
2786 EXPECT_EQ("#ifndef NOT_GUARD\n"
2787 "code();\n"
2788 "#define NOT_GUARD\n"
2789 "code();\n"
2790 "#endif",
2791 format("#ifndef NOT_GUARD\n"
2792 "code();\n"
2793 "# define NOT_GUARD\n"
2794 "code();\n"
2795 "#endif",
2796 Style));
2797 // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2798 // be outside an include guard. Examples are #pragma once and
2799 // #pragma GCC diagnostic, or anything else that does not change the meaning
2800 // of the file if it's included multiple times.
2801 EXPECT_EQ("#ifdef WIN32\n"
2802 "# pragma once\n"
2803 "#endif\n"
2804 "#ifndef HEADER_H\n"
2805 "# define HEADER_H\n"
2806 "code();\n"
2807 "#endif",
2808 format("#ifdef WIN32\n"
2809 "# pragma once\n"
2810 "#endif\n"
2811 "#ifndef HEADER_H\n"
2812 "#define HEADER_H\n"
2813 "code();\n"
2814 "#endif",
2815 Style));
2816 // FIXME: This does not detect when there is a single non-preprocessor line
2817 // in front of an include-guard-like structure where other conditions hold
2818 // because ScopedLineState hides the line.
2819 EXPECT_EQ("code();\n"
2820 "#ifndef HEADER_H\n"
2821 "#define HEADER_H\n"
2822 "code();\n"
2823 "#endif",
2824 format("code();\n"
2825 "#ifndef HEADER_H\n"
2826 "# define HEADER_H\n"
2827 "code();\n"
2828 "#endif",
2829 Style));
Mark Zerend2b2ac62018-01-31 20:05:50 +00002830 // Keep comments aligned with #, otherwise indent comments normally. These
2831 // tests cannot use verifyFormat because messUp manipulates leading
2832 // whitespace.
2833 {
2834 const char *Expected = ""
2835 "void f() {\n"
2836 "#if 1\n"
2837 "// Preprocessor aligned.\n"
2838 "# define A 0\n"
2839 " // Code. Separated by blank line.\n"
2840 "\n"
2841 "# define B 0\n"
2842 " // Code. Not aligned with #\n"
2843 "# define C 0\n"
2844 "#endif";
2845 const char *ToFormat = ""
2846 "void f() {\n"
2847 "#if 1\n"
2848 "// Preprocessor aligned.\n"
2849 "# define A 0\n"
2850 "// Code. Separated by blank line.\n"
2851 "\n"
2852 "# define B 0\n"
2853 " // Code. Not aligned with #\n"
2854 "# define C 0\n"
2855 "#endif";
2856 EXPECT_EQ(Expected, format(ToFormat, Style));
2857 EXPECT_EQ(Expected, format(Expected, Style));
2858 }
2859 // Keep block quotes aligned.
2860 {
2861 const char *Expected = ""
2862 "void f() {\n"
2863 "#if 1\n"
2864 "/* Preprocessor aligned. */\n"
2865 "# define A 0\n"
2866 " /* Code. Separated by blank line. */\n"
2867 "\n"
2868 "# define B 0\n"
2869 " /* Code. Not aligned with # */\n"
2870 "# define C 0\n"
2871 "#endif";
2872 const char *ToFormat = ""
2873 "void f() {\n"
2874 "#if 1\n"
2875 "/* Preprocessor aligned. */\n"
2876 "# define A 0\n"
2877 "/* Code. Separated by blank line. */\n"
2878 "\n"
2879 "# define B 0\n"
2880 " /* Code. Not aligned with # */\n"
2881 "# define C 0\n"
2882 "#endif";
2883 EXPECT_EQ(Expected, format(ToFormat, Style));
2884 EXPECT_EQ(Expected, format(Expected, Style));
2885 }
2886 // Keep comments aligned with un-indented directives.
2887 {
2888 const char *Expected = ""
2889 "void f() {\n"
2890 "// Preprocessor aligned.\n"
2891 "#define A 0\n"
2892 " // Code. Separated by blank line.\n"
2893 "\n"
2894 "#define B 0\n"
2895 " // Code. Not aligned with #\n"
2896 "#define C 0\n";
2897 const char *ToFormat = ""
2898 "void f() {\n"
2899 "// Preprocessor aligned.\n"
2900 "#define A 0\n"
2901 "// Code. Separated by blank line.\n"
2902 "\n"
2903 "#define B 0\n"
2904 " // Code. Not aligned with #\n"
2905 "#define C 0\n";
2906 EXPECT_EQ(Expected, format(ToFormat, Style));
2907 EXPECT_EQ(Expected, format(Expected, Style));
2908 }
Krasimir Georgievad47c902017-08-30 14:34:57 +00002909 // Test with tabs.
2910 Style.UseTab = FormatStyle::UT_Always;
2911 Style.IndentWidth = 8;
2912 Style.TabWidth = 8;
2913 verifyFormat("#ifdef _WIN32\n"
2914 "#\tdefine A 0\n"
2915 "#\tifdef VAR2\n"
2916 "#\t\tdefine B 1\n"
2917 "#\t\tinclude <someheader.h>\n"
2918 "#\t\tdefine MACRO \\\n"
2919 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
2920 "#\tendif\n"
2921 "#else\n"
2922 "#\tdefine A 1\n"
2923 "#endif",
2924 Style);
Daniel Jasper4df130f2017-09-04 13:33:52 +00002925
2926 // Regression test: Multiline-macro inside include guards.
2927 verifyFormat("#ifndef HEADER_H\n"
2928 "#define HEADER_H\n"
2929 "#define A() \\\n"
2930 " int i; \\\n"
2931 " int j;\n"
2932 "#endif // HEADER_H",
2933 getLLVMStyleWithColumns(20));
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002934}
2935
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002936TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002937 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002938}
2939
Manuel Klimek1058d982013-01-06 20:07:31 +00002940TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2941 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2942 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2943 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2944 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2945}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002946
Daniel Jaspere2408e32015-05-06 11:16:43 +00002947TEST_F(FormatTest, EscapedNewlines) {
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002948 FormatStyle Narrow = getLLVMStyleWithColumns(11);
2949 EXPECT_EQ("#define A \\\n int i; \\\n int j;",
2950 format("#define A \\\nint i;\\\n int j;", Narrow));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002951 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002952 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002953 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002954 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002955
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002956 FormatStyle AlignLeft = getLLVMStyle();
2957 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
2958 EXPECT_EQ("#define MACRO(x) \\\n"
2959 "private: \\\n"
2960 " int x(int a);\n",
2961 format("#define MACRO(x) \\\n"
2962 "private: \\\n"
2963 " int x(int a);\n",
2964 AlignLeft));
2965
2966 // CRLF line endings
2967 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;",
2968 format("#define A \\\r\nint i;\\\r\n int j;", Narrow));
2969 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
2970 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
2971 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */"));
2972 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
2973 EXPECT_EQ("#define MACRO(x) \\\r\n"
2974 "private: \\\r\n"
2975 " int x(int a);\r\n",
2976 format("#define MACRO(x) \\\r\n"
2977 "private: \\\r\n"
2978 " int x(int a);\r\n",
2979 AlignLeft));
2980
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002981 FormatStyle DontAlign = getLLVMStyle();
2982 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
2983 DontAlign.MaxEmptyLinesToKeep = 3;
2984 // FIXME: can't use verifyFormat here because the newline before
2985 // "public:" is not inserted the first time it's reformatted
2986 EXPECT_EQ("#define A \\\n"
2987 " class Foo { \\\n"
2988 " void bar(); \\\n"
2989 "\\\n"
2990 "\\\n"
2991 "\\\n"
2992 " public: \\\n"
2993 " void baz(); \\\n"
2994 " };",
2995 format("#define A \\\n"
2996 " class Foo { \\\n"
2997 " void bar(); \\\n"
2998 "\\\n"
2999 "\\\n"
3000 "\\\n"
3001 " public: \\\n"
3002 " void baz(); \\\n"
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00003003 " };",
3004 DontAlign));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003005}
3006
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003007TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3008 verifyFormat("#define A \\\n"
3009 " int v( \\\n"
3010 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003011 " int i;",
3012 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003013}
3014
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003015TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00003016 EXPECT_EQ(
3017 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3018 " \\\n"
3019 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3020 "\n"
3021 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3022 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3023 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
3024 "\\\n"
3025 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3026 " \n"
3027 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3028 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003029}
3030
Manuel Klimek52b15152013-01-09 15:25:02 +00003031TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3032 EXPECT_EQ("int\n"
3033 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003034 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003035 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003036 verifyFormat("functionCallTo(\n"
3037 " someOtherFunction(\n"
3038 " withSomeParameters, whichInSequence,\n"
3039 " areLongerThanALine(andAnotherCall,\n"
3040 "#define A B\n"
3041 " withMoreParamters,\n"
3042 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003043 " andMoreParameters),\n"
3044 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003045 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003046 verifyFormat("Foo::Foo()\n"
3047 "#ifdef BAR\n"
3048 " : baz(0)\n"
3049 "#endif\n"
3050 "{\n"
3051 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003052 verifyFormat("void f() {\n"
3053 " if (true)\n"
3054 "#ifdef A\n"
3055 " f(42);\n"
3056 " x();\n"
3057 "#else\n"
3058 " g();\n"
3059 " x();\n"
3060 "#endif\n"
3061 "}");
3062 verifyFormat("void f(param1, param2,\n"
3063 " param3,\n"
3064 "#ifdef A\n"
3065 " param4(param5,\n"
3066 "#ifdef A1\n"
3067 " param6,\n"
3068 "#ifdef A2\n"
3069 " param7),\n"
3070 "#else\n"
3071 " param8),\n"
3072 " param9,\n"
3073 "#endif\n"
3074 " param10,\n"
3075 "#endif\n"
3076 " param11)\n"
3077 "#else\n"
3078 " param12)\n"
3079 "#endif\n"
3080 "{\n"
3081 " x();\n"
3082 "}",
3083 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003084 verifyFormat("#if 1\n"
3085 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003086 verifyFormat("#if 1\n"
3087 "#endif\n"
3088 "#if 1\n"
3089 "#else\n"
3090 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003091 verifyFormat("DEBUG({\n"
3092 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3093 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3094 "});\n"
3095 "#if a\n"
3096 "#else\n"
3097 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003098
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003099 verifyIncompleteFormat("void f(\n"
3100 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00003101 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003102 "#else\n"
3103 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003104}
3105
Manuel Klimek14bd9172014-01-29 08:49:02 +00003106TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3107 verifyFormat("#endif\n"
3108 "#if B");
3109}
3110
Manuel Klimek88033d72013-10-21 08:11:15 +00003111TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3112 FormatStyle SingleLine = getLLVMStyle();
3113 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003114 verifyFormat("#if 0\n"
3115 "#elif 1\n"
3116 "#endif\n"
3117 "void foo() {\n"
3118 " if (test) foo2();\n"
3119 "}",
3120 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003121}
3122
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003123TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003124 verifyFormat("functionCall({ int i; });");
3125 verifyFormat("functionCall({\n"
3126 " int i;\n"
3127 " int j;\n"
3128 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003129 verifyFormat("functionCall(\n"
3130 " {\n"
3131 " int i;\n"
3132 " int j;\n"
3133 " },\n"
3134 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003135 verifyFormat("functionA(functionB({\n"
3136 " int i;\n"
3137 " int j;\n"
3138 " }),\n"
3139 " aaaa, bbbb, cccc);");
3140 verifyFormat("functionCall(\n"
3141 " {\n"
3142 " int i;\n"
3143 " int j;\n"
3144 " },\n"
3145 " aaaa, bbbb, // comment\n"
3146 " cccc);");
3147 verifyFormat("functionA(functionB({\n"
3148 " int i;\n"
3149 " int j;\n"
3150 " }),\n"
3151 " aaaa, bbbb, // comment\n"
3152 " cccc);");
3153 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3154 verifyFormat("functionCall(aaaa, bbbb, {\n"
3155 " int i;\n"
3156 " int j;\n"
3157 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003158 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003159 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003160 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003161 " int i; // break\n"
3162 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003163 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3164 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003165 verifyFormat("DEBUG({\n"
3166 " if (a)\n"
3167 " f();\n"
3168 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003169}
3170
3171TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003172 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003173 "int i;",
3174 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003175}
3176
3177TEST_F(FormatTest, LayoutNestedBlocks) {
3178 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3179 " struct s {\n"
3180 " int i;\n"
3181 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003182 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003183 " for (int i = 0; i < 10; ++i)\n"
3184 " return;\n"
3185 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003186 verifyFormat("call(parameter, {\n"
3187 " something();\n"
3188 " // Comment using all columns.\n"
3189 " somethingelse();\n"
3190 "});",
3191 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003192 verifyFormat("DEBUG( //\n"
3193 " { f(); }, a);");
3194 verifyFormat("DEBUG( //\n"
3195 " {\n"
3196 " f(); //\n"
3197 " },\n"
3198 " a);");
3199
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003200 EXPECT_EQ("call(parameter, {\n"
3201 " something();\n"
3202 " // Comment too\n"
3203 " // looooooooooong.\n"
3204 " somethingElse();\n"
3205 "});",
3206 format("call(parameter, {\n"
3207 " something();\n"
3208 " // Comment too looooooooooong.\n"
3209 " somethingElse();\n"
3210 "});",
3211 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003212 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003213 EXPECT_EQ("DEBUG({ // comment\n"
3214 " int i;\n"
3215 "});",
3216 format("DEBUG({ // comment\n"
3217 "int i;\n"
3218 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003219 EXPECT_EQ("DEBUG({\n"
3220 " int i;\n"
3221 "\n"
3222 " // comment\n"
3223 " int j;\n"
3224 "});",
3225 format("DEBUG({\n"
3226 " int i;\n"
3227 "\n"
3228 " // comment\n"
3229 " int j;\n"
3230 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003231
3232 verifyFormat("DEBUG({\n"
3233 " if (a)\n"
3234 " return;\n"
3235 "});");
3236 verifyGoogleFormat("DEBUG({\n"
3237 " if (a) return;\n"
3238 "});");
3239 FormatStyle Style = getGoogleStyle();
3240 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003241 verifyFormat("Debug(aaaaa,\n"
3242 " {\n"
3243 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3244 " },\n"
3245 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003246 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003247
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003248 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3249
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003250 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003251}
3252
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003253TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3254 EXPECT_EQ("#define MACRO() \\\n"
3255 " Debug(aaa, /* force line break */ \\\n"
3256 " { \\\n"
3257 " int i; \\\n"
3258 " int j; \\\n"
3259 " })",
3260 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3261 " { int i; int j; })",
3262 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003263
3264 EXPECT_EQ("#define A \\\n"
3265 " [] { \\\n"
3266 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3267 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3268 " }",
3269 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3270 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3271 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003272}
3273
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003274TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3275 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003276 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003277 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003278}
3279
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003280TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3281 FormatStyle Style = getLLVMStyle();
3282 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3283 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3284 verifyFormat("FOO_BEGIN\n"
3285 " FOO_ENTRY\n"
3286 "FOO_END", Style);
3287 verifyFormat("FOO_BEGIN\n"
3288 " NESTED_FOO_BEGIN\n"
3289 " NESTED_FOO_ENTRY\n"
3290 " NESTED_FOO_END\n"
3291 "FOO_END", Style);
3292 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3293 " int x;\n"
3294 " x = 1;\n"
3295 "FOO_END(Baz)", Style);
3296}
3297
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003298//===----------------------------------------------------------------------===//
3299// Line break tests.
3300//===----------------------------------------------------------------------===//
3301
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003302TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003303 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003304 "void f() {\n"
3305 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3306 " parameter, parameter, parameter)),\n"
3307 " SecondLongCall(parameter));\n"
3308 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003309 verifyFormat(
3310 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3311 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3312 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3313 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3314 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003315 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3316 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3317 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3318 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003319 verifyFormat(
3320 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3321 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3322 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3323 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003324 verifyFormat("int a = bbbb && ccc &&\n"
3325 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003326 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003327 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003328}
3329
Daniel Jasperd69fc772013-05-08 14:12:04 +00003330TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3331 verifyFormat(
3332 "bool aaaaaaa =\n"
3333 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3334 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003335 verifyFormat(
3336 "bool aaaaaaa =\n"
3337 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3338 " bbbbbbbb();");
3339
Daniel Jasperd69fc772013-05-08 14:12:04 +00003340 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3341 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3342 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003343 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3344 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3345 " ccccccccc == ddddddddddd;");
3346 verifyFormat(
3347 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3348 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3349 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003350
3351 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3352 " aaaaaa) &&\n"
3353 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003354 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3355 " aaaaaa) >>\n"
3356 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003357 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003358 " SourceMgr.getSpellingColumnNumber(\n"
3359 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3360 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003361
Daniel Jasper68d888c2013-06-03 08:42:05 +00003362 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3363 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3364 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00003365 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3366 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3367 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003368 verifyFormat("b = a &&\n"
3369 " // Comment\n"
3370 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003371
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003372 // If the LHS of a comparison is not a binary expression itself, the
3373 // additional linebreak confuses many people.
3374 verifyFormat(
3375 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3376 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3377 "}");
3378 verifyFormat(
3379 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3380 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3381 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003382 verifyFormat(
3383 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3384 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3385 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003386 verifyFormat(
3387 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3389 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003390 // Even explicit parentheses stress the precedence enough to make the
3391 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003392 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3393 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3394 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003395 // This cases is borderline, but with the indentation it is still readable.
3396 verifyFormat(
3397 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3398 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3399 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3400 "}",
3401 getLLVMStyleWithColumns(75));
3402
3403 // If the LHS is a binary expression, we should still use the additional break
3404 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003405 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3406 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3407 " 5) {\n"
3408 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003409 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3410 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3411 " 5) {\n"
3412 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003413
Daniel Jasper571f1af2013-05-14 20:39:56 +00003414 FormatStyle OnePerLine = getLLVMStyle();
3415 OnePerLine.BinPackParameters = false;
3416 verifyFormat(
3417 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3418 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3419 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3420 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003421
3422 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3423 " .aaa(aaaaaaaaaaaaa) *\n"
3424 " aaaaaaa +\n"
3425 " aaaaaaa;",
3426 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003427}
3428
Daniel Jasper6bee6822013-04-08 20:33:42 +00003429TEST_F(FormatTest, ExpressionIndentation) {
3430 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3431 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3432 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3433 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3434 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3435 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3436 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3437 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3438 " ccccccccccccccccccccccccccccccccccccccccc;");
3439 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3440 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3441 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3442 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3443 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3444 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3445 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3446 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3447 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3448 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3449 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3450 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003451 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003452 "} else if (aaaaa && bbbbb > // break\n"
3453 " ccccc) {\n"
3454 "}");
3455 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003456 "} else if (aaaaa &&\n"
3457 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003458 " ccccc &&\n"
3459 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003460 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003461
3462 // Presence of a trailing comment used to change indentation of b.
3463 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3464 " b;\n"
3465 "return aaaaaaaaaaaaaaaaaaa +\n"
3466 " b; //",
3467 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003468}
3469
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003470TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3471 // Not sure what the best system is here. Like this, the LHS can be found
3472 // immediately above an operator (everything with the same or a higher
3473 // indent). The RHS is aligned right of the operator and so compasses
3474 // everything until something with the same indent as the operator is found.
3475 // FIXME: Is this a good system?
3476 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003477 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003478 verifyFormat(
3479 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003480 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3481 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3482 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3483 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3484 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003485 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003486 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3487 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003488 Style);
3489 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003490 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3491 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003492 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3493 Style);
3494 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003495 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3496 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003497 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3498 Style);
3499 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3500 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003501 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3502 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003503 Style);
3504 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003505 "} else if (aaaaa\n"
3506 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003507 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003508 "}",
3509 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003510 verifyFormat("return (a)\n"
3511 " // comment\n"
3512 " + b;",
3513 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003514 verifyFormat(
3515 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3516 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3517 " + cc;",
3518 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003519
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003520 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3521 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3522 Style);
3523
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003524 // Forced by comments.
3525 verifyFormat(
3526 "unsigned ContentSize =\n"
3527 " sizeof(int16_t) // DWARF ARange version number\n"
3528 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3529 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3530 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003531
3532 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3533 " == boost::fusion::at_c<1>(iiii).second;",
3534 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003535
3536 Style.ColumnLimit = 60;
3537 verifyFormat("zzzzzzzzzz\n"
3538 " = bbbbbbbbbbbbbbbbb\n"
3539 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3540 Style);
Jonas Toth4636deb2018-08-24 17:14:31 +00003541
3542 Style.ColumnLimit = 80;
3543 Style.IndentWidth = 4;
3544 Style.TabWidth = 4;
3545 Style.UseTab = FormatStyle::UT_Always;
3546 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3547 Style.AlignOperands = false;
3548 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n"
3549 "\t&& (someOtherLongishConditionPart1\n"
3550 "\t\t|| someOtherEvenLongerNestedConditionPart2);",
3551 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && (someOtherLongishConditionPart1 || someOtherEvenLongerNestedConditionPart2);",
3552 Style));
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003553}
3554
Daniel Jasperb1270392017-02-01 23:27:37 +00003555TEST_F(FormatTest, EnforcedOperatorWraps) {
3556 // Here we'd like to wrap after the || operators, but a comment is forcing an
3557 // earlier wrap.
3558 verifyFormat("bool x = aaaaa //\n"
3559 " || bbbbb\n"
3560 " //\n"
3561 " || cccc;");
3562}
3563
Daniel Jasper3219e432014-12-02 13:24:51 +00003564TEST_F(FormatTest, NoOperandAlignment) {
3565 FormatStyle Style = getLLVMStyle();
3566 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00003567 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3568 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3569 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3570 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003571 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003572 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3573 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3574 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3575 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3576 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3577 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3578 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3579 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3580 " > ccccccccccccccccccccccccccccccccccccccccc;",
3581 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003582
3583 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3584 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3585 " + cc;",
3586 Style);
3587 verifyFormat("int a = aa\n"
3588 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003589 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00003590 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003591
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003592 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003593 verifyFormat("return (a > b\n"
3594 " // comment1\n"
3595 " // comment2\n"
3596 " || c);",
3597 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003598}
3599
Daniel Jasperac043c92014-09-15 11:11:00 +00003600TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3601 FormatStyle Style = getLLVMStyle();
3602 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3603 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3604 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003605 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3606 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003607}
3608
Daniel Jasper988e7e42017-05-08 15:07:52 +00003609TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3610 FormatStyle Style = getLLVMStyle();
3611 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3612 Style.BinPackArguments = false;
3613 Style.ColumnLimit = 40;
3614 verifyFormat("void test() {\n"
3615 " someFunction(\n"
3616 " this + argument + is + quite\n"
3617 " + long + so + it + gets + wrapped\n"
3618 " + but + remains + bin - packed);\n"
3619 "}",
3620 Style);
3621 verifyFormat("void test() {\n"
3622 " someFunction(arg1,\n"
3623 " this + argument + is\n"
3624 " + quite + long + so\n"
3625 " + it + gets + wrapped\n"
3626 " + but + remains + bin\n"
3627 " - packed,\n"
3628 " arg3);\n"
3629 "}",
3630 Style);
3631 verifyFormat("void test() {\n"
3632 " someFunction(\n"
3633 " arg1,\n"
3634 " this + argument + has\n"
3635 " + anotherFunc(nested,\n"
3636 " calls + whose\n"
3637 " + arguments\n"
3638 " + are + also\n"
3639 " + wrapped,\n"
3640 " in + addition)\n"
3641 " + to + being + bin - packed,\n"
3642 " arg3);\n"
3643 "}",
3644 Style);
3645
3646 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3647 verifyFormat("void test() {\n"
3648 " someFunction(\n"
3649 " arg1,\n"
3650 " this + argument + has +\n"
3651 " anotherFunc(nested,\n"
3652 " calls + whose +\n"
3653 " arguments +\n"
3654 " are + also +\n"
3655 " wrapped,\n"
3656 " in + addition) +\n"
3657 " to + being + bin - packed,\n"
3658 " arg3);\n"
3659 "}",
3660 Style);
3661}
3662
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003663TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003664 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003665 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3666 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003667 verifyFormat("Constructor()\n"
3668 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003669 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003670 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003671 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003672 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003673
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003674 verifyFormat("template <typename T>\n"
3675 "Constructor() : Initializer(FitsOnTheLine) {}",
3676 getLLVMStyleWithColumns(45));
3677
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003678 verifyFormat(
3679 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003680 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003681
3682 verifyFormat(
3683 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003684 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003685 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003686 verifyFormat(
3687 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003688 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003689 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003690 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3691 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3692 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003693
3694 verifyFormat("Constructor()\n"
3695 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3696 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3697 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003698 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003699
Daniel Jasper65585ed2013-01-28 13:31:35 +00003700 verifyFormat("Constructor()\n"
3701 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003703
Daniel Jasper62e68172013-02-25 15:59:54 +00003704 verifyFormat("Constructor(int Parameter = 0)\n"
3705 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3706 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003707 verifyFormat("Constructor()\n"
3708 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3709 "}",
3710 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003711 verifyFormat("Constructor()\n"
3712 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3713 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003714
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003715 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003716 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003717 verifyFormat("Constructor()\n"
3718 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3719 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3720 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003721
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003722 FormatStyle OnePerLine = getLLVMStyle();
3723 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003724 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003725 verifyFormat("SomeClass::Constructor()\n"
3726 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3727 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003728 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003729 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003730 verifyFormat("SomeClass::Constructor()\n"
3731 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3732 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003733 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003734 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003735 verifyFormat("MyClass::MyClass(int var)\n"
3736 " : some_var_(var), // 4 space indent\n"
3737 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003738 "}",
3739 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003740 verifyFormat("Constructor()\n"
3741 " : aaaaa(aaaaaa),\n"
3742 " aaaaa(aaaaaa),\n"
3743 " aaaaa(aaaaaa),\n"
3744 " aaaaa(aaaaaa),\n"
3745 " aaaaa(aaaaaa) {}",
3746 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003747 verifyFormat("Constructor()\n"
3748 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3749 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3750 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003751 OnePerLine.BinPackParameters = false;
3752 verifyFormat(
3753 "Constructor()\n"
3754 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3755 " aaaaaaaaaaa().aaa(),\n"
3756 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3757 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003758 OnePerLine.ColumnLimit = 60;
3759 verifyFormat("Constructor()\n"
3760 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3761 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3762 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003763
3764 EXPECT_EQ("Constructor()\n"
3765 " : // Comment forcing unwanted break.\n"
3766 " aaaa(aaaa) {}",
3767 format("Constructor() :\n"
3768 " // Comment forcing unwanted break.\n"
3769 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003770}
3771
Francois Ferranda6b6d512017-05-24 11:36:58 +00003772TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3773 FormatStyle Style = getLLVMStyle();
3774 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3775
3776 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3777 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3778 getStyleWithColumns(Style, 45));
3779 verifyFormat("Constructor() :\n"
3780 " Initializer(FitsOnTheLine) {}",
3781 getStyleWithColumns(Style, 44));
3782 verifyFormat("Constructor() :\n"
3783 " Initializer(FitsOnTheLine) {}",
3784 getStyleWithColumns(Style, 43));
3785
3786 verifyFormat("template <typename T>\n"
3787 "Constructor() : Initializer(FitsOnTheLine) {}",
3788 getStyleWithColumns(Style, 50));
3789
3790 verifyFormat(
3791 "SomeClass::Constructor() :\n"
3792 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3793 Style);
3794
3795 verifyFormat(
3796 "SomeClass::Constructor() :\n"
3797 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3798 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3799 Style);
3800 verifyFormat(
3801 "SomeClass::Constructor() :\n"
3802 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3803 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3804 Style);
3805 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3806 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3807 " aaaaaaaaaa(aaaaaa) {}",
3808 Style);
3809
3810 verifyFormat("Constructor() :\n"
3811 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3812 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3813 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3814 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3815 Style);
3816
3817 verifyFormat("Constructor() :\n"
3818 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3819 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3820 Style);
3821
3822 verifyFormat("Constructor(int Parameter = 0) :\n"
3823 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3824 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3825 Style);
3826 verifyFormat("Constructor() :\n"
3827 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3828 "}",
3829 getStyleWithColumns(Style, 60));
3830 verifyFormat("Constructor() :\n"
3831 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3832 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3833 Style);
3834
3835 // Here a line could be saved by splitting the second initializer onto two
3836 // lines, but that is not desirable.
3837 verifyFormat("Constructor() :\n"
3838 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3839 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3840 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3841 Style);
3842
3843 FormatStyle OnePerLine = Style;
3844 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3845 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3846 verifyFormat("SomeClass::Constructor() :\n"
3847 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3848 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3849 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3850 OnePerLine);
3851 verifyFormat("SomeClass::Constructor() :\n"
3852 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3853 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3854 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3855 OnePerLine);
3856 verifyFormat("MyClass::MyClass(int var) :\n"
3857 " some_var_(var), // 4 space indent\n"
3858 " some_other_var_(var + 1) { // lined up\n"
3859 "}",
3860 OnePerLine);
3861 verifyFormat("Constructor() :\n"
3862 " aaaaa(aaaaaa),\n"
3863 " aaaaa(aaaaaa),\n"
3864 " aaaaa(aaaaaa),\n"
3865 " aaaaa(aaaaaa),\n"
3866 " aaaaa(aaaaaa) {}",
3867 OnePerLine);
3868 verifyFormat("Constructor() :\n"
3869 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3870 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3871 OnePerLine);
3872 OnePerLine.BinPackParameters = false;
3873 verifyFormat(
3874 "Constructor() :\n"
3875 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3876 " aaaaaaaaaaa().aaa(),\n"
3877 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3878 OnePerLine);
3879 OnePerLine.ColumnLimit = 60;
3880 verifyFormat("Constructor() :\n"
3881 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3882 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3883 OnePerLine);
3884
3885 EXPECT_EQ("Constructor() :\n"
3886 " // Comment forcing unwanted break.\n"
3887 " aaaa(aaaa) {}",
3888 format("Constructor() :\n"
3889 " // Comment forcing unwanted break.\n"
3890 " aaaa(aaaa) {}",
3891 Style));
3892
3893 Style.ColumnLimit = 0;
3894 verifyFormat("SomeClass::Constructor() :\n"
3895 " a(a) {}",
3896 Style);
3897 verifyFormat("SomeClass::Constructor() noexcept :\n"
3898 " a(a) {}",
3899 Style);
3900 verifyFormat("SomeClass::Constructor() :\n"
3901 " a(a), b(b), c(c) {}",
3902 Style);
3903 verifyFormat("SomeClass::Constructor() :\n"
3904 " a(a) {\n"
3905 " foo();\n"
3906 " bar();\n"
3907 "}",
3908 Style);
3909
3910 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3911 verifyFormat("SomeClass::Constructor() :\n"
3912 " a(a), b(b), c(c) {\n"
3913 "}",
3914 Style);
3915 verifyFormat("SomeClass::Constructor() :\n"
3916 " a(a) {\n"
3917 "}",
3918 Style);
3919
3920 Style.ColumnLimit = 80;
3921 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3922 Style.ConstructorInitializerIndentWidth = 2;
3923 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3924 Style);
3925 verifyFormat("SomeClass::Constructor() :\n"
3926 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3927 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3928 Style);
Francois Ferrand6bb103f2018-06-11 14:41:26 +00003929
3930 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as well
3931 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
3932 verifyFormat("class SomeClass\n"
3933 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3934 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
3935 Style);
3936 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
3937 verifyFormat("class SomeClass\n"
3938 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3939 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
3940 Style);
3941 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon;
3942 verifyFormat("class SomeClass :\n"
3943 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3944 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
3945 Style);
Francois Ferranda6b6d512017-05-24 11:36:58 +00003946}
3947
David Blaikieea95dd72017-08-31 18:49:34 +00003948#ifndef EXPENSIVE_CHECKS
3949// Expensive checks enables libstdc++ checking which includes validating the
3950// state of ranges used in std::priority_queue - this blows out the
3951// runtime/scalability of the function and makes this test unacceptably slow.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003952TEST_F(FormatTest, MemoizationTests) {
3953 // This breaks if the memoization lookup does not take \c Indent and
3954 // \c LastSpace into account.
3955 verifyFormat(
3956 "extern CFRunLoopTimerRef\n"
3957 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3958 " CFTimeInterval interval, CFOptionFlags flags,\n"
3959 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003960 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003961
3962 // Deep nesting somewhat works around our memoization.
3963 verifyFormat(
3964 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3965 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3966 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3967 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3968 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3969 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003970 verifyFormat(
3971 "aaaaa(\n"
3972 " aaaaa,\n"
3973 " aaaaa(\n"
3974 " aaaaa,\n"
3975 " aaaaa(\n"
3976 " aaaaa,\n"
3977 " aaaaa(\n"
3978 " aaaaa,\n"
3979 " aaaaa(\n"
3980 " aaaaa,\n"
3981 " aaaaa(\n"
3982 " aaaaa,\n"
3983 " aaaaa(\n"
3984 " aaaaa,\n"
3985 " aaaaa(\n"
3986 " aaaaa,\n"
3987 " aaaaa(\n"
3988 " aaaaa,\n"
3989 " aaaaa(\n"
3990 " aaaaa,\n"
3991 " aaaaa(\n"
3992 " aaaaa,\n"
3993 " aaaaa(\n"
3994 " aaaaa,\n"
3995 " aaaaa))))))))))));",
3996 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003997 verifyFormat(
3998 "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"
3999 " a),\n"
4000 " a),\n"
4001 " a),\n"
4002 " a),\n"
4003 " a),\n"
4004 " a),\n"
4005 " a),\n"
4006 " a),\n"
4007 " a),\n"
4008 " a),\n"
4009 " a),\n"
4010 " a),\n"
4011 " a),\n"
4012 " a),\n"
4013 " a),\n"
4014 " a),\n"
4015 " a)",
4016 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00004017
4018 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004019 FormatStyle OnePerLine = getLLVMStyle();
4020 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004021 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00004022 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00004023 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00004024 for (unsigned i = 0, e = 80; i != e; ++i) {
4025 input += " a,\n";
4026 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004027 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004028 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004029}
David Blaikieea95dd72017-08-31 18:49:34 +00004030#endif
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004031
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004032TEST_F(FormatTest, BreaksAsHighAsPossible) {
4033 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004034 "void f() {\n"
4035 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4036 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4037 " f();\n"
4038 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00004039 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004040 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004041}
4042
Daniel Jasper6728fc12013-04-11 14:29:13 +00004043TEST_F(FormatTest, BreaksFunctionDeclarations) {
4044 // Principially, we break function declarations in a certain order:
4045 // 1) break amongst arguments.
4046 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4047 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004048 verifyFormat("template <class TemplateIt>\n"
4049 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4050 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00004051
4052 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00004053 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004054 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004055 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004056 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004057
4058 // 3) break after (.
4059 verifyFormat(
4060 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00004061 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4062 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004063
4064 // 4) break before after nested name specifiers.
4065 verifyFormat(
4066 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004067 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4068 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004069 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004070
4071 // However, there are exceptions, if a sufficient amount of lines can be
4072 // saved.
4073 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4074 // more adjusting.
4075 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4076 " Cccccccccccccc cccccccccc,\n"
4077 " Cccccccccccccc cccccccccc,\n"
4078 " Cccccccccccccc cccccccccc,\n"
4079 " Cccccccccccccc cccccccccc);");
4080 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004081 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004082 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4083 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4084 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004085 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004086 verifyFormat(
4087 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4088 " Cccccccccccccc cccccccccc,\n"
4089 " Cccccccccccccc cccccccccc,\n"
4090 " Cccccccccccccc cccccccccc,\n"
4091 " Cccccccccccccc cccccccccc,\n"
4092 " Cccccccccccccc cccccccccc,\n"
4093 " Cccccccccccccc cccccccccc);");
4094 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4095 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4096 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4097 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4098 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00004099
4100 // Break after multi-line parameters.
4101 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4102 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4103 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4104 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00004105 verifyFormat("void SomeLoooooooooooongFunction(\n"
4106 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4107 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4108 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004109
4110 // Treat overloaded operators like other functions.
4111 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4112 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00004113 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4114 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00004115 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4116 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4117 verifyGoogleFormat(
4118 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4119 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004120 verifyGoogleFormat(
4121 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4122 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00004123 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4124 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4125 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4126 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00004127 verifyGoogleFormat(
4128 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4129 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4130 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00004131 verifyGoogleFormat(
4132 "template <typename T>\n"
4133 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4134 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4135 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00004136
4137 FormatStyle Style = getLLVMStyle();
4138 Style.PointerAlignment = FormatStyle::PAS_Left;
4139 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4140 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4141 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004142 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4143 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4144 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00004145}
4146
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004147TEST_F(FormatTest, TrailingReturnType) {
4148 verifyFormat("auto foo() -> int;\n");
4149 verifyFormat("struct S {\n"
4150 " auto bar() const -> int;\n"
4151 "};");
4152 verifyFormat("template <size_t Order, typename T>\n"
4153 "auto load_img(const std::string &filename)\n"
4154 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00004155 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4156 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00004157 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00004158 verifyFormat("template <typename T>\n"
4159 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4160 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00004161
4162 // Not trailing return types.
4163 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004164}
4165
Daniel Jasper5be31f72013-05-21 09:16:31 +00004166TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004167 // Avoid breaking before trailing 'const' or other trailing annotations, if
4168 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00004169 FormatStyle Style = getGoogleStyle();
4170 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00004171 verifyFormat("void someLongFunction(\n"
4172 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00004173 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00004174 verifyFormat("LoooooongReturnType\n"
4175 "someLoooooooongFunction() const {}",
4176 getLLVMStyleWithColumns(47));
4177 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4178 " const {}",
4179 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004180 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4181 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4182 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4183 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4184 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4185 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00004186 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4187 " aaaaaaaaaaa aaaaa) const override;");
4188 verifyGoogleFormat(
4189 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4190 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004191
Daniel Jasper5550de62014-02-17 07:57:46 +00004192 // Even if the first parameter has to be wrapped.
4193 verifyFormat("void someLongFunction(\n"
4194 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004195 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00004196 verifyFormat("void someLongFunction(\n"
4197 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004198 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00004199 verifyFormat("void someLongFunction(\n"
4200 " int someLongParameter) override {}",
4201 Style);
4202 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004203 " int someLongParameter) OVERRIDE {}",
4204 Style);
4205 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004206 " int someLongParameter) final {}",
4207 Style);
4208 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004209 " int someLongParameter) FINAL {}",
4210 Style);
4211 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004212 " int parameter) const override {}",
4213 Style);
4214
Daniel Jaspere3f907f2014-06-02 09:52:08 +00004215 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4216 verifyFormat("void someLongFunction(\n"
4217 " int someLongParameter) const\n"
4218 "{\n"
4219 "}",
4220 Style);
4221
Daniel Jasper5550de62014-02-17 07:57:46 +00004222 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004223 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4224 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4225 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00004226
4227 // Breaking before function-like trailing annotations is fine to keep them
4228 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004229 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4230 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4231 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4232 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4233 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4234 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004235 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4236 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004237 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004238
4239 verifyFormat(
4240 "void aaaaaaaaaaaaaaaaaa()\n"
4241 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4242 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4243 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4244 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004245 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004246 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004247 " GUARDED_BY(aaaaaaaaaaaa);");
4248 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004249 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004250 " GUARDED_BY(aaaaaaaaaaaa);");
4251 verifyGoogleFormat(
4252 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4253 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004254 verifyGoogleFormat(
4255 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4256 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004257}
4258
Daniel Jasperf090f032015-05-18 09:47:22 +00004259TEST_F(FormatTest, FunctionAnnotations) {
4260 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004261 "int OldFunction(const string &parameter) {}");
4262 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004263 "string OldFunction(const string &parameter) {}");
4264 verifyFormat("template <typename T>\n"
4265 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4266 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004267
4268 // Not function annotations.
4269 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4270 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004271 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4272 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004273 verifyFormat("MACRO(abc).function() // wrap\n"
4274 " << abc;");
4275 verifyFormat("MACRO(abc)->function() // wrap\n"
4276 " << abc;");
4277 verifyFormat("MACRO(abc)::function() // wrap\n"
4278 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004279}
4280
Daniel Jasperf7935112012-12-03 18:12:45 +00004281TEST_F(FormatTest, BreaksDesireably) {
4282 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4283 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004284 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004285 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4286 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4287 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004288
4289 verifyFormat(
4290 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004292
4293 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4294 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4295 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004296
4297 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004298 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4299 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4300 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004301 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4302 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004303
4304 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4305 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4306
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004307 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004308 "void f() {\n"
4309 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4310 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4311 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004312 verifyFormat(
4313 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4314 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4315 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004316 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4317 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4318 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004319 "aaaaaa(aaa,\n"
4320 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004321 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4322 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004323 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4324 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4325 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004326
Daniel Jasper739b85f2015-06-29 10:42:59 +00004327 // Indent consistently independent of call expression and unary operator.
4328 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4329 " dddddddddddddddddddddddddddddd));");
4330 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4331 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004332 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004333 " dddddddddddddddddddddddddddddd));");
4334
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004335 // This test case breaks on an incorrect memoization, i.e. an optimization not
4336 // taking into account the StopAt value.
4337 verifyFormat(
4338 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004339 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4340 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4341 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004342
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004343 verifyFormat("{\n {\n {\n"
4344 " Annotation.SpaceRequiredBefore =\n"
4345 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4346 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4347 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004348
4349 // Break on an outer level if there was a break on an inner level.
4350 EXPECT_EQ("f(g(h(a, // comment\n"
4351 " b, c),\n"
4352 " d, e),\n"
4353 " x, y);",
4354 format("f(g(h(a, // comment\n"
4355 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004356
4357 // Prefer breaking similar line breaks.
4358 verifyFormat(
4359 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4360 " NSTrackingMouseEnteredAndExited |\n"
4361 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004362}
4363
Daniel Jasper18210d72014-10-09 09:52:05 +00004364TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4365 FormatStyle NoBinPacking = getGoogleStyle();
4366 NoBinPacking.BinPackParameters = false;
4367 NoBinPacking.BinPackArguments = true;
4368 verifyFormat("void f() {\n"
4369 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4370 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4371 "}",
4372 NoBinPacking);
4373 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4374 " int aaaaaaaaaaaaaaaaaaaa,\n"
4375 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4376 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004377
Daniel Jasper00693b082016-01-09 15:56:47 +00004378 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4379 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4380 " vector<int> bbbbbbbbbbbbbbb);",
4381 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004382 // FIXME: This behavior difference is probably not wanted. However, currently
4383 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4384 // template arguments from BreakBeforeParameter being set because of the
4385 // one-per-line formatting.
4386 verifyFormat(
4387 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4388 " aaaaaaaaaa> aaaaaaaaaa);",
4389 NoBinPacking);
4390 verifyFormat(
4391 "void fffffffffff(\n"
4392 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4393 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004394}
4395
Daniel Jasper9278eb92013-01-16 14:59:02 +00004396TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004397 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004398 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004399 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004400 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4401 " aaaaaaaaaaaaaaaaaaaa,\n"
4402 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4403 NoBinPacking);
4404 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4405 " aaaaaaaaaaaaa,\n"
4406 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4407 NoBinPacking);
4408 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004409 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4410 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4411 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4412 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004413 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4414 NoBinPacking);
4415 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4416 " .aaaaaaaaaaaaaaaaaa();",
4417 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004418 verifyFormat("void f() {\n"
4419 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4420 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4421 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004422 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004423
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004424 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004425 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4426 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004427 " aaaaaaaaaaaa);",
4428 NoBinPacking);
4429 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004430 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4431 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004432 " test);",
4433 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004434
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004435 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4436 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004437 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4438 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004439 NoBinPacking);
4440 verifyFormat("a(\"a\"\n"
4441 " \"a\",\n"
4442 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004443
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004444 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004445 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004446 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004447 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004448 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004449 verifyFormat(
4450 "void f() {\n"
4451 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4452 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004453 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004454 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004455 verifyFormat(
4456 "template <class SomeType, class SomeOtherType>\n"
4457 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4458 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004459}
4460
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004461TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4462 FormatStyle Style = getLLVMStyleWithColumns(15);
4463 Style.ExperimentalAutoDetectBinPacking = true;
4464 EXPECT_EQ("aaa(aaaa,\n"
4465 " aaaa,\n"
4466 " aaaa);\n"
4467 "aaa(aaaa,\n"
4468 " aaaa,\n"
4469 " aaaa);",
4470 format("aaa(aaaa,\n" // one-per-line
4471 " aaaa,\n"
4472 " aaaa );\n"
4473 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4474 Style));
4475 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4476 " aaaa);\n"
4477 "aaa(aaaa, aaaa,\n"
4478 " aaaa);",
4479 format("aaa(aaaa, aaaa,\n" // bin-packed
4480 " aaaa );\n"
4481 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4482 Style));
4483}
4484
Daniel Jasper04468962013-01-18 10:56:38 +00004485TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004486 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4487 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4488 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4489 " .StartsWith(\".init\", ORDER_INIT)\n"
4490 " .StartsWith(\".fini\", ORDER_FINI)\n"
4491 " .StartsWith(\".hash\", ORDER_HASH)\n"
4492 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004493
Daniel Jaspereb50c672013-02-15 20:33:06 +00004494 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004495 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004496 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004497 "aaaaaaa->aaaaaaa\n"
4498 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4499 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004500 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004501 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004502 "aaaaaaa->aaaaaaa\n"
4503 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4504 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4505 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004506 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004507 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004508 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004509 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4510 " aaaaaa->aaaaaaaaaaaa()\n"
4511 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004512 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004513 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004514 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004515 "void f() {\n"
4516 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004517 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004518 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004519 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004520 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004521 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004522 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004523 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004524 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004525 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004526 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004527 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004528
4529 verifyFormat(
4530 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4531 verifyFormat("aaaaaaaaaaaaaaa()\n"
4532 " .aaaaaaaaaaaaaaa()\n"
4533 " .aaaaaaaaaaaaaaa()\n"
4534 " .aaaaaaaaaaaaaaa()\n"
4535 " .aaaaaaaaaaaaaaa();");
4536 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4537 " .aaaaaaaaaaaaaaa()\n"
4538 " .aaaaaaaaaaaaaaa()\n"
4539 " .aaaaaaaaaaaaaaa();");
4540 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4541 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4542 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004543 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4544 " ->aaaaaaaaaaaaaae(0)\n"
4545 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004546
Daniel Jasper775954b2015-04-24 10:08:09 +00004547 // Don't linewrap after very short segments.
4548 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4549 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4550 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4551 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4552 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4553 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4554 verifyFormat("aaa()\n"
4555 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4556 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4557 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4558
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004559 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4560 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4561 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4562 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4563 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004564 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004565
Daniel Jaspera41aa532014-09-19 08:01:25 +00004566 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004567 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4568 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004569
4570 // Prefer not to create "hanging" indents.
4571 verifyFormat(
4572 "return !soooooooooooooome_map\n"
4573 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4574 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004575 verifyFormat(
4576 "return aaaaaaaaaaaaaaaa\n"
4577 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4578 " .aaaa(aaaaaaaaaaaaaa);");
4579 // No hanging indent here.
4580 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4581 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4582 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4583 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004584 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4585 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4586 getLLVMStyleWithColumns(60));
4587 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4588 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4589 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4590 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004591 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4592 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4593 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Ilya Biryukov370eff82018-09-17 07:46:20 +00004594
4595 // Dont break if only closing statements before member call
4596 verifyFormat("test() {\n"
4597 " ([]() -> {\n"
4598 " int b = 32;\n"
4599 " return 3;\n"
4600 " }).foo();\n"
4601 "}");
4602 verifyFormat("test() {\n"
4603 " (\n"
4604 " []() -> {\n"
4605 " int b = 32;\n"
4606 " return 3;\n"
4607 " },\n"
4608 " foo, bar)\n"
4609 " .foo();\n"
4610 "}");
4611 verifyFormat("test() {\n"
4612 " ([]() -> {\n"
4613 " int b = 32;\n"
4614 " return 3;\n"
4615 " })\n"
4616 " .foo()\n"
4617 " .bar();\n"
4618 "}");
4619 verifyFormat("test() {\n"
4620 " ([]() -> {\n"
4621 " int b = 32;\n"
4622 " return 3;\n"
4623 " })\n"
4624 " .foo(\"aaaaaaaaaaaaaaaaa\"\n"
4625 " \"bbbb\");\n"
4626 "}",
4627 getLLVMStyleWithColumns(30));
Daniel Jasper04468962013-01-18 10:56:38 +00004628}
4629
Daniel Jasperde5c2072012-12-24 00:13:23 +00004630TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4631 verifyFormat(
4632 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004633 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004634 verifyFormat(
4635 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4636 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4637
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004638 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004639 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004640 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4641 " ccccccccccccccccccccccccc) {\n}");
4642
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004643 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004644 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004645 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4646 " ccccccccccccccccccccccccc) {\n}");
4647
Daniel Jasperde5c2072012-12-24 00:13:23 +00004648 verifyFormat(
4649 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004650 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004651 verifyFormat(
4652 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4653 " ccccccccccccccccccccccccc) {\n}");
4654
Daniel Jasper400adc62013-02-08 15:28:42 +00004655 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4656 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4657 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4658 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004659 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4660 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4661 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4662 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4663
Daniel Jasper400adc62013-02-08 15:28:42 +00004664 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4665 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4666 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004667 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4668 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4669 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004670}
4671
Daniel Jasper43b65482013-01-23 12:27:43 +00004672TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004673 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004674 "unsigned Cost =\n"
4675 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4676 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004677 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004678 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4679 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004680
4681 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004682 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4683 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004684 verifyFormat("unsigned OriginalStartColumn =\n"
4685 " SourceMgr.getSpellingColumnNumber(\n"
4686 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4687 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004688}
4689
Francois Ferrand9976efa2017-05-22 08:28:17 +00004690TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4691 FormatStyle Style = getLLVMStyle();
4692 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4693 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4694 Style);
4695
4696 Style.PenaltyBreakAssignment = 20;
4697 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4698 " cccccccccccccccccccccccccc;",
4699 Style);
4700}
4701
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004702TEST_F(FormatTest, AlignsAfterAssignments) {
4703 verifyFormat(
4704 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004705 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004706 verifyFormat(
4707 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004708 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004709 verifyFormat(
4710 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004711 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004712 verifyFormat(
4713 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004714 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004715 verifyFormat(
4716 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4717 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4718 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004719}
4720
4721TEST_F(FormatTest, AlignsAfterReturn) {
4722 verifyFormat(
4723 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4724 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4725 verifyFormat(
4726 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4727 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004728 verifyFormat(
4729 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004730 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004731 verifyFormat(
4732 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004733 " aaaaaaaaaaaaaaaaaaaaaa());");
4734 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4735 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4736 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4737 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4738 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004739 verifyFormat("return\n"
4740 " // true if code is one of a or b.\n"
4741 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004742}
4743
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004744TEST_F(FormatTest, AlignsAfterOpenBracket) {
4745 verifyFormat(
4746 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4747 " aaaaaaaaa aaaaaaa) {}");
4748 verifyFormat(
4749 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4750 " aaaaaaaaaaa aaaaaaaaa);");
4751 verifyFormat(
4752 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4753 " aaaaaaaaaaaaaaaaaaaaa));");
4754 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004755 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004756 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4757 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4758 Style);
4759 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4760 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4761 Style);
4762 verifyFormat("SomeLongVariableName->someFunction(\n"
4763 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4764 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004765 verifyFormat(
4766 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4767 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4768 Style);
4769 verifyFormat(
4770 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4771 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4772 Style);
4773 verifyFormat(
4774 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4775 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4776 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004777
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004778 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4779 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4780 " b));",
4781 Style);
4782
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004783 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4784 Style.BinPackArguments = false;
4785 Style.BinPackParameters = false;
4786 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4787 " aaaaaaaaaaa aaaaaaaa,\n"
4788 " aaaaaaaaa aaaaaaa,\n"
4789 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4790 Style);
4791 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4792 " aaaaaaaaaaa aaaaaaaaa,\n"
4793 " aaaaaaaaaaa aaaaaaaaa,\n"
4794 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4795 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004796 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4797 " aaaaaaaaaaaaaaa,\n"
4798 " aaaaaaaaaaaaaaaaaaaaa,\n"
4799 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004800 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004801 verifyFormat(
4802 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4803 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4804 Style);
4805 verifyFormat(
4806 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4807 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4808 Style);
4809 verifyFormat(
4810 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4811 " aaaaaaaaaaaaaaaaaaaaa(\n"
4812 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4813 " aaaaaaaaaaaaaaaa);",
4814 Style);
4815 verifyFormat(
4816 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4817 " aaaaaaaaaaaaaaaaaaaaa(\n"
4818 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4819 " aaaaaaaaaaaaaaaa);",
4820 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004821}
4822
Daniel Jasper3219e432014-12-02 13:24:51 +00004823TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4824 FormatStyle Style = getLLVMStyleWithColumns(40);
4825 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4826 " bbbbbbbbbbbbbbbbbbbbbb);",
4827 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004828 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004829 Style.AlignOperands = false;
4830 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4831 " bbbbbbbbbbbbbbbbbbbbbb);",
4832 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004833 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004834 Style.AlignOperands = true;
4835 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4836 " bbbbbbbbbbbbbbbbbbbbbb);",
4837 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004838 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004839 Style.AlignOperands = false;
4840 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4841 " bbbbbbbbbbbbbbbbbbbbbb);",
4842 Style);
4843}
4844
Daniel Jasper399d24b2013-01-09 07:06:56 +00004845TEST_F(FormatTest, BreaksConditionalExpressions) {
4846 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004847 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4848 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4849 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4850 verifyFormat(
4851 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004852 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4853 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004854 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004855 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4856 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4857 verifyFormat(
4858 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004859 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4860 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004861 verifyFormat(
4862 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4863 " : aaaaaaaaaaaaa);");
4864 verifyFormat(
4865 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004866 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004867 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4868 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004869 verifyFormat(
4870 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4871 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4872 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004873 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4874 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4875 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4876 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4877 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4878 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4879 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4880 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4881 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4882 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4883 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4884 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004885 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4886 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4887 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4888 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4889 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004890 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4891 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4892 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004893 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4894 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4895 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4896 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004897 verifyFormat(
4898 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4899 " ? aaaaaaaaaaaaaaa\n"
4900 " : aaaaaaaaaaaaaaa;");
4901 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004902 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004903 " ? b\n"
4904 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004905 verifyFormat("return aaaa == bbbb\n"
4906 " // comment\n"
4907 " ? aaaa\n"
4908 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004909 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004910 " format(TheLine.First,\n"
4911 " IndentForLevel[TheLine.Level] >= 0\n"
4912 " ? IndentForLevel[TheLine.Level]\n"
4913 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004914 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004915 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004916 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4917 " ? aaaaaaaaaaaaaaa\n"
4918 " : bbbbbbbbbbbbbbb //\n"
4919 " ? ccccccccccccccc\n"
4920 " : ddddddddddddddd;");
4921 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4922 " ? aaaaaaaaaaaaaaa\n"
4923 " : (bbbbbbbbbbbbbbb //\n"
4924 " ? ccccccccccccccc\n"
4925 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004926 verifyFormat(
4927 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4928 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4929 " aaaaaaaaaaaaaaaaaaaaa +\n"
4930 " aaaaaaaaaaaaaaaaaaaaa\n"
4931 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004932 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004933 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4934 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4935 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004936
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004937 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004938 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004939 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004940 "void f() {\n"
4941 " g(aaa,\n"
4942 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4943 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4944 " ? aaaaaaaaaaaaaaa\n"
4945 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004946 "}",
4947 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004948 verifyFormat(
4949 "void f() {\n"
4950 " g(aaa,\n"
4951 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4952 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4953 " ?: aaaaaaaaaaaaaaa);\n"
4954 "}",
4955 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004956
4957 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4958 " // comment.\n"
4959 " ccccccccccccccccccccccccccccccccccccccc\n"
4960 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4961 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004962
4963 // Assignments in conditional expressions. Apparently not uncommon :-(.
4964 verifyFormat("return a != b\n"
4965 " // comment\n"
4966 " ? a = b\n"
4967 " : a = b;");
4968 verifyFormat("return a != b\n"
4969 " // comment\n"
4970 " ? a = a != b\n"
4971 " // comment\n"
4972 " ? a = b\n"
4973 " : a\n"
4974 " : a;\n");
4975 verifyFormat("return a != b\n"
4976 " // comment\n"
4977 " ? a\n"
4978 " : a = a != b\n"
4979 " // comment\n"
4980 " ? a = b\n"
4981 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004982}
4983
Daniel Jasper165b29e2013-11-08 00:57:11 +00004984TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4985 FormatStyle Style = getLLVMStyle();
4986 Style.BreakBeforeTernaryOperators = false;
4987 Style.ColumnLimit = 70;
4988 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004989 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4990 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4991 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4992 Style);
4993 verifyFormat(
4994 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004995 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4996 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004997 Style);
4998 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004999 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5000 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5001 Style);
5002 verifyFormat(
5003 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005004 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5005 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005006 Style);
5007 verifyFormat(
5008 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5009 " aaaaaaaaaaaaa);",
5010 Style);
5011 verifyFormat(
5012 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5013 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5014 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5015 " aaaaaaaaaaaaa);",
5016 Style);
5017 verifyFormat(
5018 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5019 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5020 " aaaaaaaaaaaaa);",
5021 Style);
5022 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5023 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5024 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5025 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5026 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5027 Style);
5028 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5029 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5030 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5031 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5032 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5033 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5034 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5035 Style);
5036 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5037 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5038 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5039 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5040 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5041 Style);
5042 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5043 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5044 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5045 Style);
5046 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00005047 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00005048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5049 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5050 Style);
5051 verifyFormat(
5052 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5053 " aaaaaaaaaaaaaaa :\n"
5054 " aaaaaaaaaaaaaaa;",
5055 Style);
5056 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5057 " aaaaaaaaa ?\n"
5058 " b :\n"
5059 " c);",
5060 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00005061 verifyFormat("unsigned Indent =\n"
5062 " format(TheLine.First,\n"
5063 " IndentForLevel[TheLine.Level] >= 0 ?\n"
5064 " IndentForLevel[TheLine.Level] :\n"
5065 " TheLine * 2,\n"
5066 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
5067 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005068 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5069 " aaaaaaaaaaaaaaa :\n"
5070 " bbbbbbbbbbbbbbb ? //\n"
5071 " ccccccccccccccc :\n"
5072 " ddddddddddddddd;",
5073 Style);
5074 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5075 " aaaaaaaaaaaaaaa :\n"
5076 " (bbbbbbbbbbbbbbb ? //\n"
5077 " ccccccccccccccc :\n"
5078 " ddddddddddddddd);",
5079 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00005080 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5081 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5082 " ccccccccccccccccccccccccccc;",
5083 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00005084 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5085 " aaaaa :\n"
5086 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
5087 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005088}
5089
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005090TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5091 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5092 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5093 verifyFormat("bool a = true, b = false;");
5094
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005095 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005096 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005097 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00005098 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005099 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00005100 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005101 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00005102 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00005103 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5104 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5105 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5106 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5107 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5108 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005109
Daniel Jasperbea1ab42015-03-01 18:55:26 +00005110 FormatStyle Style = getGoogleStyle();
5111 Style.PointerAlignment = FormatStyle::PAS_Left;
5112 Style.DerivePointerAlignment = false;
5113 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5114 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5115 " *b = bbbbbbbbbbbbbbbbbbb;",
5116 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00005117 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5118 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5119 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00005120 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00005121 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005122}
5123
Nico Weber4a5030c2013-01-12 01:28:06 +00005124TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5125 verifyFormat("arr[foo ? bar : baz];");
5126 verifyFormat("f()[foo ? bar : baz];");
5127 verifyFormat("(a + b)[foo ? bar : baz];");
5128 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5129}
5130
Daniel Jasperf7935112012-12-03 18:12:45 +00005131TEST_F(FormatTest, AlignsStringLiterals) {
5132 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5133 " \"short literal\");");
5134 verifyFormat(
5135 "looooooooooooooooooooooooongFunction(\n"
5136 " \"short literal\"\n"
5137 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005138 verifyFormat("someFunction(\"Always break between multi-line\"\n"
5139 " \" string literals\",\n"
5140 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005141 EXPECT_EQ("fun + \"1243\" /* comment */\n"
5142 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005143 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00005144 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005145 getLLVMStyleWithColumns(28)));
5146 EXPECT_EQ(
5147 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5148 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5149 " \"aaaaaaaaaaaaaaaa\";",
5150 format("aaaaaa ="
5151 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5152 "aaaaaaaaaaaaaaaaaaaaa\" "
5153 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005154 verifyFormat("a = a + \"a\"\n"
5155 " \"a\"\n"
5156 " \"a\";");
5157 verifyFormat("f(\"a\", \"b\"\n"
5158 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005159
5160 verifyFormat(
5161 "#define LL_FORMAT \"ll\"\n"
5162 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5163 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00005164
5165 verifyFormat("#define A(X) \\\n"
5166 " \"aaaaa\" #X \"bbbbbb\" \\\n"
5167 " \"ccccc\"",
5168 getLLVMStyleWithColumns(23));
5169 verifyFormat("#define A \"def\"\n"
5170 "f(\"abc\" A \"ghi\"\n"
5171 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005172
5173 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005174 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005175 verifyFormat("#define A(X) \\\n"
5176 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5177 " L\"ccccc\"",
5178 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00005179
5180 verifyFormat("f(@\"a\"\n"
5181 " @\"b\");");
5182 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00005183 " @\"b\"\n"
5184 " @\"c\";");
5185 verifyFormat("NSString s = @\"a\"\n"
5186 " \"b\"\n"
5187 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00005188}
5189
Zachary Turner448592e2015-12-18 22:20:15 +00005190TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005191 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005192 // No declarations or definitions should be moved to own line.
5193 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5194 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005195 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005196 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005197 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005198 "int f() { return 1; }\n"
5199 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005200 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00005201
5202 // All declarations and definitions should have the return type moved to its
5203 // own
5204 // line.
5205 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5206 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005207 " int\n"
5208 " f() {\n"
5209 " return 1;\n"
5210 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005211 " int\n"
5212 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005213 "};\n"
5214 "int\n"
5215 "f() {\n"
5216 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005217 "}\n"
5218 "int\n"
5219 "g();\n",
5220 Style);
5221
5222 // Top-level definitions, and no kinds of declarations should have the
5223 // return type moved to its own line.
5224 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5225 verifyFormat("class B {\n"
5226 " int f() { return 1; }\n"
5227 " int g();\n"
5228 "};\n"
5229 "int\n"
5230 "f() {\n"
5231 " return 1;\n"
5232 "}\n"
5233 "int g();\n",
5234 Style);
5235
5236 // Top-level definitions and declarations should have the return type moved
5237 // to its own line.
5238 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5239 verifyFormat("class C {\n"
5240 " int f() { return 1; }\n"
5241 " int g();\n"
5242 "};\n"
5243 "int\n"
5244 "f() {\n"
5245 " return 1;\n"
5246 "}\n"
5247 "int\n"
5248 "g();\n",
5249 Style);
5250
5251 // All definitions should have the return type moved to its own line, but no
5252 // kinds of declarations.
5253 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5254 verifyFormat("class D {\n"
5255 " int\n"
5256 " f() {\n"
5257 " return 1;\n"
5258 " }\n"
5259 " int g();\n"
5260 "};\n"
5261 "int\n"
5262 "f() {\n"
5263 " return 1;\n"
5264 "}\n"
5265 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005266 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005267 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005268 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005269 " return \"\";\n"
5270 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005271 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005272 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005273 verifyFormat("template <class T>\n"
5274 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005275 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005276 " return NULL;\n"
5277 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005278 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005279 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005280 verifyFormat("class C {\n"
5281 " int\n"
5282 " operator+() {\n"
5283 " return 1;\n"
5284 " }\n"
5285 " int\n"
5286 " operator()() {\n"
5287 " return 1;\n"
5288 " }\n"
5289 "};\n",
5290 Style);
5291 verifyFormat("void\n"
5292 "A::operator()() {}\n"
5293 "void\n"
5294 "A::operator>>() {}\n"
5295 "void\n"
5296 "A::operator+() {}\n",
5297 Style);
5298 verifyFormat("void *operator new(std::size_t s);", // No break here.
5299 Style);
5300 verifyFormat("void *\n"
5301 "operator new(std::size_t s) {}",
5302 Style);
5303 verifyFormat("void *\n"
5304 "operator delete[](void *ptr) {}",
5305 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005306 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005307 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005308 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005309 "{\n"
5310 " return \"\";\n"
5311 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005312 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005313 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005314 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005315 "T *\n" // Problem here: no line break
5316 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005317 "{\n"
5318 " return NULL;\n"
5319 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005320 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005321 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005322}
5323
Alexander Kornienko58611712013-07-04 12:02:44 +00005324TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5325 FormatStyle NoBreak = getLLVMStyle();
5326 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5327 FormatStyle Break = getLLVMStyle();
5328 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005329 verifyFormat("aaaa = \"bbbb\"\n"
5330 " \"cccc\";",
5331 NoBreak);
5332 verifyFormat("aaaa =\n"
5333 " \"bbbb\"\n"
5334 " \"cccc\";",
5335 Break);
5336 verifyFormat("aaaa(\"bbbb\"\n"
5337 " \"cccc\");",
5338 NoBreak);
5339 verifyFormat("aaaa(\n"
5340 " \"bbbb\"\n"
5341 " \"cccc\");",
5342 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005343 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5344 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005345 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005346 verifyFormat("aaaa(qqq,\n"
5347 " \"bbbb\"\n"
5348 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005349 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005350 verifyFormat("aaaa(qqq,\n"
5351 " L\"bbbb\"\n"
5352 " L\"cccc\");",
5353 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005354 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5355 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005356 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005357 verifyFormat("string s = someFunction(\n"
5358 " \"abc\"\n"
5359 " \"abc\");",
5360 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005361
Daniel Jasper3251fff2014-06-10 06:27:23 +00005362 // As we break before unary operators, breaking right after them is bad.
5363 verifyFormat("string foo = abc ? \"x\"\n"
5364 " \"blah blah blah blah blah blah\"\n"
5365 " : \"y\";",
5366 Break);
5367
Daniel Jasperc834c702013-07-17 15:38:19 +00005368 // Don't break if there is no column gain.
5369 verifyFormat("f(\"aaaa\"\n"
5370 " \"bbbb\");",
5371 Break);
5372
5373 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005374 EXPECT_EQ("x = \"a\\\n"
5375 "b\\\n"
5376 "c\";",
5377 format("x = \"a\\\n"
5378 "b\\\n"
5379 "c\";",
5380 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005381 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005382 " \"a\\\n"
5383 "b\\\n"
5384 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005385 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005386 "b\\\n"
5387 "c\";",
5388 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005389
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00005390 EXPECT_EQ("NSString *const kString =\n"
5391 " @\"aaaa\"\n"
5392 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005393 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005394 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005395 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005396
5397 Break.ColumnLimit = 0;
5398 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005399}
5400
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005401TEST_F(FormatTest, AlignsPipes) {
5402 verifyFormat(
5403 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5404 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5405 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5406 verifyFormat(
5407 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5408 " << aaaaaaaaaaaaaaaaaaaa;");
5409 verifyFormat(
5410 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5411 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5412 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005413 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5414 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5415 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005416 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5417 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5418 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5419 verifyFormat(
5420 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5421 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5422 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005423 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5424 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5425 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5426 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005427 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5428 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005429 verifyFormat(
5430 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5431 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00005432 verifyFormat(
5433 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5434 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005435
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005436 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5437 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005438 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5439 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5440 " aaaaaaaaaaaaaaaaaaaaa)\n"
5441 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005442 verifyFormat("LOG_IF(aaa == //\n"
5443 " bbb)\n"
5444 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005445
Daniel Jasper467ddb12013-08-12 12:58:05 +00005446 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005447 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5448 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005449 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5450 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5451 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005452 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5453 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005454 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5455 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5456 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5457 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5458 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5459 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5460 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005461
Daniel Jasperc238c872013-04-02 14:33:13 +00005462 verifyFormat(
5463 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5464 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005465
5466 // Incomplete string literal.
5467 EXPECT_EQ("llvm::errs() << \"\n"
5468 " << a;",
5469 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005470
5471 verifyFormat("void f() {\n"
5472 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5473 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5474 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005475
5476 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005477 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5478 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5479 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005480
5481 // Handle '\n'.
5482 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5483 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5484 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5485 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5486 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5487 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5488 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005489}
5490
Daniel Jasper7209bb92016-12-13 11:16:42 +00005491TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5492 verifyFormat("return out << \"somepacket = {\\n\"\n"
5493 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5494 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5495 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5496 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5497 " << \"}\";");
5498
5499 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5500 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5501 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5502 verifyFormat(
5503 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5504 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5505 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5506 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5507 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5508 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5509 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5510 verifyFormat(
5511 "void f() {\n"
5512 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5513 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5514 "}");
5515
5516 // Breaking before the first "<<" is generally not desirable.
5517 verifyFormat(
5518 "llvm::errs()\n"
5519 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5520 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5521 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5522 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5523 getLLVMStyleWithColumns(70));
5524 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5525 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5526 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5527 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5528 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5529 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5530 getLLVMStyleWithColumns(70));
5531
5532 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5533 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5534 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5535 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5536 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5537 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005538 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5539 " (aaaa + aaaa);",
5540 getLLVMStyleWithColumns(40));
5541 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5542 " (aaaaaaa + aaaaa));",
5543 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005544 verifyFormat(
5545 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5546 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5547 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005548}
5549
Daniel Jasperf7935112012-12-03 18:12:45 +00005550TEST_F(FormatTest, UnderstandsEquals) {
5551 verifyFormat(
5552 "aaaaaaaaaaaaaaaaa =\n"
5553 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5554 verifyFormat(
5555 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005556 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005557 verifyFormat(
5558 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005559 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005560 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005561 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5562 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005563
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005564 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5565 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005566}
5567
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005568TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005569 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5570 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005571
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005572 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5573 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005574
5575 verifyFormat(
5576 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5577 " Parameter2);");
5578
5579 verifyFormat(
5580 "ShortObject->shortFunction(\n"
5581 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5582 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5583
5584 verifyFormat("loooooooooooooongFunction(\n"
5585 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5586
5587 verifyFormat(
5588 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5589 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5590
Daniel Jasper687af3b2013-02-14 14:26:07 +00005591 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5592 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005593 verifyFormat("void f() {\n"
5594 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5595 " .Times(2)\n"
5596 " .WillRepeatedly(Return(SomeValue));\n"
5597 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005598 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5599 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005600 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005601 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5602 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005603 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005604 verifyFormat("void f() {\n"
5605 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5606 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5607 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005608 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5609 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5610 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5611 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5612 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005613 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5614 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5615 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5616 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5617 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005618
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005619 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005620 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005621 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005622 verifyFormat(
5623 "aaaaaaaaaaa->aaaaaaaaa(\n"
5624 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5625 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005626
5627 verifyFormat(
5628 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5629 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005630 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5631 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5632 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5633 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005634
Daniel Jasper9b334242013-03-15 14:57:30 +00005635 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005636 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5637 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005638
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005639 FormatStyle NoBinPacking = getLLVMStyle();
5640 NoBinPacking.BinPackParameters = false;
5641 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5642 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5643 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5644 " aaaaaaaaaaaaaaaaaaa,\n"
5645 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5646 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005647
5648 // If there is a subsequent call, change to hanging indentation.
5649 verifyFormat(
5650 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5651 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5652 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5653 verifyFormat(
5654 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5655 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005656 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5657 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5658 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5659 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5660 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5661 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005662}
5663
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005664TEST_F(FormatTest, WrapsTemplateDeclarations) {
5665 verifyFormat("template <typename T>\n"
5666 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005667 verifyFormat("template <typename T>\n"
5668 "// T should be one of {A, B}.\n"
5669 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005670 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005671 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005672 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005673 verifyFormat("template <typename T>\n"
5674 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5675 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005676 verifyFormat(
5677 "template <typename T>\n"
5678 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5679 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005680 verifyFormat(
5681 "template <typename T>\n"
5682 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5683 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5684 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005685 verifyFormat("template <typename T>\n"
5686 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005687 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005688 verifyFormat(
5689 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5690 " typename T4 = char>\n"
5691 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005692 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5693 " template <typename> class cccccccccccccccccccccc,\n"
5694 " typename ddddddddddddd>\n"
5695 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005696 verifyFormat(
5697 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5698 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005699
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005700 verifyFormat("void f() {\n"
5701 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5702 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5703 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005704
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005705 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005706 verifyFormat("template <typename T> void f();");
5707 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005708 verifyFormat(
5709 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5710 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5711 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5712 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5713 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5714 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5715 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5716 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005717 EXPECT_EQ("static_cast<A< //\n"
5718 " B> *>(\n"
5719 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00005720 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00005721 format("static_cast<A<//\n"
5722 " B>*>(\n"
5723 "\n"
5724 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005725 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5726 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005727
5728 FormatStyle AlwaysBreak = getLLVMStyle();
Francois Ferrand58e6fe52018-05-16 08:25:03 +00005729 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005730 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5731 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5732 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5733 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5734 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5735 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5736 verifyFormat("template <template <typename> class Fooooooo,\n"
5737 " template <typename> class Baaaaaaar>\n"
5738 "struct C {};",
5739 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005740 verifyFormat("template <typename T> // T can be A, B or C.\n"
5741 "struct C {};",
5742 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005743 verifyFormat("template <enum E> class A {\n"
5744 "public:\n"
5745 " E *f();\n"
5746 "};");
Francois Ferrand58e6fe52018-05-16 08:25:03 +00005747
5748 FormatStyle NeverBreak = getLLVMStyle();
5749 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
5750 verifyFormat("template <typename T> class C {};", NeverBreak);
5751 verifyFormat("template <typename T> void f();", NeverBreak);
5752 verifyFormat("template <typename T> void f() {}", NeverBreak);
5753 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
5754 NeverBreak);
5755 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5756 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5757 " ccccccccccccccccccccccccccccccccccccccccccccccc);",
5758 NeverBreak);
5759 verifyFormat("template <template <typename> class Fooooooo,\n"
5760 " template <typename> class Baaaaaaar>\n"
5761 "struct C {};",
5762 NeverBreak);
5763 verifyFormat("template <typename T> // T can be A, B or C.\n"
5764 "struct C {};",
5765 NeverBreak);
5766 verifyFormat("template <enum E> class A {\n"
5767 "public:\n"
5768 " E *f();\n"
5769 "};", NeverBreak);
5770 NeverBreak.PenaltyBreakTemplateDeclaration = 100;
5771 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
5772 NeverBreak);
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005773}
5774
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005775TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
5776 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
5777 Style.ColumnLimit = 60;
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005778 EXPECT_EQ("// Baseline - no comments.\n"
5779 "template <\n"
5780 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
5781 "void f() {}",
5782 format("// Baseline - no comments.\n"
5783 "template <\n"
5784 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
5785 "void f() {}",
5786 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005787
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005788 EXPECT_EQ("template <\n"
5789 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5790 "void f() {}",
5791 format("template <\n"
5792 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5793 "void f() {}",
5794 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005795
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005796 EXPECT_EQ(
5797 "template <\n"
5798 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
5799 "void f() {}",
5800 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
5801 "void f() {}",
5802 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005803
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005804 EXPECT_EQ(
5805 "template <\n"
5806 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5807 " // multiline\n"
5808 "void f() {}",
5809 format("template <\n"
5810 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5811 " // multiline\n"
5812 "void f() {}",
5813 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005814
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005815 EXPECT_EQ(
5816 "template <typename aaaaaaaaaa<\n"
5817 " bbbbbbbbbbbb>::value> // trailing loooong\n"
5818 "void f() {}",
5819 format(
5820 "template <\n"
5821 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
5822 "void f() {}",
5823 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005824}
5825
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005826TEST_F(FormatTest, WrapsTemplateParameters) {
5827 FormatStyle Style = getLLVMStyle();
5828 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5829 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5830 verifyFormat(
5831 "template <typename... a> struct q {};\n"
5832 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5833 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5834 " y;",
5835 Style);
5836 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5837 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5838 verifyFormat(
5839 "template <typename... a> struct r {};\n"
5840 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5841 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5842 " y;",
5843 Style);
5844 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5845 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5846 verifyFormat(
5847 "template <typename... a> struct s {};\n"
5848 "extern s<\n"
5849 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5850 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5851 " y;",
5852 Style);
5853 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5854 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5855 verifyFormat(
5856 "template <typename... a> struct t {};\n"
5857 "extern t<\n"
5858 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5859 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5860 " y;",
5861 Style);
5862}
5863
Daniel Jasper45797022013-01-25 10:57:27 +00005864TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5865 verifyFormat(
5866 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5867 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5868 verifyFormat(
5869 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5870 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5871 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5872
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005873 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005874 verifyFormat(
5875 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5876 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005877 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005878
Daniel Jasper45797022013-01-25 10:57:27 +00005879 verifyFormat(
5880 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005881 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005882
5883 // Breaking at nested name specifiers is generally not desirable.
5884 verifyFormat(
5885 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5886 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005887
5888 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005889 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5890 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5891 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005892 " aaaaaaaaaaaaaaaaaaaaa);",
5893 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005894
5895 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5896 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5897 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005898}
5899
Daniel Jasperf7935112012-12-03 18:12:45 +00005900TEST_F(FormatTest, UnderstandsTemplateParameters) {
5901 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005902 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005903 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5904 verifyFormat("bool x = a < 1 || 2 > a;");
5905 verifyFormat("bool x = 5 < f<int>();");
5906 verifyFormat("bool x = f<int>() > 5;");
5907 verifyFormat("bool x = 5 < a<int>::x;");
5908 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5909 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5910
5911 verifyGoogleFormat("A<A<int>> a;");
5912 verifyGoogleFormat("A<A<A<int>>> a;");
5913 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005914 verifyGoogleFormat("A<A<int> > a;");
5915 verifyGoogleFormat("A<A<A<int> > > a;");
5916 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005917 verifyGoogleFormat("A<::A<int>> a;");
5918 verifyGoogleFormat("A<::A> a;");
5919 verifyGoogleFormat("A< ::A> a;");
5920 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005921 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5922 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005923 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5924 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005925 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5926 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005927
Nico Weber7533b4d2014-09-24 17:17:32 +00005928 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5929
Daniel Jasperf7935112012-12-03 18:12:45 +00005930 verifyFormat("test >> a >> b;");
5931 verifyFormat("test << a >> b;");
5932
5933 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005934 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005935 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005936 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5937 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005938 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005939 verifyFormat("f(a.operator()<A>());");
5940 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5941 " .template operator()<A>());",
5942 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005943
5944 // Not template parameters.
5945 verifyFormat("return a < b && c > d;");
5946 verifyFormat("void f() {\n"
5947 " while (a < b && c > d) {\n"
5948 " }\n"
5949 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005950 verifyFormat("template <typename... Types>\n"
5951 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005952
5953 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5954 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5955 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005956 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005957 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005958 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005959}
5960
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005961TEST_F(FormatTest, BitshiftOperatorWidth) {
5962 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5963 " bar */",
5964 format("int a=1<<2; /* foo\n"
5965 " bar */"));
5966
5967 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5968 " bar */",
5969 format("int b =256>>1 ; /* foo\n"
5970 " bar */"));
5971}
5972
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005973TEST_F(FormatTest, UnderstandsBinaryOperators) {
5974 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005975 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005976}
5977
5978TEST_F(FormatTest, UnderstandsPointersToMembers) {
5979 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005980 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005981 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005982 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005983 verifyFormat("void f() {\n"
5984 " (a->*f)();\n"
5985 " a->*x;\n"
5986 " (a.*f)();\n"
5987 " ((*a).*f)();\n"
5988 " a.*x;\n"
5989 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005990 verifyFormat("void f() {\n"
5991 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5992 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5993 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005994 verifyFormat(
5995 "(aaaaaaaaaa->*bbbbbbb)(\n"
5996 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005997 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005998 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005999 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006000}
6001
Daniel Jasper8dd40472012-12-21 09:41:31 +00006002TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00006003 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00006004 verifyFormat("f(-1, -2, -3);");
6005 verifyFormat("a[-1] = 5;");
6006 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006007 verifyFormat("if (i == -1) {\n}");
6008 verifyFormat("if (i != -1) {\n}");
6009 verifyFormat("if (i > -1) {\n}");
6010 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00006011 verifyFormat("++(a->f());");
6012 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00006013 verifyFormat("(a->f())++;");
6014 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006015 verifyFormat("if (!(a->f())) {\n}");
Krasimir Georgiev446d6ec2018-03-06 13:56:28 +00006016 verifyFormat("if (!+i) {\n}");
6017 verifyFormat("~&a;");
Daniel Jasper8dd40472012-12-21 09:41:31 +00006018
6019 verifyFormat("a-- > b;");
6020 verifyFormat("b ? -a : c;");
6021 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006022 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00006023 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006024 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00006025
6026 verifyFormat("return -1;");
6027 verifyFormat("switch (a) {\n"
6028 "case -1:\n"
6029 " break;\n"
6030 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00006031 verifyFormat("#define X -1");
6032 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00006033
Chandler Carruthf8b72662014-03-02 12:37:31 +00006034 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6035 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00006036
6037 verifyFormat("int a = /* confusing comment */ -1;");
6038 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6039 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006040}
6041
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006042TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00006043 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006044 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00006045 "}");
6046 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00006047 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00006048 verifyFormat("*aaa = aaaaaaa( // break\n"
6049 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00006050}
6051
Daniel Jasper8863ada2013-08-26 08:10:17 +00006052TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00006053 verifyFormat("bool operator<();");
6054 verifyFormat("bool operator>();");
6055 verifyFormat("bool operator=();");
6056 verifyFormat("bool operator==();");
6057 verifyFormat("bool operator!=();");
6058 verifyFormat("int operator+();");
6059 verifyFormat("int operator++();");
Daniel Jasperbbf5f4e2017-11-06 12:11:51 +00006060 verifyFormat("int operator++(int) volatile noexcept;");
Daniel Jasper804a2762016-01-09 15:56:40 +00006061 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006062 verifyFormat("bool operator();");
6063 verifyFormat("bool operator()();");
6064 verifyFormat("bool operator[]();");
6065 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006066 verifyFormat("operator int();");
6067 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006068 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006069 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006070 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006071 verifyFormat("void *operator new(std::size_t size);");
6072 verifyFormat("void *operator new[](std::size_t size);");
6073 verifyFormat("void operator delete(void *ptr);");
6074 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00006075 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6076 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00006077 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00006078 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006079
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006080 verifyFormat(
6081 "ostream &operator<<(ostream &OutputStream,\n"
6082 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00006083 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6084 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6085 " return left.group < right.group;\n"
6086 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00006087 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00006088 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006089
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006090 verifyGoogleFormat("operator void*();");
6091 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00006092 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00006093
6094 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00006095 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6096 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006097}
6098
Daniel Jasper1c220482015-02-25 10:30:06 +00006099TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00006100 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6101 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6102 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6103 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6104 verifyFormat("Deleted &operator=(const Deleted &) &;");
6105 verifyFormat("Deleted &operator=(const Deleted &) &&;");
6106 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6107 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6108 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6109 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6110 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00006111 verifyFormat("void Fn(T const &) const &;");
6112 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00006113 verifyFormat("template <typename T>\n"
6114 "void F(T) && = delete;",
6115 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00006116
Daniel Jasperaf642c62015-08-25 13:40:51 +00006117 FormatStyle AlignLeft = getLLVMStyle();
6118 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00006119 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00006120 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6121 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6122 AlignLeft);
6123 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6124 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006125 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6126 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6127 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6128 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00006129 verifyFormat("void Fn(T const&) const&;", AlignLeft);
6130 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00006131
6132 FormatStyle Spaces = getLLVMStyle();
6133 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006134 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6135 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6136 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6137 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006138
6139 Spaces.SpacesInCStyleCastParentheses = false;
6140 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006141 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6142 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6143 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6144 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006145}
6146
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006147TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00006148 verifyFormat("void f() {\n"
6149 " A *a = new A;\n"
6150 " A *a = new (placement) A;\n"
6151 " delete a;\n"
6152 " delete (A *)a;\n"
6153 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00006154 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6155 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00006156 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6157 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6158 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00006159 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006160}
6161
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006162TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006163 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006164 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006165 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006166 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006167 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006168 verifyIndependentOfContext("int a = b * 10;");
6169 verifyIndependentOfContext("int a = 10 * b;");
6170 verifyIndependentOfContext("int a = b * c;");
6171 verifyIndependentOfContext("int a += b * c;");
6172 verifyIndependentOfContext("int a -= b * c;");
6173 verifyIndependentOfContext("int a *= b * c;");
6174 verifyIndependentOfContext("int a /= b * c;");
6175 verifyIndependentOfContext("int a = *b;");
6176 verifyIndependentOfContext("int a = *b * c;");
6177 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00006178 verifyIndependentOfContext("int a = b * (10);");
6179 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006180 verifyIndependentOfContext("return 10 * b;");
6181 verifyIndependentOfContext("return *b * *c;");
6182 verifyIndependentOfContext("return a & ~b;");
6183 verifyIndependentOfContext("f(b ? *c : *d);");
6184 verifyIndependentOfContext("int a = b ? *c : *d;");
6185 verifyIndependentOfContext("*b = a;");
6186 verifyIndependentOfContext("a * ~b;");
6187 verifyIndependentOfContext("a * !b;");
6188 verifyIndependentOfContext("a * +b;");
6189 verifyIndependentOfContext("a * -b;");
6190 verifyIndependentOfContext("a * ++b;");
6191 verifyIndependentOfContext("a * --b;");
6192 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00006193 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006194 verifyIndependentOfContext("f() * b;");
6195 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006196 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006197 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00006198 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006199 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00006200 verifyIndependentOfContext("return sizeof(int **);");
6201 verifyIndependentOfContext("return sizeof(int ******);");
6202 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00006203 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006204 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00006205 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00006206 verifyGoogleFormat("return sizeof(int**);");
6207 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6208 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006209 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00006210 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00006211 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00006212 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00006213 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00006214 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00006215 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00006216 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00006217 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00006218 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00006219 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00006220 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00006221 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00006222 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00006223 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00006224 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00006225 verifyFormat("void f(const MyOverride &override);");
6226 verifyFormat("void f(const MyFinal &final);");
6227 verifyIndependentOfContext("bool a = f() && override.f();");
6228 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00006229
Daniel Jasper5b49f472013-01-23 12:10:53 +00006230 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00006231
Daniel Jasper5b49f472013-01-23 12:10:53 +00006232 verifyIndependentOfContext("A<int *> a;");
6233 verifyIndependentOfContext("A<int **> a;");
6234 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00006235 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006236 verifyIndependentOfContext(
6237 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006238 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00006239 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00006240 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00006241 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00006242 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00006243
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00006244 verifyFormat(
6245 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6246 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6247
Daniel Jasper1f5d6372016-06-13 14:45:12 +00006248 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00006249 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00006250 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006251 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00006252 verifyGoogleFormat("A<int*> a;");
6253 verifyGoogleFormat("A<int**> a;");
6254 verifyGoogleFormat("A<int*, int*> a;");
6255 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006256 verifyGoogleFormat("f(b ? *c : *d);");
6257 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00006258 verifyGoogleFormat("Type* t = **x;");
6259 verifyGoogleFormat("Type* t = *++*x;");
6260 verifyGoogleFormat("*++*x;");
6261 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6262 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006263 verifyGoogleFormat(
6264 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00006265 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00006266 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6267 verifyGoogleFormat("template <typename T>\n"
6268 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00006269
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006270 FormatStyle Left = getLLVMStyle();
6271 Left.PointerAlignment = FormatStyle::PAS_Left;
6272 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00006273 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00006274 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00006275 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00006276 verifyFormat("delete *x;", Left);
6277 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
6278 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
6279 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006280
Daniel Jasper5b49f472013-01-23 12:10:53 +00006281 verifyIndependentOfContext("a = *(x + y);");
6282 verifyIndependentOfContext("a = &(x + y);");
6283 verifyIndependentOfContext("*(x + y).call();");
6284 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006285 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00006286
Daniel Jasper5b49f472013-01-23 12:10:53 +00006287 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00006288 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00006289 "int *MyValues = {\n"
6290 " *A, // Operator detection might be confused by the '{'\n"
6291 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00006292 "};");
Nico Weber80a82762013-01-17 17:17:19 +00006293
Daniel Jasper5b49f472013-01-23 12:10:53 +00006294 verifyIndependentOfContext("if (int *a = &b)");
6295 verifyIndependentOfContext("if (int &a = *b)");
6296 verifyIndependentOfContext("if (a & b[i])");
6297 verifyIndependentOfContext("if (a::b::c::d & b[i])");
6298 verifyIndependentOfContext("if (*b[i])");
6299 verifyIndependentOfContext("if (int *a = (&b))");
6300 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00006301 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00006302 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00006303 verifyFormat("void f() {\n"
6304 " for (const int &v : Values) {\n"
6305 " }\n"
6306 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006307 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6308 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00006309 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00006310
Daniel Jaspera98da3d2013-11-07 19:56:07 +00006311 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006312 verifyFormat("#define MACRO \\\n"
6313 " int *i = a * b; \\\n"
6314 " void f(a *b);",
6315 getLLVMStyleWithColumns(19));
6316
Daniel Jasper97b89482013-03-13 07:49:51 +00006317 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006318 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006319 verifyIndependentOfContext("T **t = new T *;");
6320 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00006321 verifyGoogleFormat("A = new SomeType*[Length]();");
6322 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006323 verifyGoogleFormat("T** t = new T*;");
6324 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006325
Daniel Jaspera65e8872014-03-25 10:52:45 +00006326 verifyFormat("STATIC_ASSERT((a & b) == 0);");
6327 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006328 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006329 "typename t::if<x && y>::type f() {}");
6330 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006331 verifyFormat("vector<int *> v;");
6332 verifyFormat("vector<int *const> v;");
6333 verifyFormat("vector<int *const **const *> v;");
6334 verifyFormat("vector<int *volatile> v;");
6335 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006336 verifyFormat("foo<b && false>();");
6337 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00006338 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00006339 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006340 "template <class T, class = typename std::enable_if<\n"
6341 " std::is_integral<T>::value &&\n"
6342 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
6343 "void F();",
6344 getLLVMStyleWithColumns(70));
6345 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006346 "template <class T,\n"
6347 " class = typename std::enable_if<\n"
6348 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006349 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
6350 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006351 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006352 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006353 verifyFormat(
6354 "template <class T,\n"
6355 " class = typename ::std::enable_if<\n"
6356 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6357 "void F();",
6358 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006359
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006360 verifyIndependentOfContext("MACRO(int *i);");
6361 verifyIndependentOfContext("MACRO(auto *a);");
6362 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00006363 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006364 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006365 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006366 // FIXME: Is there a way to make this work?
6367 // verifyIndependentOfContext("MACRO(A *a);");
6368
Daniel Jasper32ccb032014-06-23 07:36:18 +00006369 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006370 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006371
Daniel Jasper866468a2014-04-14 13:15:29 +00006372 EXPECT_EQ("#define OP(x) \\\n"
6373 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6374 " return s << a.DebugString(); \\\n"
6375 " }",
6376 format("#define OP(x) \\\n"
6377 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6378 " return s << a.DebugString(); \\\n"
6379 " }",
6380 getLLVMStyleWithColumns(50)));
6381
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006382 // FIXME: We cannot handle this case yet; we might be able to figure out that
6383 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006384 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006385
6386 FormatStyle PointerMiddle = getLLVMStyle();
6387 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6388 verifyFormat("delete *x;", PointerMiddle);
6389 verifyFormat("int * x;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006390 verifyFormat("int *[] x;", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006391 verifyFormat("template <int * y> f() {}", PointerMiddle);
6392 verifyFormat("int * f(int * a) {}", PointerMiddle);
6393 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6394 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6395 verifyFormat("A<int *> a;", PointerMiddle);
6396 verifyFormat("A<int **> a;", PointerMiddle);
6397 verifyFormat("A<int *, int *> a;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006398 verifyFormat("A<int *[]> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006399 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6400 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006401 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006402
6403 // Member function reference qualifiers aren't binary operators.
6404 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006405 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006406 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006407 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006408 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006409 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006410}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006411
Daniel Jasperee6d6502013-07-17 20:25:02 +00006412TEST_F(FormatTest, UnderstandsAttributes) {
6413 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006414 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6415 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006416 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006417 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006418 verifyFormat("__attribute__((nodebug)) void\n"
6419 "foo() {}\n",
6420 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006421}
6422
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006423TEST_F(FormatTest, UnderstandsSquareAttributes) {
6424 verifyFormat("SomeType s [[unused]] (InitValue);");
6425 verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
6426 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
6427 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
6428 verifyFormat("void f() [[deprecated(\"so sorry\")]];");
6429 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6430 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Manuel Klimekd0f3fe52018-04-11 14:51:54 +00006431
6432 // Make sure we do not mistake attributes for array subscripts.
6433 verifyFormat("int a() {}\n"
6434 "[[unused]] int b() {}\n");
6435
6436 // On the other hand, we still need to correctly find array subscripts.
6437 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
6438
6439 // Make sure we do not parse attributes as lambda introducers.
6440 FormatStyle MultiLineFunctions = getLLVMStyle();
6441 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6442 verifyFormat("[[unused]] int b() {\n"
6443 " return 42;\n"
6444 "}\n",
6445 MultiLineFunctions);
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006446}
6447
Daniel Jasper10cd5812013-05-06 06:35:44 +00006448TEST_F(FormatTest, UnderstandsEllipsis) {
6449 verifyFormat("int printf(const char *fmt, ...);");
6450 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006451 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6452
6453 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006454 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006455 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006456}
6457
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006458TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006459 EXPECT_EQ("int *a;\n"
6460 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006461 "int *a;",
6462 format("int *a;\n"
6463 "int* a;\n"
6464 "int *a;",
6465 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006466 EXPECT_EQ("int* a;\n"
6467 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006468 "int* a;",
6469 format("int* a;\n"
6470 "int* a;\n"
6471 "int *a;",
6472 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006473 EXPECT_EQ("int *a;\n"
6474 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006475 "int *a;",
6476 format("int *a;\n"
6477 "int * a;\n"
6478 "int * a;",
6479 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006480 EXPECT_EQ("auto x = [] {\n"
6481 " int *a;\n"
6482 " int *a;\n"
6483 " int *a;\n"
6484 "};",
6485 format("auto x=[]{int *a;\n"
6486 "int * a;\n"
6487 "int * a;};",
6488 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006489}
6490
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006491TEST_F(FormatTest, UnderstandsRvalueReferences) {
6492 verifyFormat("int f(int &&a) {}");
6493 verifyFormat("int f(int a, char &&b) {}");
6494 verifyFormat("void f() { int &&a = b; }");
6495 verifyGoogleFormat("int f(int a, char&& b) {}");
6496 verifyGoogleFormat("void f() { int&& a = b; }");
6497
Daniel Jasper1eff9082013-05-27 16:36:33 +00006498 verifyIndependentOfContext("A<int &&> a;");
6499 verifyIndependentOfContext("A<int &&, int &&> a;");
6500 verifyGoogleFormat("A<int&&> a;");
6501 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006502
6503 // Not rvalue references:
6504 verifyFormat("template <bool B, bool C> class A {\n"
6505 " static_assert(B && C, \"Something is wrong\");\n"
6506 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006507 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6508 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006509 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006510}
6511
Manuel Klimekc1237a82013-01-23 14:08:21 +00006512TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6513 verifyFormat("void f() {\n"
6514 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006515 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006516 "}",
6517 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006518}
6519
Daniel Jasperef906a92013-01-13 08:01:36 +00006520TEST_F(FormatTest, FormatsCasts) {
6521 verifyFormat("Type *A = static_cast<Type *>(P);");
6522 verifyFormat("Type *A = (Type *)P;");
6523 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6524 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006525 verifyFormat("int a = (int)2.0f;");
6526 verifyFormat("x[(int32)y];");
6527 verifyFormat("x = (int32)y;");
6528 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6529 verifyFormat("int a = (int)*b;");
6530 verifyFormat("int a = (int)2.0f;");
6531 verifyFormat("int a = (int)~0;");
6532 verifyFormat("int a = (int)++a;");
6533 verifyFormat("int a = (int)sizeof(int);");
6534 verifyFormat("int a = (int)+2;");
6535 verifyFormat("my_int a = (my_int)2.0f;");
6536 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006537 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006538 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006539 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006540 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006541 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006542
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006543 verifyFormat("void f() { my_int a = (my_int)*b; }");
6544 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6545 verifyFormat("my_int a = (my_int)~0;");
6546 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006547 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006548 verifyFormat("my_int a = (my_int)1;");
6549 verifyFormat("my_int a = (my_int *)1;");
6550 verifyFormat("my_int a = (const my_int)-1;");
6551 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006552 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006553 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006554 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006555 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006556
6557 // FIXME: single value wrapped with paren will be treated as cast.
6558 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006559
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006560 verifyFormat("{ (void)F; }");
6561
Daniel Jasper998cabc2013-07-18 14:46:07 +00006562 // Don't break after a cast's
6563 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6564 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6565 " bbbbbbbbbbbbbbbbbbbbbb);");
6566
Daniel Jasperef906a92013-01-13 08:01:36 +00006567 // These are not casts.
6568 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006569 verifyFormat("f(foo)->b;");
6570 verifyFormat("f(foo).b;");
6571 verifyFormat("f(foo)(b);");
6572 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006573 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006574 verifyFormat("(*funptr)(foo)[4];");
6575 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006576 verifyFormat("void f(int *);");
6577 verifyFormat("void f(int *) = 0;");
6578 verifyFormat("void f(SmallVector<int>) {}");
6579 verifyFormat("void f(SmallVector<int>);");
6580 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006581 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006582 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006583 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006584 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6585 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006586 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006587
Daniel Jasperba0bda92013-02-23 08:07:18 +00006588 // These are not casts, but at some point were confused with casts.
6589 verifyFormat("virtual void foo(int *) override;");
6590 verifyFormat("virtual void foo(char &) const;");
6591 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006592 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006593 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006594 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006595 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006596
6597 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6598 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006599 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006600 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006601 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6602 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6603 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006604}
6605
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006606TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006607 verifyFormat("A<bool()> a;");
6608 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006609 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006610 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006611 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006612 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006613 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006614 verifyFormat("template <class CallbackClass>\n"
6615 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006616
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006617 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6618 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006619 verifyGoogleFormat(
6620 "template <class CallbackClass>\n"
6621 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006622
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006623 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006624 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006625 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006626 verifyFormat("some_var = function(*some_pointer_var)[0];");
6627 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006628 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006629 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00006630 verifyFormat("std::function<\n"
6631 " LooooooooooongTemplatedType<\n"
6632 " SomeType>*(\n"
6633 " LooooooooooooooooongType type)>\n"
6634 " function;",
6635 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006636}
6637
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006638TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6639 verifyFormat("A (*foo_)[6];");
6640 verifyFormat("vector<int> (*foo_)[6];");
6641}
6642
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006643TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6644 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6645 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6646 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6647 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006648 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6649 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006650
6651 // Different ways of ()-initializiation.
6652 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6653 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6654 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6655 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6656 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6657 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006658 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6659 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006660
6661 // Lambdas should not confuse the variable declaration heuristic.
6662 verifyFormat("LooooooooooooooooongType\n"
6663 " variable(nullptr, [](A *a) {});",
6664 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006665}
6666
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006667TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006668 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006669 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006670 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006671 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006672 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006673 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006674 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6675 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006676 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6677 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006678 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6679 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006680 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6681 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006682 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6683 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006684 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6685 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6686 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6687 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006688 FormatStyle Indented = getLLVMStyle();
6689 Indented.IndentWrappedFunctionNames = true;
6690 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6691 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6692 Indented);
6693 verifyFormat(
6694 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6695 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6696 Indented);
6697 verifyFormat(
6698 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6699 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6700 Indented);
6701 verifyFormat(
6702 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6703 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6704 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006705
6706 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006707 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6708 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6709 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006710
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006711 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006712 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006713 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006714 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6715 " SourceLocation L, IdentifierIn *II,\n"
6716 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006717 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006718 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006719 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006720 " const SomeType<string, SomeOtherTemplateParameter>\n"
6721 " &ReallyReallyLongParameterName,\n"
6722 " const SomeType<string, SomeOtherTemplateParameter>\n"
6723 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006724 verifyFormat("template <typename A>\n"
6725 "SomeLoooooooooooooooooooooongType<\n"
6726 " typename some_namespace::SomeOtherType<A>::Type>\n"
6727 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006728
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006729 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006730 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6731 " aaaaaaaaaaaaaaaaaaaaaaa;");
6732 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006733 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6734 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006735 verifyGoogleFormat(
6736 "some_namespace::LongReturnType\n"
6737 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006738 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006739
6740 verifyGoogleFormat("template <typename T>\n"
6741 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006742 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006743 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6744 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006745
6746 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006747 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6748 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006749 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6750 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6751 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6752 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6753 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6754 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6755 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006756
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006757 verifyFormat("template <typename T> // Templates on own line.\n"
6758 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006759 "MyFunction(int a);",
6760 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006761}
6762
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006763TEST_F(FormatTest, FormatsArrays) {
6764 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6765 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006766 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6767 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006768 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6769 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006770 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6771 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6772 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6773 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6774 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6775 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6776 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6777 verifyFormat(
6778 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6779 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6780 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006781 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6782 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006783
6784 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6785 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006786 verifyFormat(
6787 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6788 " .aaaaaaa[0]\n"
6789 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006790 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006791
6792 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006793
6794 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6795 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006796}
6797
Daniel Jaspere9de2602012-12-06 09:56:08 +00006798TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6799 verifyFormat("(a)->b();");
6800 verifyFormat("--a;");
6801}
6802
Daniel Jasper8b529712012-12-04 13:02:32 +00006803TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006804 verifyFormat("#include <string>\n"
6805 "#include <a/b/c.h>\n"
6806 "#include \"a/b/string\"\n"
6807 "#include \"string.h\"\n"
6808 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006809 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006810 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006811 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006812 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006813 "#include \"some long include\" // with a comment\n"
Manuel Klimek45ab5592017-11-14 09:19:53 +00006814 "#include \"some very long include path\"\n"
6815 "#include <some/very/long/include/path>\n",
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006816 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006817 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6818 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006819
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006820 verifyFormat("#import <string>");
6821 verifyFormat("#import <a/b/c.h>");
6822 verifyFormat("#import \"a/b/string\"");
6823 verifyFormat("#import \"string.h\"");
6824 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006825 verifyFormat("#if __has_include(<strstream>)\n"
6826 "#include <strstream>\n"
6827 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006828
Daniel Jasper343643b2014-08-13 08:29:18 +00006829 verifyFormat("#define MY_IMPORT <a/b>");
6830
Nico Weber21088802017-02-10 19:36:52 +00006831 verifyFormat("#if __has_include(<a/b>)");
6832 verifyFormat("#if __has_include_next(<a/b>)");
6833 verifyFormat("#define F __has_include(<a/b>)");
6834 verifyFormat("#define F __has_include_next(<a/b>)");
6835
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006836 // Protocol buffer definition or missing "#".
6837 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6838 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006839
6840 FormatStyle Style = getLLVMStyle();
6841 Style.AlwaysBreakBeforeMultilineStrings = true;
6842 Style.ColumnLimit = 0;
6843 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006844
6845 // But 'import' might also be a regular C++ namespace.
6846 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6847 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006848}
6849
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006850//===----------------------------------------------------------------------===//
6851// Error recovery tests.
6852//===----------------------------------------------------------------------===//
6853
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006854TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006855 FormatStyle NoBinPacking = getLLVMStyle();
6856 NoBinPacking.BinPackParameters = false;
6857 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6858 " double *min_x,\n"
6859 " double *max_x,\n"
6860 " double *min_y,\n"
6861 " double *max_y,\n"
6862 " double *min_z,\n"
6863 " double *max_z, ) {}",
6864 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006865}
6866
Daniel Jasper83a54d22013-01-10 09:26:47 +00006867TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006868 verifyFormat("void f() { return; }\n42");
6869 verifyFormat("void f() {\n"
6870 " if (0)\n"
6871 " return;\n"
6872 "}\n"
6873 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006874 verifyFormat("void f() { return }\n42");
6875 verifyFormat("void f() {\n"
6876 " if (0)\n"
6877 " return\n"
6878 "}\n"
6879 "42");
6880}
6881
6882TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6883 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6884 EXPECT_EQ("void f() {\n"
6885 " if (a)\n"
6886 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006887 "}",
6888 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006889 EXPECT_EQ("namespace N {\n"
6890 "void f()\n"
6891 "}",
6892 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006893 EXPECT_EQ("namespace N {\n"
6894 "void f() {}\n"
6895 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006896 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006897 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006898}
6899
Daniel Jasper2df93312013-01-09 10:16:05 +00006900TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6901 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006902 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006903 " b;",
6904 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006905 verifyFormat("function(\n"
6906 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006907 " LoooooooooooongArgument);\n",
6908 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006909}
6910
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006911TEST_F(FormatTest, IncorrectAccessSpecifier) {
6912 verifyFormat("public:");
6913 verifyFormat("class A {\n"
6914 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006915 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006916 "};");
6917 verifyFormat("public\n"
6918 "int qwerty;");
6919 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006920 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006921 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006922 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006923 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006924 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006925}
Daniel Jasperf7935112012-12-03 18:12:45 +00006926
Daniel Jasper291f9362013-03-20 15:58:10 +00006927TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6928 verifyFormat("{");
6929 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006930 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006931}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006932
Krasimir Georgiev067ec702018-05-22 11:44:03 +00006933TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
6934 // Found by oss-fuzz:
6935 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
6936 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
6937 Style.ColumnLimit = 60;
6938 verifyNoCrash(
6939 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
6940 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
6941 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
6942 Style);
6943}
6944
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006945TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006946 verifyFormat("do {\n}");
6947 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006948 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006949 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006950 "wheeee(fun);");
6951 verifyFormat("do {\n"
6952 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006953 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006954}
6955
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006956TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006957 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006958 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006959 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006960 verifyFormat("while {\n foo;\n foo();\n}");
6961 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006962}
6963
Daniel Jasperc0880a92013-01-04 18:52:56 +00006964TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006965 verifyIncompleteFormat("namespace {\n"
6966 "class Foo { Foo (\n"
6967 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006968 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006969}
6970
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006971TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006972 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006973 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6974 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006975 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006976
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006977 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006978 " {\n"
6979 " breakme(\n"
6980 " qwe);\n"
6981 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006982 format("{\n"
6983 " {\n"
6984 " breakme(qwe);\n"
6985 "}\n",
6986 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006987}
6988
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006989TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006990 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006991 " avariable,\n"
6992 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006993 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006994}
6995
Manuel Klimek762dd182013-01-21 10:07:49 +00006996TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006997 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006998}
6999
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007000TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007001 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00007002 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00007003 " 1,\n"
7004 " 2,\n"
7005 " 3,\n"
7006 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00007007 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007008 verifyFormat("vector<T> x{{}, {}, {}, {}};");
7009 verifyFormat("f({1, 2});");
7010 verifyFormat("auto v = Foo{-1};");
7011 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
7012 verifyFormat("Class::Class : member{1, 2, 3} {}");
7013 verifyFormat("new vector<int>{1, 2, 3};");
7014 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00007015 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007016 verifyFormat("return {arg1, arg2};");
7017 verifyFormat("return {arg1, SomeType{parameter}};");
7018 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
7019 verifyFormat("new T{arg1, arg2};");
7020 verifyFormat("f(MyMap[{composite, key}]);");
7021 verifyFormat("class Class {\n"
7022 " T member = {arg1, arg2};\n"
7023 "};");
7024 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00007025 verifyFormat("const struct A a = {.a = 1, .b = 2};");
7026 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00007027 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
7028 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00007029
Daniel Jasper438059e2014-05-22 12:11:13 +00007030 verifyFormat("int foo(int i) { return fo1{}(i); }");
7031 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007032 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00007033 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00007034 verifyFormat("Node n{1, Node{1000}, //\n"
7035 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00007036 verifyFormat("Aaaa aaaaaaa{\n"
7037 " {\n"
7038 " aaaa,\n"
7039 " },\n"
7040 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00007041 verifyFormat("class C : public D {\n"
7042 " SomeClass SC{2};\n"
7043 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00007044 verifyFormat("class C : public A {\n"
7045 " class D : public B {\n"
7046 " void f() { int i{2}; }\n"
7047 " };\n"
7048 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00007049 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00007050
Francois Ferrandf92f8062018-05-16 08:03:52 +00007051 // Avoid breaking between equal sign and opening brace
7052 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
7053 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
7054 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
7055 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
7056 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
7057 " {\"ccccccccccccccccccccc\", 2}};",
7058 AvoidBreakingFirstArgument);
7059
Francois Ferrandd2130f52017-06-30 20:00:02 +00007060 // Binpacking only if there is no trailing comma
7061 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
7062 " cccccccccc, dddddddddd};",
7063 getLLVMStyleWithColumns(50));
7064 verifyFormat("const Aaaaaa aaaaa = {\n"
7065 " aaaaaaaaaaa,\n"
7066 " bbbbbbbbbbb,\n"
7067 " ccccccccccc,\n"
7068 " ddddddddddd,\n"
7069 "};", getLLVMStyleWithColumns(50));
7070
Daniel Jaspere4ada022016-12-13 10:05:03 +00007071 // Cases where distinguising braced lists and blocks is hard.
7072 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7073 verifyFormat("void f() {\n"
7074 " return; // comment\n"
7075 "}\n"
7076 "SomeType t;");
7077 verifyFormat("void f() {\n"
7078 " if (a) {\n"
7079 " f();\n"
7080 " }\n"
7081 "}\n"
7082 "SomeType t;");
7083
Daniel Jasper08434342015-05-26 07:26:26 +00007084 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007085 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00007086 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007087 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7088 " bbbbb,\n"
7089 " ccccc,\n"
7090 " ddddd,\n"
7091 " eeeee,\n"
7092 " ffffff,\n"
7093 " ggggg,\n"
7094 " hhhhhh,\n"
7095 " iiiiii,\n"
7096 " jjjjjj,\n"
7097 " kkkkkk};",
7098 NoBinPacking);
7099 verifyFormat("const Aaaaaa aaaaa = {\n"
7100 " aaaaa,\n"
7101 " bbbbb,\n"
7102 " ccccc,\n"
7103 " ddddd,\n"
7104 " eeeee,\n"
7105 " ffffff,\n"
7106 " ggggg,\n"
7107 " hhhhhh,\n"
7108 " iiiiii,\n"
7109 " jjjjjj,\n"
7110 " kkkkkk,\n"
7111 "};",
7112 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00007113 verifyFormat(
7114 "const Aaaaaa aaaaa = {\n"
7115 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
7116 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
7117 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7118 "};",
7119 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007120
Chandler Carruthf8b72662014-03-02 12:37:31 +00007121 // FIXME: The alignment of these trailing comments might be bad. Then again,
7122 // this might be utterly useless in real code.
7123 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007124 " : some_value{ //\n"
7125 " aaaaaaa, //\n"
7126 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00007127
Chandler Carruthf8b72662014-03-02 12:37:31 +00007128 // In braced lists, the first comment is always assumed to belong to the
7129 // first element. Thus, it can be moved to the next or previous line as
7130 // appropriate.
7131 EXPECT_EQ("function({// First element:\n"
7132 " 1,\n"
7133 " // Second element:\n"
7134 " 2});",
7135 format("function({\n"
7136 " // First element:\n"
7137 " 1,\n"
7138 " // Second element:\n"
7139 " 2});"));
7140 EXPECT_EQ("std::vector<int> MyNumbers{\n"
7141 " // First element:\n"
7142 " 1,\n"
7143 " // Second element:\n"
7144 " 2};",
7145 format("std::vector<int> MyNumbers{// First element:\n"
7146 " 1,\n"
7147 " // Second element:\n"
7148 " 2};",
7149 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00007150 // A trailing comma should still lead to an enforced line break and no
7151 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00007152 EXPECT_EQ("vector<int> SomeVector = {\n"
7153 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00007154 " 1,\n"
7155 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007156 "};",
7157 format("vector<int> SomeVector = { // aaa\n"
7158 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00007159
Chandler Carruthf8b72662014-03-02 12:37:31 +00007160 FormatStyle ExtraSpaces = getLLVMStyle();
7161 ExtraSpaces.Cpp11BracedListStyle = false;
7162 ExtraSpaces.ColumnLimit = 75;
7163 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7164 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7165 verifyFormat("f({ 1, 2 });", ExtraSpaces);
7166 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7167 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7168 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7169 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7170 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7171 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7172 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7173 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7174 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7175 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7176 verifyFormat("class Class {\n"
7177 " T member = { arg1, arg2 };\n"
7178 "};",
7179 ExtraSpaces);
7180 verifyFormat(
7181 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7182 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7183 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7184 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7185 ExtraSpaces);
7186 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00007187 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007188 ExtraSpaces);
7189 verifyFormat(
7190 "someFunction(OtherParam,\n"
7191 " BracedList{ // comment 1 (Forcing interesting break)\n"
7192 " param1, param2,\n"
7193 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00007194 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007195 ExtraSpaces);
7196 verifyFormat(
7197 "std::this_thread::sleep_for(\n"
7198 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7199 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00007200 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00007201 " aaaaaaa,\n"
7202 " aaaaaaaaaa,\n"
7203 " aaaaa,\n"
7204 " aaaaaaaaaaaaaaa,\n"
7205 " aaa,\n"
7206 " aaaaaaaaaa,\n"
7207 " a,\n"
7208 " aaaaaaaaaaaaaaaaaaaaa,\n"
7209 " aaaaaaaaaaaa,\n"
7210 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7211 " aaaaaaa,\n"
7212 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007213 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00007214 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
7215 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Francois Ferrandf92f8062018-05-16 08:03:52 +00007216
7217 // Avoid breaking between initializer/equal sign and opening brace
7218 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
7219 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
7220 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7221 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7222 " { \"ccccccccccccccccccccc\", 2 }\n"
7223 "};",
7224 ExtraSpaces);
7225 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
7226 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7227 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7228 " { \"ccccccccccccccccccccc\", 2 }\n"
7229 "};",
7230 ExtraSpaces);
Hans Wennborgbfc34062018-06-14 08:01:09 +00007231
7232 FormatStyle SpaceBeforeBrace = getLLVMStyle();
7233 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
7234 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
7235 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
Manuel Klimekab419912013-05-23 09:41:43 +00007236}
7237
Daniel Jasper33b909c2013-10-25 14:29:37 +00007238TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007239 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7240 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7241 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7242 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7243 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7244 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007245 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007246 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00007247 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007248 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7249 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007250 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007251 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7252 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7253 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
7254 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7255 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7256 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7257 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007258 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007259 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7260 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007261 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7262 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7263 " // Separating comment.\n"
7264 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7265 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7266 " // Leading comment\n"
7267 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7268 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007269 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7270 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007271 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00007272 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7273 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007274 getLLVMStyleWithColumns(38));
7275 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007276 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7277 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007278 verifyFormat(
7279 "static unsigned SomeValues[10][3] = {\n"
7280 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
7281 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7282 verifyFormat("static auto fields = new vector<string>{\n"
7283 " \"aaaaaaaaaaaaa\",\n"
7284 " \"aaaaaaaaaaaaa\",\n"
7285 " \"aaaaaaaaaaaa\",\n"
7286 " \"aaaaaaaaaaaaaa\",\n"
7287 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7288 " \"aaaaaaaaaaaa\",\n"
7289 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7290 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00007291 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7292 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7293 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7294 " 3, cccccccccccccccccccccc};",
7295 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00007296
7297 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00007298 verifyFormat("vector<int> x = {\n"
7299 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
7300 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00007301 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00007302 verifyFormat("vector<int> x = {\n"
7303 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00007304 "};",
7305 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00007306 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7307 " 1, 1, 1, 1,\n"
7308 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00007309 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007310
Daniel Jasper60c27072015-05-13 08:16:00 +00007311 // Trailing comment in the first line.
7312 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
7313 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
7314 " 111111111, 222222222, 3333333333, 444444444, //\n"
7315 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00007316 // Trailing comment in the last line.
7317 verifyFormat("int aaaaa[] = {\n"
7318 " 1, 2, 3, // comment\n"
7319 " 4, 5, 6 // comment\n"
7320 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00007321
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007322 // With nested lists, we should either format one item per line or all nested
7323 // lists one on line.
7324 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007325 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7326 " {aaaaaaaaaaaaaaaaaaa},\n"
7327 " {aaaaaaaaaaaaaaaaaaaaa},\n"
7328 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00007329 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00007330 verifyFormat(
7331 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007332 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7333 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7334 " {aaa, aaa},\n"
7335 " {aaa, aaa},\n"
7336 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7337 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7338 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00007339
7340 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00007341 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007342 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00007343
7344 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00007345
Daniel Jaspereb65e912015-12-21 18:31:15 +00007346 // No braced initializer here.
7347 verifyFormat("void f() {\n"
7348 " struct Dummy {};\n"
7349 " f(v);\n"
7350 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00007351
7352 // Long lists should be formatted in columns even if they are nested.
7353 verifyFormat(
7354 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7355 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7356 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7357 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7358 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7359 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00007360
7361 // Allow "single-column" layout even if that violates the column limit. There
7362 // isn't going to be a better way.
7363 verifyFormat("std::vector<int> a = {\n"
7364 " aaaaaaaa,\n"
7365 " aaaaaaaa,\n"
7366 " aaaaaaaa,\n"
7367 " aaaaaaaa,\n"
7368 " aaaaaaaaaa,\n"
7369 " aaaaaaaa,\n"
7370 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7371 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00007372 verifyFormat("vector<int> aaaa = {\n"
7373 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7374 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7375 " aaaaaa.aaaaaaa,\n"
7376 " aaaaaa.aaaaaaa,\n"
7377 " aaaaaa.aaaaaaa,\n"
7378 " aaaaaa.aaaaaaa,\n"
7379 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007380
7381 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00007382 verifyFormat("someFunction(Param, {List1, List2,\n"
7383 " List3});",
7384 getLLVMStyleWithColumns(35));
7385 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007386 " {List1, List2,\n"
7387 " List3});",
7388 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00007389 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7390 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007391}
7392
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007393TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007394 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007395 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007396
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007397 verifyFormat("void f() { return 42; }");
7398 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007399 " return 42;\n"
7400 "}",
7401 DoNotMerge);
7402 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007403 " // Comment\n"
7404 "}");
7405 verifyFormat("{\n"
7406 "#error {\n"
7407 " int a;\n"
7408 "}");
7409 verifyFormat("{\n"
7410 " int a;\n"
7411 "#error {\n"
7412 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007413 verifyFormat("void f() {} // comment");
7414 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007415 verifyFormat("void f() {\n"
7416 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007417 DoNotMerge);
7418 verifyFormat("void f() {\n"
7419 " int a;\n"
7420 "} // comment",
7421 DoNotMerge);
7422 verifyFormat("void f() {\n"
7423 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007424 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007425
7426 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7427 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7428
7429 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7430 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007431 verifyFormat("class C {\n"
7432 " C()\n"
7433 " : iiiiiiii(nullptr),\n"
7434 " kkkkkkk(nullptr),\n"
7435 " mmmmmmm(nullptr),\n"
7436 " nnnnnnn(nullptr) {}\n"
7437 "};",
7438 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007439
7440 FormatStyle NoColumnLimit = getLLVMStyle();
7441 NoColumnLimit.ColumnLimit = 0;
7442 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7443 EXPECT_EQ("class C {\n"
7444 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007445 "};",
7446 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007447 EXPECT_EQ("A()\n"
7448 " : b(0) {\n"
7449 "}",
7450 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7451
7452 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007453 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7454 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007455 EXPECT_EQ("A()\n"
7456 " : b(0) {\n"
7457 "}",
7458 format("A():b(0){}", DoNotMergeNoColumnLimit));
7459 EXPECT_EQ("A()\n"
7460 " : b(0) {\n"
7461 "}",
7462 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007463
7464 verifyFormat("#define A \\\n"
7465 " void f() { \\\n"
7466 " int i; \\\n"
7467 " }",
7468 getLLVMStyleWithColumns(20));
7469 verifyFormat("#define A \\\n"
7470 " void f() { int i; }",
7471 getLLVMStyleWithColumns(21));
7472 verifyFormat("#define A \\\n"
7473 " void f() { \\\n"
7474 " int i; \\\n"
7475 " } \\\n"
7476 " int j;",
7477 getLLVMStyleWithColumns(22));
7478 verifyFormat("#define A \\\n"
7479 " void f() { int i; } \\\n"
7480 " int j;",
7481 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007482}
7483
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007484TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
7485 FormatStyle MergeEmptyOnly = getLLVMStyle();
7486 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7487 verifyFormat("class C {\n"
7488 " int f() {}\n"
7489 "};",
7490 MergeEmptyOnly);
7491 verifyFormat("class C {\n"
7492 " int f() {\n"
7493 " return 42;\n"
7494 " }\n"
7495 "};",
7496 MergeEmptyOnly);
7497 verifyFormat("int f() {}", MergeEmptyOnly);
7498 verifyFormat("int f() {\n"
7499 " return 42;\n"
7500 "}",
7501 MergeEmptyOnly);
7502
7503 // Also verify behavior when BraceWrapping.AfterFunction = true
7504 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7505 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
7506 verifyFormat("int f() {}", MergeEmptyOnly);
7507 verifyFormat("class C {\n"
7508 " int f() {}\n"
7509 "};",
7510 MergeEmptyOnly);
7511}
7512
Daniel Jasperd74cf402014-04-08 12:46:38 +00007513TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7514 FormatStyle MergeInlineOnly = getLLVMStyle();
7515 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7516 verifyFormat("class C {\n"
7517 " int f() { return 42; }\n"
7518 "};",
7519 MergeInlineOnly);
7520 verifyFormat("int f() {\n"
7521 " return 42;\n"
7522 "}",
7523 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007524
7525 // SFS_Inline implies SFS_Empty
7526 verifyFormat("class C {\n"
7527 " int f() {}\n"
7528 "};",
7529 MergeInlineOnly);
7530 verifyFormat("int f() {}", MergeInlineOnly);
7531
7532 // Also verify behavior when BraceWrapping.AfterFunction = true
7533 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7534 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7535 verifyFormat("class C {\n"
7536 " int f() { return 42; }\n"
7537 "};",
7538 MergeInlineOnly);
7539 verifyFormat("int f()\n"
7540 "{\n"
7541 " return 42;\n"
7542 "}",
7543 MergeInlineOnly);
7544
7545 // SFS_Inline implies SFS_Empty
7546 verifyFormat("int f() {}", MergeInlineOnly);
7547 verifyFormat("class C {\n"
7548 " int f() {}\n"
7549 "};",
7550 MergeInlineOnly);
7551}
7552
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00007553TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
7554 FormatStyle MergeInlineOnly = getLLVMStyle();
7555 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
7556 FormatStyle::SFS_InlineOnly;
7557 verifyFormat("class C {\n"
7558 " int f() { return 42; }\n"
7559 "};",
7560 MergeInlineOnly);
7561 verifyFormat("int f() {\n"
7562 " return 42;\n"
7563 "}",
7564 MergeInlineOnly);
7565
7566 // SFS_InlineOnly does not imply SFS_Empty
7567 verifyFormat("class C {\n"
7568 " int f() {}\n"
7569 "};",
7570 MergeInlineOnly);
7571 verifyFormat("int f() {\n"
7572 "}",
7573 MergeInlineOnly);
7574
7575 // Also verify behavior when BraceWrapping.AfterFunction = true
7576 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7577 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7578 verifyFormat("class C {\n"
7579 " int f() { return 42; }\n"
7580 "};",
7581 MergeInlineOnly);
7582 verifyFormat("int f()\n"
7583 "{\n"
7584 " return 42;\n"
7585 "}",
7586 MergeInlineOnly);
7587
7588 // SFS_InlineOnly does not imply SFS_Empty
7589 verifyFormat("int f()\n"
7590 "{\n"
7591 "}",
7592 MergeInlineOnly);
7593 verifyFormat("class C {\n"
7594 " int f() {}\n"
7595 "};",
7596 MergeInlineOnly);
7597}
7598
Francois Ferrandad722562017-06-30 20:25:55 +00007599TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007600 FormatStyle Style = getLLVMStyle();
7601 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7602 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7603 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00007604 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007605 Style.ColumnLimit = 40;
7606
7607 verifyFormat("int f()\n"
7608 "{}",
7609 Style);
7610 verifyFormat("int f()\n"
7611 "{\n"
7612 " return 42;\n"
7613 "}",
7614 Style);
7615 verifyFormat("int f()\n"
7616 "{\n"
7617 " // some comment\n"
7618 "}",
7619 Style);
7620
7621 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7622 verifyFormat("int f() {}", Style);
7623 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7624 "{}",
7625 Style);
7626 verifyFormat("int f()\n"
7627 "{\n"
7628 " return 0;\n"
7629 "}",
7630 Style);
7631
7632 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7633 verifyFormat("class Foo {\n"
7634 " int f() {}\n"
7635 "};\n",
7636 Style);
7637 verifyFormat("class Foo {\n"
7638 " int f() { return 0; }\n"
7639 "};\n",
7640 Style);
7641 verifyFormat("class Foo {\n"
7642 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7643 " {}\n"
7644 "};\n",
7645 Style);
7646 verifyFormat("class Foo {\n"
7647 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7648 " {\n"
7649 " return 0;\n"
7650 " }\n"
7651 "};\n",
7652 Style);
7653
7654 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7655 verifyFormat("int f() {}", Style);
7656 verifyFormat("int f() { return 0; }", Style);
7657 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7658 "{}",
7659 Style);
7660 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7661 "{\n"
7662 " return 0;\n"
7663 "}",
7664 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00007665}
Krasimir Georgiev6a1c9d52017-10-02 15:53:37 +00007666TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
7667 FormatStyle Style = getLLVMStyle();
7668 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7669 verifyFormat("#ifdef A\n"
7670 "int f() {}\n"
7671 "#else\n"
7672 "int g() {}\n"
7673 "#endif",
7674 Style);
7675}
Daniel Jasperd74cf402014-04-08 12:46:38 +00007676
Francois Ferrandad722562017-06-30 20:25:55 +00007677TEST_F(FormatTest, SplitEmptyClass) {
7678 FormatStyle Style = getLLVMStyle();
7679 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7680 Style.BraceWrapping.AfterClass = true;
7681 Style.BraceWrapping.SplitEmptyRecord = false;
7682
7683 verifyFormat("class Foo\n"
7684 "{};",
7685 Style);
7686 verifyFormat("/* something */ class Foo\n"
7687 "{};",
7688 Style);
7689 verifyFormat("template <typename X> class Foo\n"
7690 "{};",
7691 Style);
7692 verifyFormat("class Foo\n"
7693 "{\n"
7694 " Foo();\n"
7695 "};",
7696 Style);
7697 verifyFormat("typedef class Foo\n"
7698 "{\n"
7699 "} Foo_t;",
7700 Style);
7701}
7702
7703TEST_F(FormatTest, SplitEmptyStruct) {
7704 FormatStyle Style = getLLVMStyle();
7705 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7706 Style.BraceWrapping.AfterStruct = true;
7707 Style.BraceWrapping.SplitEmptyRecord = false;
7708
7709 verifyFormat("struct Foo\n"
7710 "{};",
7711 Style);
7712 verifyFormat("/* something */ struct Foo\n"
7713 "{};",
7714 Style);
7715 verifyFormat("template <typename X> struct Foo\n"
7716 "{};",
7717 Style);
7718 verifyFormat("struct Foo\n"
7719 "{\n"
7720 " Foo();\n"
7721 "};",
7722 Style);
7723 verifyFormat("typedef struct Foo\n"
7724 "{\n"
7725 "} Foo_t;",
7726 Style);
7727 //typedef struct Bar {} Bar_t;
7728}
7729
7730TEST_F(FormatTest, SplitEmptyUnion) {
7731 FormatStyle Style = getLLVMStyle();
7732 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7733 Style.BraceWrapping.AfterUnion = true;
7734 Style.BraceWrapping.SplitEmptyRecord = false;
7735
7736 verifyFormat("union Foo\n"
7737 "{};",
7738 Style);
7739 verifyFormat("/* something */ union Foo\n"
7740 "{};",
7741 Style);
7742 verifyFormat("union Foo\n"
7743 "{\n"
7744 " A,\n"
7745 "};",
7746 Style);
7747 verifyFormat("typedef union Foo\n"
7748 "{\n"
7749 "} Foo_t;",
7750 Style);
7751}
7752
7753TEST_F(FormatTest, SplitEmptyNamespace) {
7754 FormatStyle Style = getLLVMStyle();
7755 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7756 Style.BraceWrapping.AfterNamespace = true;
7757 Style.BraceWrapping.SplitEmptyNamespace = false;
7758
7759 verifyFormat("namespace Foo\n"
7760 "{};",
7761 Style);
7762 verifyFormat("/* something */ namespace Foo\n"
7763 "{};",
7764 Style);
7765 verifyFormat("inline namespace Foo\n"
7766 "{};",
7767 Style);
Sam McCall6f3778c2018-09-05 07:44:02 +00007768 verifyFormat("/* something */ inline namespace Foo\n"
7769 "{};",
7770 Style);
7771 verifyFormat("export namespace Foo\n"
7772 "{};",
7773 Style);
Francois Ferrandad722562017-06-30 20:25:55 +00007774 verifyFormat("namespace Foo\n"
7775 "{\n"
7776 "void Bar();\n"
7777 "};",
7778 Style);
7779}
7780
7781TEST_F(FormatTest, NeverMergeShortRecords) {
7782 FormatStyle Style = getLLVMStyle();
7783
7784 verifyFormat("class Foo {\n"
7785 " Foo();\n"
7786 "};",
7787 Style);
7788 verifyFormat("typedef class Foo {\n"
7789 " Foo();\n"
7790 "} Foo_t;",
7791 Style);
7792 verifyFormat("struct Foo {\n"
7793 " Foo();\n"
7794 "};",
7795 Style);
7796 verifyFormat("typedef struct Foo {\n"
7797 " Foo();\n"
7798 "} Foo_t;",
7799 Style);
7800 verifyFormat("union Foo {\n"
7801 " A,\n"
7802 "};",
7803 Style);
7804 verifyFormat("typedef union Foo {\n"
7805 " A,\n"
7806 "} Foo_t;",
7807 Style);
7808 verifyFormat("namespace Foo {\n"
7809 "void Bar();\n"
7810 "};",
7811 Style);
7812
7813 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7814 Style.BraceWrapping.AfterClass = true;
7815 Style.BraceWrapping.AfterStruct = true;
7816 Style.BraceWrapping.AfterUnion = true;
7817 Style.BraceWrapping.AfterNamespace = true;
7818 verifyFormat("class Foo\n"
7819 "{\n"
7820 " Foo();\n"
7821 "};",
7822 Style);
7823 verifyFormat("typedef class Foo\n"
7824 "{\n"
7825 " Foo();\n"
7826 "} Foo_t;",
7827 Style);
7828 verifyFormat("struct Foo\n"
7829 "{\n"
7830 " Foo();\n"
7831 "};",
7832 Style);
7833 verifyFormat("typedef struct Foo\n"
7834 "{\n"
7835 " Foo();\n"
7836 "} Foo_t;",
7837 Style);
7838 verifyFormat("union Foo\n"
7839 "{\n"
7840 " A,\n"
7841 "};",
7842 Style);
7843 verifyFormat("typedef union Foo\n"
7844 "{\n"
7845 " A,\n"
7846 "} Foo_t;",
7847 Style);
7848 verifyFormat("namespace Foo\n"
7849 "{\n"
7850 "void Bar();\n"
7851 "};",
7852 Style);
7853}
7854
Manuel Klimeke01bab52013-01-15 13:38:33 +00007855TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7856 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007857 verifyFormat("struct foo a = {bar};\nint n;");
7858 verifyFormat("class foo a = {bar};\nint n;");
7859 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007860
7861 // Elaborate types inside function definitions.
7862 verifyFormat("struct foo f() {}\nint n;");
7863 verifyFormat("class foo f() {}\nint n;");
7864 verifyFormat("union foo f() {}\nint n;");
7865
7866 // Templates.
7867 verifyFormat("template <class X> void f() {}\nint n;");
7868 verifyFormat("template <struct X> void f() {}\nint n;");
7869 verifyFormat("template <union X> void f() {}\nint n;");
7870
7871 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007872 verifyFormat("struct {\n} n;");
7873 verifyFormat(
7874 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007875 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007876 verifyFormat("class MACRO Z {\n} n;");
7877 verifyFormat("class MACRO(X) Z {\n} n;");
7878 verifyFormat("class __attribute__(X) Z {\n} n;");
7879 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007880 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007881 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007882 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7883 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007884
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007885 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007886 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007887
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007888 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007889 verifyFormat(
7890 "template <typename F>\n"
7891 "Matcher(const Matcher<F> &Other,\n"
7892 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7893 " !is_same<F, T>::value>::type * = 0)\n"
7894 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7895
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007896 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007897 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007898 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007899
7900 // FIXME:
7901 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007902 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007903
Manuel Klimeke01bab52013-01-15 13:38:33 +00007904 // Elaborate types where incorrectly parsing the structural element would
7905 // break the indent.
7906 verifyFormat("if (true)\n"
7907 " class X x;\n"
7908 "else\n"
7909 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007910
7911 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007912 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007913}
7914
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007915TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007916 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7917 format("#error Leave all white!!!!! space* alone!\n"));
7918 EXPECT_EQ(
7919 "#warning Leave all white!!!!! space* alone!\n",
7920 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007921 EXPECT_EQ("#error 1", format(" # error 1"));
7922 EXPECT_EQ("#warning 1", format(" # warning 1"));
7923}
7924
Daniel Jasper4431aa92013-04-23 13:54:04 +00007925TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007926 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007927 verifyFormat("#if (AAAA && BBBB)");
7928 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007929 // FIXME: Come up with a better indentation for #elif.
7930 verifyFormat(
7931 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7932 " defined(BBBBBBBB)\n"
7933 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7934 " defined(BBBBBBBB)\n"
7935 "#endif",
7936 getLLVMStyleWithColumns(65));
7937}
7938
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007939TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7940 FormatStyle AllowsMergedIf = getGoogleStyle();
7941 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7942 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7943 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007944 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7945 EXPECT_EQ("if (true) return 42;",
7946 format("if (true)\nreturn 42;", AllowsMergedIf));
7947 FormatStyle ShortMergedIf = AllowsMergedIf;
7948 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007949 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007950 " if (true) return 42;",
7951 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007952 verifyFormat("#define A \\\n"
7953 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007954 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007955 "#define B",
7956 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007957 verifyFormat("#define A \\\n"
7958 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007959 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007960 "g();",
7961 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007962 verifyFormat("{\n"
7963 "#ifdef A\n"
7964 " // Comment\n"
7965 " if (true) continue;\n"
7966 "#endif\n"
7967 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007968 " if (true) continue;\n"
7969 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007970 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007971 ShortMergedIf.ColumnLimit = 33;
7972 verifyFormat("#define A \\\n"
7973 " if constexpr (true) return 42;",
7974 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007975 ShortMergedIf.ColumnLimit = 29;
7976 verifyFormat("#define A \\\n"
7977 " if (aaaaaaaaaa) return 1; \\\n"
7978 " return 2;",
7979 ShortMergedIf);
7980 ShortMergedIf.ColumnLimit = 28;
7981 verifyFormat("#define A \\\n"
7982 " if (aaaaaaaaaa) \\\n"
7983 " return 1; \\\n"
7984 " return 2;",
7985 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007986 verifyFormat("#define A \\\n"
7987 " if constexpr (aaaaaaa) \\\n"
7988 " return 1; \\\n"
7989 " return 2;",
7990 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007991}
7992
Manuel Klimekd33516e2013-01-23 10:09:28 +00007993TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007994 verifyFormat("void f(int *a);");
7995 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007996 verifyFormat("class A {\n void f(int *a);\n};");
7997 verifyFormat("class A {\n int *a;\n};");
7998 verifyFormat("namespace a {\n"
7999 "namespace b {\n"
8000 "class A {\n"
8001 " void f() {}\n"
8002 " int *a;\n"
8003 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00008004 "} // namespace b\n"
8005 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00008006}
8007
Manuel Klimekd33516e2013-01-23 10:09:28 +00008008TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
8009 verifyFormat("while");
8010 verifyFormat("operator");
8011}
8012
Daniel Jasperfda47cd2016-10-31 13:23:00 +00008013TEST_F(FormatTest, SkipsDeeplyNestedLines) {
8014 // This code would be painfully slow to format if we didn't skip it.
8015 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
8016 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8017 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8018 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8019 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8020 "A(1, 1)\n"
8021 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
8022 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8023 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8024 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8025 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8026 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8027 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8028 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8029 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8030 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
8031 // Deeply nested part is untouched, rest is formatted.
8032 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
8033 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00008034 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00008035}
8036
Nico Weber7e6a7a12013-01-08 17:56:31 +00008037//===----------------------------------------------------------------------===//
8038// Objective-C tests.
8039//===----------------------------------------------------------------------===//
8040
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008041TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
8042 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
8043 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
8044 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00008045 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008046 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
8047 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
8048 format("-(NSInteger)Method3:(id)anObject;"));
8049 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
8050 format("-(NSInteger)Method4:(id)anObject;"));
8051 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
8052 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
8053 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
8054 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00008055 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8056 "forAllCells:(BOOL)flag;",
8057 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8058 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00008059
8060 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00008061 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
8062 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00008063 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
8064 " inRange:(NSRange)range\n"
8065 " outRange:(NSRange)out_range\n"
8066 " outRange1:(NSRange)out_range1\n"
8067 " outRange2:(NSRange)out_range2\n"
8068 " outRange3:(NSRange)out_range3\n"
8069 " outRange4:(NSRange)out_range4\n"
8070 " outRange5:(NSRange)out_range5\n"
8071 " outRange6:(NSRange)out_range6\n"
8072 " outRange7:(NSRange)out_range7\n"
8073 " outRange8:(NSRange)out_range8\n"
8074 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00008075
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008076 // When the function name has to be wrapped.
8077 FormatStyle Style = getLLVMStyle();
Ben Hamilton416348e2018-04-12 15:11:48 +00008078 // ObjC ignores IndentWrappedFunctionNames when wrapping methods
8079 // and always indents instead.
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008080 Style.IndentWrappedFunctionNames = false;
8081 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
Ben Hamilton416348e2018-04-12 15:11:48 +00008082 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
8083 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008084 "}",
8085 Style);
8086 Style.IndentWrappedFunctionNames = true;
8087 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
Ben Hamilton416348e2018-04-12 15:11:48 +00008088 " veryLooooooooooongName:(NSString)cccccccccccccc\n"
8089 " anotherName:(NSString)dddddddddddddd {\n"
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008090 "}",
8091 Style);
8092
Nico Weberd6f962f2013-01-10 20:18:33 +00008093 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00008094 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00008095 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
8096 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00008097 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00008098
Daniel Jasper37194282013-05-28 08:33:00 +00008099 verifyFormat("- (int (*)())foo:(int (*)())f;");
8100 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00008101
8102 // If there's no return type (very rare in practice!), LLVM and Google style
8103 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00008104 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00008105 verifyFormat("- foo:(int)f;");
8106 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008107}
8108
Nico Weber0588b502013-02-07 00:19:29 +00008109
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008110TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00008111 EXPECT_EQ("\"some text \"\n"
8112 "\"other\";",
8113 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00008114 EXPECT_EQ("\"some text \"\n"
8115 "\"other\";",
8116 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008117 EXPECT_EQ(
8118 "#define A \\\n"
8119 " \"some \" \\\n"
8120 " \"text \" \\\n"
8121 " \"other\";",
8122 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
8123 EXPECT_EQ(
8124 "#define A \\\n"
8125 " \"so \" \\\n"
8126 " \"text \" \\\n"
8127 " \"other\";",
8128 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
8129
8130 EXPECT_EQ("\"some text\"",
8131 format("\"some text\"", getLLVMStyleWithColumns(1)));
8132 EXPECT_EQ("\"some text\"",
8133 format("\"some text\"", getLLVMStyleWithColumns(11)));
8134 EXPECT_EQ("\"some \"\n"
8135 "\"text\"",
8136 format("\"some text\"", getLLVMStyleWithColumns(10)));
8137 EXPECT_EQ("\"some \"\n"
8138 "\"text\"",
8139 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00008140 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008141 "\" tex\"\n"
8142 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008143 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00008144 EXPECT_EQ("\"some\"\n"
8145 "\" tex\"\n"
8146 "\" and\"",
8147 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
8148 EXPECT_EQ("\"some\"\n"
8149 "\"/tex\"\n"
8150 "\"/and\"",
8151 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008152
8153 EXPECT_EQ("variable =\n"
8154 " \"long string \"\n"
8155 " \"literal\";",
8156 format("variable = \"long string literal\";",
8157 getLLVMStyleWithColumns(20)));
8158
8159 EXPECT_EQ("variable = f(\n"
8160 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00008161 " \"literal\",\n"
8162 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00008163 " loooooooooooooooooooong);",
8164 format("variable = f(\"long string literal\", short, "
8165 "loooooooooooooooooooong);",
8166 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008167
Daniel Jaspera44991332015-04-29 13:06:49 +00008168 EXPECT_EQ(
8169 "f(g(\"long string \"\n"
8170 " \"literal\"),\n"
8171 " b);",
8172 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008173 EXPECT_EQ("f(g(\"long string \"\n"
8174 " \"literal\",\n"
8175 " a),\n"
8176 " b);",
8177 format("f(g(\"long string literal\", a), b);",
8178 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008179 EXPECT_EQ(
8180 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00008181 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008182 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8183 EXPECT_EQ("f(\"one two three four five six \"\n"
8184 " \"seven\".split(\n"
8185 " really_looooong_variable));",
8186 format("f(\"one two three four five six seven\"."
8187 "split(really_looooong_variable));",
8188 getLLVMStyleWithColumns(33)));
8189
8190 EXPECT_EQ("f(\"some \"\n"
8191 " \"text\",\n"
8192 " other);",
8193 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008194
8195 // Only break as a last resort.
8196 verifyFormat(
8197 "aaaaaaaaaaaaaaaaaaaa(\n"
8198 " aaaaaaaaaaaaaaaaaaaa,\n"
8199 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008200
Daniel Jaspera44991332015-04-29 13:06:49 +00008201 EXPECT_EQ("\"splitmea\"\n"
8202 "\"trandomp\"\n"
8203 "\"oint\"",
8204 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008205
Daniel Jaspera44991332015-04-29 13:06:49 +00008206 EXPECT_EQ("\"split/\"\n"
8207 "\"pathat/\"\n"
8208 "\"slashes\"",
8209 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008210
Daniel Jaspera44991332015-04-29 13:06:49 +00008211 EXPECT_EQ("\"split/\"\n"
8212 "\"pathat/\"\n"
8213 "\"slashes\"",
8214 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008215 EXPECT_EQ("\"split at \"\n"
8216 "\"spaces/at/\"\n"
8217 "\"slashes.at.any$\"\n"
8218 "\"non-alphanumeric%\"\n"
8219 "\"1111111111characte\"\n"
8220 "\"rs\"",
8221 format("\"split at "
8222 "spaces/at/"
8223 "slashes.at."
8224 "any$non-"
8225 "alphanumeric%"
8226 "1111111111characte"
8227 "rs\"",
8228 getLLVMStyleWithColumns(20)));
8229
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008230 // Verify that splitting the strings understands
8231 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008232 EXPECT_EQ(
8233 "aaaaaaaaaaaa(\n"
8234 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8235 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8236 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8237 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8238 "aaaaaaaaaaaaaaaaaaaaaa\");",
8239 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008240 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8241 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8242 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8243 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8244 "aaaaaaaaaaaaaaaaaaaaaa\";",
8245 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008246 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8247 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8248 format("llvm::outs() << "
8249 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8250 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008251 EXPECT_EQ("ffff(\n"
8252 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8253 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8254 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8255 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8256 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008257
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008258 FormatStyle Style = getLLVMStyleWithColumns(12);
8259 Style.BreakStringLiterals = false;
8260 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8261
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008262 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008263 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00008264 EXPECT_EQ("#define A \\\n"
8265 " \"some \" \\\n"
8266 " \"text \" \\\n"
8267 " \"other\";",
8268 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008269}
8270
Manuel Klimek93699f42017-11-29 14:29:43 +00008271TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
8272 EXPECT_EQ("C a = \"some more \"\n"
8273 " \"text\";",
8274 format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
8275}
8276
Manuel Klimek9e321992015-07-28 15:50:24 +00008277TEST_F(FormatTest, FullyRemoveEmptyLines) {
8278 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8279 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8280 EXPECT_EQ("int i = a(b());",
8281 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8282}
8283
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008284TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8285 EXPECT_EQ(
8286 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8287 "(\n"
8288 " \"x\t\");",
8289 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8290 "aaaaaaa("
8291 "\"x\t\");"));
8292}
8293
Daniel Jasper174b0122014-01-09 14:18:12 +00008294TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008295 EXPECT_EQ(
8296 "u8\"utf8 string \"\n"
8297 "u8\"literal\";",
8298 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8299 EXPECT_EQ(
8300 "u\"utf16 string \"\n"
8301 "u\"literal\";",
8302 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8303 EXPECT_EQ(
8304 "U\"utf32 string \"\n"
8305 "U\"literal\";",
8306 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8307 EXPECT_EQ("L\"wide string \"\n"
8308 "L\"literal\";",
8309 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008310 EXPECT_EQ("@\"NSString \"\n"
8311 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008312 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00008313 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008314
8315 // This input makes clang-format try to split the incomplete unicode escape
8316 // sequence, which used to lead to a crasher.
8317 verifyNoCrash(
8318 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8319 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008320}
8321
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008322TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8323 FormatStyle Style = getGoogleStyleWithColumns(15);
8324 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8325 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8326 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8327 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8328 EXPECT_EQ("u8R\"x(raw literal)x\";",
8329 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008330}
8331
8332TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8333 FormatStyle Style = getLLVMStyleWithColumns(20);
8334 EXPECT_EQ(
8335 "_T(\"aaaaaaaaaaaaaa\")\n"
8336 "_T(\"aaaaaaaaaaaaaa\")\n"
8337 "_T(\"aaaaaaaaaaaa\")",
8338 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00008339 EXPECT_EQ("f(x,\n"
8340 " _T(\"aaaaaaaaaaaa\")\n"
8341 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00008342 " z);",
8343 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8344
8345 // FIXME: Handle embedded spaces in one iteration.
8346 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8347 // "_T(\"aaaaaaaaaaaaa\")\n"
8348 // "_T(\"aaaaaaaaaaaaa\")\n"
8349 // "_T(\"a\")",
8350 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8351 // getLLVMStyleWithColumns(20)));
8352 EXPECT_EQ(
8353 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8354 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008355 EXPECT_EQ("f(\n"
8356 "#if !TEST\n"
8357 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8358 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00008359 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008360 format("f(\n"
8361 "#if !TEST\n"
8362 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8363 "#endif\n"
8364 ");"));
8365 EXPECT_EQ("f(\n"
8366 "\n"
8367 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8368 format("f(\n"
8369 "\n"
8370 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008371}
8372
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00008373TEST_F(FormatTest, BreaksStringLiteralOperands) {
8374 // In a function call with two operands, the second can be broken with no line
8375 // break before it.
8376 EXPECT_EQ("func(a, \"long long \"\n"
8377 " \"long long\");",
8378 format("func(a, \"long long long long\");",
8379 getLLVMStyleWithColumns(24)));
8380 // In a function call with three operands, the second must be broken with a
8381 // line break before it.
8382 EXPECT_EQ("func(a,\n"
8383 " \"long long long \"\n"
8384 " \"long\",\n"
8385 " c);",
8386 format("func(a, \"long long long long\", c);",
8387 getLLVMStyleWithColumns(24)));
8388 // In a function call with three operands, the third must be broken with a
8389 // line break before it.
8390 EXPECT_EQ("func(a, b,\n"
8391 " \"long long long \"\n"
8392 " \"long\");",
8393 format("func(a, b, \"long long long long\");",
8394 getLLVMStyleWithColumns(24)));
8395 // In a function call with three operands, both the second and the third must
8396 // be broken with a line break before them.
8397 EXPECT_EQ("func(a,\n"
8398 " \"long long long \"\n"
8399 " \"long\",\n"
8400 " \"long long long \"\n"
8401 " \"long\");",
8402 format("func(a, \"long long long long\", \"long long long long\");",
8403 getLLVMStyleWithColumns(24)));
8404 // In a chain of << with two operands, the second can be broken with no line
8405 // break before it.
8406 EXPECT_EQ("a << \"line line \"\n"
8407 " \"line\";",
8408 format("a << \"line line line\";",
8409 getLLVMStyleWithColumns(20)));
8410 // In a chain of << with three operands, the second can be broken with no line
8411 // break before it.
8412 EXPECT_EQ("abcde << \"line \"\n"
8413 " \"line line\"\n"
8414 " << c;",
8415 format("abcde << \"line line line\" << c;",
8416 getLLVMStyleWithColumns(20)));
8417 // In a chain of << with three operands, the third must be broken with a line
8418 // break before it.
8419 EXPECT_EQ("a << b\n"
8420 " << \"line line \"\n"
8421 " \"line\";",
8422 format("a << b << \"line line line\";",
8423 getLLVMStyleWithColumns(20)));
8424 // In a chain of << with three operands, the second can be broken with no line
8425 // break before it and the third must be broken with a line break before it.
8426 EXPECT_EQ("abcd << \"line line \"\n"
8427 " \"line\"\n"
8428 " << \"line line \"\n"
8429 " \"line\";",
8430 format("abcd << \"line line line\" << \"line line line\";",
8431 getLLVMStyleWithColumns(20)));
8432 // In a chain of binary operators with two operands, the second can be broken
8433 // with no line break before it.
8434 EXPECT_EQ("abcd + \"line line \"\n"
8435 " \"line line\";",
8436 format("abcd + \"line line line line\";",
8437 getLLVMStyleWithColumns(20)));
8438 // In a chain of binary operators with three operands, the second must be
8439 // broken with a line break before it.
8440 EXPECT_EQ("abcd +\n"
8441 " \"line line \"\n"
8442 " \"line line\" +\n"
8443 " e;",
8444 format("abcd + \"line line line line\" + e;",
8445 getLLVMStyleWithColumns(20)));
8446 // In a function call with two operands, with AlignAfterOpenBracket enabled,
8447 // the first must be broken with a line break before it.
8448 FormatStyle Style = getLLVMStyleWithColumns(25);
8449 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8450 EXPECT_EQ("someFunction(\n"
8451 " \"long long long \"\n"
8452 " \"long\",\n"
8453 " a);",
8454 format("someFunction(\"long long long long\", a);", Style));
8455}
8456
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008457TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008458 EXPECT_EQ(
8459 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8460 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8461 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8462 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8463 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8464 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8465}
8466
8467TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8468 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008469 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008470 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8471 "multiline raw string literal xxxxxxxxxxxxxx\n"
8472 ")x\",\n"
8473 " a),\n"
8474 " b);",
8475 format("fffffffffff(g(R\"x(\n"
8476 "multiline raw string literal xxxxxxxxxxxxxx\n"
8477 ")x\", a), b);",
8478 getGoogleStyleWithColumns(20)));
8479 EXPECT_EQ("fffffffffff(\n"
8480 " g(R\"x(qqq\n"
8481 "multiline raw string literal xxxxxxxxxxxxxx\n"
8482 ")x\",\n"
8483 " a),\n"
8484 " b);",
8485 format("fffffffffff(g(R\"x(qqq\n"
8486 "multiline raw string literal xxxxxxxxxxxxxx\n"
8487 ")x\", a), b);",
8488 getGoogleStyleWithColumns(20)));
8489
8490 EXPECT_EQ("fffffffffff(R\"x(\n"
8491 "multiline raw string literal xxxxxxxxxxxxxx\n"
8492 ")x\");",
8493 format("fffffffffff(R\"x(\n"
8494 "multiline raw string literal xxxxxxxxxxxxxx\n"
8495 ")x\");",
8496 getGoogleStyleWithColumns(20)));
8497 EXPECT_EQ("fffffffffff(R\"x(\n"
8498 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008499 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008500 format("fffffffffff(R\"x(\n"
8501 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008502 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008503 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008504 EXPECT_EQ("fffffffffff(\n"
8505 " R\"x(\n"
8506 "multiline raw string literal xxxxxxxxxxxxxx\n"
8507 ")x\" +\n"
8508 " bbbbbb);",
8509 format("fffffffffff(\n"
8510 " R\"x(\n"
8511 "multiline raw string literal xxxxxxxxxxxxxx\n"
8512 ")x\" + bbbbbb);",
8513 getGoogleStyleWithColumns(20)));
Daniel Jasperfd327672018-03-22 14:43:54 +00008514 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
8515 format("fffffffffff(\n"
8516 " R\"(single line raw string)\" + bbbbbb);"));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008517}
8518
Alexander Kornienkobe633902013-06-14 11:46:10 +00008519TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008520 verifyFormat("string a = \"unterminated;");
8521 EXPECT_EQ("function(\"unterminated,\n"
8522 " OtherParameter);",
8523 format("function( \"unterminated,\n"
8524 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008525}
8526
8527TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008528 FormatStyle Style = getLLVMStyle();
8529 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008530 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008531 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008532}
8533
Daniel Jaspera44991332015-04-29 13:06:49 +00008534TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008535
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008536TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8537 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8538 " \"ddeeefff\");",
8539 format("someFunction(\"aaabbbcccdddeeefff\");",
8540 getLLVMStyleWithColumns(25)));
8541 EXPECT_EQ("someFunction1234567890(\n"
8542 " \"aaabbbcccdddeeefff\");",
8543 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8544 getLLVMStyleWithColumns(26)));
8545 EXPECT_EQ("someFunction1234567890(\n"
8546 " \"aaabbbcccdddeeeff\"\n"
8547 " \"f\");",
8548 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8549 getLLVMStyleWithColumns(25)));
8550 EXPECT_EQ("someFunction1234567890(\n"
8551 " \"aaabbbcccdddeeeff\"\n"
8552 " \"f\");",
8553 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8554 getLLVMStyleWithColumns(24)));
Manuel Klimek77866142017-11-17 11:17:15 +00008555 EXPECT_EQ("someFunction(\n"
8556 " \"aaabbbcc ddde \"\n"
8557 " \"efff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008558 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008559 getLLVMStyleWithColumns(25)));
8560 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8561 " \"ddeeefff\");",
8562 format("someFunction(\"aaabbbccc ddeeefff\");",
8563 getLLVMStyleWithColumns(25)));
8564 EXPECT_EQ("someFunction1234567890(\n"
8565 " \"aaabb \"\n"
8566 " \"cccdddeeefff\");",
8567 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8568 getLLVMStyleWithColumns(25)));
8569 EXPECT_EQ("#define A \\\n"
8570 " string s = \\\n"
8571 " \"123456789\" \\\n"
8572 " \"0\"; \\\n"
8573 " int i;",
8574 format("#define A string s = \"1234567890\"; int i;",
8575 getLLVMStyleWithColumns(20)));
Manuel Klimek77866142017-11-17 11:17:15 +00008576 EXPECT_EQ("someFunction(\n"
8577 " \"aaabbbcc \"\n"
8578 " \"dddeeefff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008579 format("someFunction(\"aaabbbcc dddeeefff\");",
8580 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008581}
8582
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008583TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008584 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8585 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008586 EXPECT_EQ("\"test\"\n"
8587 "\"\\n\"",
8588 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8589 EXPECT_EQ("\"tes\\\\\"\n"
8590 "\"n\"",
8591 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8592 EXPECT_EQ("\"\\\\\\\\\"\n"
8593 "\"\\n\"",
8594 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008595 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008596 EXPECT_EQ("\"\\uff01\"\n"
8597 "\"test\"",
8598 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8599 EXPECT_EQ("\"\\Uff01ff02\"",
8600 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8601 EXPECT_EQ("\"\\x000000000001\"\n"
8602 "\"next\"",
8603 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8604 EXPECT_EQ("\"\\x000000000001next\"",
8605 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8606 EXPECT_EQ("\"\\x000000000001\"",
8607 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8608 EXPECT_EQ("\"test\"\n"
8609 "\"\\000000\"\n"
8610 "\"000001\"",
8611 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8612 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008613 "\"00000000\"\n"
8614 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008615 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008616}
8617
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008618TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8619 verifyFormat("void f() {\n"
8620 " return g() {}\n"
8621 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008622 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008623 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008624 "}");
8625}
8626
Manuel Klimek421147e2014-01-24 09:25:23 +00008627TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8628 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008629 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008630}
8631
Manuel Klimek13b97d82013-05-13 08:42:42 +00008632TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8633 verifyFormat("class X {\n"
8634 " void f() {\n"
8635 " }\n"
8636 "};",
8637 getLLVMStyleWithColumns(12));
8638}
8639
8640TEST_F(FormatTest, ConfigurableIndentWidth) {
8641 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8642 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008643 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008644 verifyFormat("void f() {\n"
8645 " someFunction();\n"
8646 " if (true) {\n"
8647 " f();\n"
8648 " }\n"
8649 "}",
8650 EightIndent);
8651 verifyFormat("class X {\n"
8652 " void f() {\n"
8653 " }\n"
8654 "};",
8655 EightIndent);
8656 verifyFormat("int x[] = {\n"
8657 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008658 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008659 EightIndent);
8660}
8661
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008662TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008663 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008664 "f();",
8665 getLLVMStyleWithColumns(8));
8666}
8667
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008668TEST_F(FormatTest, ConfigurableUseOfTab) {
8669 FormatStyle Tab = getLLVMStyleWithColumns(42);
8670 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008671 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008672 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008673
8674 EXPECT_EQ("if (aaaaaaaa && // q\n"
8675 " bb)\t\t// w\n"
8676 "\t;",
8677 format("if (aaaaaaaa &&// q\n"
8678 "bb)// w\n"
8679 ";",
8680 Tab));
8681 EXPECT_EQ("if (aaa && bbb) // w\n"
8682 "\t;",
8683 format("if(aaa&&bbb)// w\n"
8684 ";",
8685 Tab));
8686
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008687 verifyFormat("class X {\n"
8688 "\tvoid f() {\n"
8689 "\t\tsomeFunction(parameter1,\n"
8690 "\t\t\t parameter2);\n"
8691 "\t}\n"
8692 "};",
8693 Tab);
8694 verifyFormat("#define A \\\n"
8695 "\tvoid f() { \\\n"
8696 "\t\tsomeFunction( \\\n"
8697 "\t\t parameter1, \\\n"
8698 "\t\t parameter2); \\\n"
8699 "\t}",
8700 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008701
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008702 Tab.TabWidth = 4;
8703 Tab.IndentWidth = 8;
8704 verifyFormat("class TabWidth4Indent8 {\n"
8705 "\t\tvoid f() {\n"
8706 "\t\t\t\tsomeFunction(parameter1,\n"
8707 "\t\t\t\t\t\t\t parameter2);\n"
8708 "\t\t}\n"
8709 "};",
8710 Tab);
8711
8712 Tab.TabWidth = 4;
8713 Tab.IndentWidth = 4;
8714 verifyFormat("class TabWidth4Indent4 {\n"
8715 "\tvoid f() {\n"
8716 "\t\tsomeFunction(parameter1,\n"
8717 "\t\t\t\t\t parameter2);\n"
8718 "\t}\n"
8719 "};",
8720 Tab);
8721
8722 Tab.TabWidth = 8;
8723 Tab.IndentWidth = 4;
8724 verifyFormat("class TabWidth8Indent4 {\n"
8725 " void f() {\n"
8726 "\tsomeFunction(parameter1,\n"
8727 "\t\t parameter2);\n"
8728 " }\n"
8729 "};",
8730 Tab);
8731
Alexander Kornienko39856b72013-09-10 09:38:25 +00008732 Tab.TabWidth = 8;
8733 Tab.IndentWidth = 8;
8734 EXPECT_EQ("/*\n"
8735 "\t a\t\tcomment\n"
8736 "\t in multiple lines\n"
8737 " */",
8738 format(" /*\t \t \n"
8739 " \t \t a\t\tcomment\t \t\n"
8740 " \t \t in multiple lines\t\n"
8741 " \t */",
8742 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008743
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008744 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008745 verifyFormat("{\n"
8746 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8747 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8748 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8749 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8750 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8751 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008752 "};",
8753 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008754 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008755 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008756 "\ta2,\n"
8757 "\ta3\n"
8758 "};",
8759 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008760 EXPECT_EQ("if (aaaaaaaa && // q\n"
8761 " bb) // w\n"
8762 "\t;",
8763 format("if (aaaaaaaa &&// q\n"
8764 "bb)// w\n"
8765 ";",
8766 Tab));
8767 verifyFormat("class X {\n"
8768 "\tvoid f() {\n"
8769 "\t\tsomeFunction(parameter1,\n"
8770 "\t\t parameter2);\n"
8771 "\t}\n"
8772 "};",
8773 Tab);
8774 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008775 "\tQ(\n"
8776 "\t {\n"
8777 "\t\t int a;\n"
8778 "\t\t someFunction(aaaaaaaa,\n"
8779 "\t\t bbbbbbb);\n"
8780 "\t },\n"
8781 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008782 "}",
8783 Tab);
8784 EXPECT_EQ("{\n"
8785 "\t/* aaaa\n"
8786 "\t bbbb */\n"
8787 "}",
8788 format("{\n"
8789 "/* aaaa\n"
8790 " bbbb */\n"
8791 "}",
8792 Tab));
8793 EXPECT_EQ("{\n"
8794 "\t/*\n"
8795 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8796 "\t bbbbbbbbbbbbb\n"
8797 "\t*/\n"
8798 "}",
8799 format("{\n"
8800 "/*\n"
8801 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8802 "*/\n"
8803 "}",
8804 Tab));
8805 EXPECT_EQ("{\n"
8806 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8807 "\t// bbbbbbbbbbbbb\n"
8808 "}",
8809 format("{\n"
8810 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8811 "}",
8812 Tab));
8813 EXPECT_EQ("{\n"
8814 "\t/*\n"
8815 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8816 "\t bbbbbbbbbbbbb\n"
8817 "\t*/\n"
8818 "}",
8819 format("{\n"
8820 "\t/*\n"
8821 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8822 "\t*/\n"
8823 "}",
8824 Tab));
8825 EXPECT_EQ("{\n"
8826 "\t/*\n"
8827 "\n"
8828 "\t*/\n"
8829 "}",
8830 format("{\n"
8831 "\t/*\n"
8832 "\n"
8833 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008834 "}",
8835 Tab));
8836 EXPECT_EQ("{\n"
8837 "\t/*\n"
8838 " asdf\n"
8839 "\t*/\n"
8840 "}",
8841 format("{\n"
8842 "\t/*\n"
8843 " asdf\n"
8844 "\t*/\n"
8845 "}",
8846 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008847
8848 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008849 EXPECT_EQ("/*\n"
8850 " a\t\tcomment\n"
8851 " in multiple lines\n"
8852 " */",
8853 format(" /*\t \t \n"
8854 " \t \t a\t\tcomment\t \t\n"
8855 " \t \t in multiple lines\t\n"
8856 " \t */",
8857 Tab));
8858 EXPECT_EQ("/* some\n"
8859 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008860 format(" \t \t /* some\n"
8861 " \t \t comment */",
8862 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008863 EXPECT_EQ("int a; /* some\n"
8864 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008865 format(" \t \t int a; /* some\n"
8866 " \t \t comment */",
8867 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008868
Alexander Kornienko39856b72013-09-10 09:38:25 +00008869 EXPECT_EQ("int a; /* some\n"
8870 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008871 format(" \t \t int\ta; /* some\n"
8872 " \t \t comment */",
8873 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008874 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8875 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008876 format(" \t \t f(\"\t\t\"); /* some\n"
8877 " \t \t comment */",
8878 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008879 EXPECT_EQ("{\n"
8880 " /*\n"
8881 " * Comment\n"
8882 " */\n"
8883 " int i;\n"
8884 "}",
8885 format("{\n"
8886 "\t/*\n"
8887 "\t * Comment\n"
8888 "\t */\n"
8889 "\t int i;\n"
8890 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008891
8892 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8893 Tab.TabWidth = 8;
8894 Tab.IndentWidth = 8;
8895 EXPECT_EQ("if (aaaaaaaa && // q\n"
8896 " bb) // w\n"
8897 "\t;",
8898 format("if (aaaaaaaa &&// q\n"
8899 "bb)// w\n"
8900 ";",
8901 Tab));
8902 EXPECT_EQ("if (aaa && bbb) // w\n"
8903 "\t;",
8904 format("if(aaa&&bbb)// w\n"
8905 ";",
8906 Tab));
8907 verifyFormat("class X {\n"
8908 "\tvoid f() {\n"
8909 "\t\tsomeFunction(parameter1,\n"
8910 "\t\t\t parameter2);\n"
8911 "\t}\n"
8912 "};",
8913 Tab);
8914 verifyFormat("#define A \\\n"
8915 "\tvoid f() { \\\n"
8916 "\t\tsomeFunction( \\\n"
8917 "\t\t parameter1, \\\n"
8918 "\t\t parameter2); \\\n"
8919 "\t}",
8920 Tab);
8921 Tab.TabWidth = 4;
8922 Tab.IndentWidth = 8;
8923 verifyFormat("class TabWidth4Indent8 {\n"
8924 "\t\tvoid f() {\n"
8925 "\t\t\t\tsomeFunction(parameter1,\n"
8926 "\t\t\t\t\t\t\t parameter2);\n"
8927 "\t\t}\n"
8928 "};",
8929 Tab);
8930 Tab.TabWidth = 4;
8931 Tab.IndentWidth = 4;
8932 verifyFormat("class TabWidth4Indent4 {\n"
8933 "\tvoid f() {\n"
8934 "\t\tsomeFunction(parameter1,\n"
8935 "\t\t\t\t\t parameter2);\n"
8936 "\t}\n"
8937 "};",
8938 Tab);
8939 Tab.TabWidth = 8;
8940 Tab.IndentWidth = 4;
8941 verifyFormat("class TabWidth8Indent4 {\n"
8942 " void f() {\n"
8943 "\tsomeFunction(parameter1,\n"
8944 "\t\t parameter2);\n"
8945 " }\n"
8946 "};",
8947 Tab);
8948 Tab.TabWidth = 8;
8949 Tab.IndentWidth = 8;
8950 EXPECT_EQ("/*\n"
8951 "\t a\t\tcomment\n"
8952 "\t in multiple lines\n"
8953 " */",
8954 format(" /*\t \t \n"
8955 " \t \t a\t\tcomment\t \t\n"
8956 " \t \t in multiple lines\t\n"
8957 " \t */",
8958 Tab));
8959 verifyFormat("{\n"
8960 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8961 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8962 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8963 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8964 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8965 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8966 "};",
8967 Tab);
8968 verifyFormat("enum AA {\n"
8969 "\ta1, // Force multiple lines\n"
8970 "\ta2,\n"
8971 "\ta3\n"
8972 "};",
8973 Tab);
8974 EXPECT_EQ("if (aaaaaaaa && // q\n"
8975 " bb) // w\n"
8976 "\t;",
8977 format("if (aaaaaaaa &&// q\n"
8978 "bb)// w\n"
8979 ";",
8980 Tab));
8981 verifyFormat("class X {\n"
8982 "\tvoid f() {\n"
8983 "\t\tsomeFunction(parameter1,\n"
8984 "\t\t\t parameter2);\n"
8985 "\t}\n"
8986 "};",
8987 Tab);
8988 verifyFormat("{\n"
8989 "\tQ(\n"
8990 "\t {\n"
8991 "\t\t int a;\n"
8992 "\t\t someFunction(aaaaaaaa,\n"
8993 "\t\t\t\t bbbbbbb);\n"
8994 "\t },\n"
8995 "\t p);\n"
8996 "}",
8997 Tab);
8998 EXPECT_EQ("{\n"
8999 "\t/* aaaa\n"
9000 "\t bbbb */\n"
9001 "}",
9002 format("{\n"
9003 "/* aaaa\n"
9004 " bbbb */\n"
9005 "}",
9006 Tab));
9007 EXPECT_EQ("{\n"
9008 "\t/*\n"
9009 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9010 "\t bbbbbbbbbbbbb\n"
9011 "\t*/\n"
9012 "}",
9013 format("{\n"
9014 "/*\n"
9015 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9016 "*/\n"
9017 "}",
9018 Tab));
9019 EXPECT_EQ("{\n"
9020 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9021 "\t// bbbbbbbbbbbbb\n"
9022 "}",
9023 format("{\n"
9024 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9025 "}",
9026 Tab));
9027 EXPECT_EQ("{\n"
9028 "\t/*\n"
9029 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9030 "\t bbbbbbbbbbbbb\n"
9031 "\t*/\n"
9032 "}",
9033 format("{\n"
9034 "\t/*\n"
9035 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9036 "\t*/\n"
9037 "}",
9038 Tab));
9039 EXPECT_EQ("{\n"
9040 "\t/*\n"
9041 "\n"
9042 "\t*/\n"
9043 "}",
9044 format("{\n"
9045 "\t/*\n"
9046 "\n"
9047 "\t*/\n"
9048 "}",
9049 Tab));
9050 EXPECT_EQ("{\n"
9051 "\t/*\n"
9052 " asdf\n"
9053 "\t*/\n"
9054 "}",
9055 format("{\n"
9056 "\t/*\n"
9057 " asdf\n"
9058 "\t*/\n"
9059 "}",
9060 Tab));
9061 EXPECT_EQ("/*\n"
9062 "\t a\t\tcomment\n"
9063 "\t in multiple lines\n"
9064 " */",
9065 format(" /*\t \t \n"
9066 " \t \t a\t\tcomment\t \t\n"
9067 " \t \t in multiple lines\t\n"
9068 " \t */",
9069 Tab));
9070 EXPECT_EQ("/* some\n"
9071 " comment */",
9072 format(" \t \t /* some\n"
9073 " \t \t comment */",
9074 Tab));
9075 EXPECT_EQ("int a; /* some\n"
9076 " comment */",
9077 format(" \t \t int a; /* some\n"
9078 " \t \t comment */",
9079 Tab));
9080 EXPECT_EQ("int a; /* some\n"
9081 "comment */",
9082 format(" \t \t int\ta; /* some\n"
9083 " \t \t comment */",
9084 Tab));
9085 EXPECT_EQ("f(\"\t\t\"); /* some\n"
9086 " comment */",
9087 format(" \t \t f(\"\t\t\"); /* some\n"
9088 " \t \t comment */",
9089 Tab));
9090 EXPECT_EQ("{\n"
9091 " /*\n"
9092 " * Comment\n"
9093 " */\n"
9094 " int i;\n"
9095 "}",
9096 format("{\n"
9097 "\t/*\n"
9098 "\t * Comment\n"
9099 "\t */\n"
9100 "\t int i;\n"
9101 "}"));
9102 Tab.AlignConsecutiveAssignments = true;
9103 Tab.AlignConsecutiveDeclarations = true;
9104 Tab.TabWidth = 4;
9105 Tab.IndentWidth = 4;
9106 verifyFormat("class Assign {\n"
9107 "\tvoid f() {\n"
9108 "\t\tint x = 123;\n"
9109 "\t\tint random = 4;\n"
9110 "\t\tstd::string alphabet =\n"
9111 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
9112 "\t}\n"
9113 "};",
9114 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00009115}
9116
Alexander Kornienko917f9e02013-09-10 12:29:48 +00009117TEST_F(FormatTest, CalculatesOriginalColumn) {
9118 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9119 "q\"; /* some\n"
9120 " comment */",
9121 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9122 "q\"; /* some\n"
9123 " comment */",
9124 getLLVMStyle()));
9125 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9126 "/* some\n"
9127 " comment */",
9128 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9129 " /* some\n"
9130 " comment */",
9131 getLLVMStyle()));
9132 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9133 "qqq\n"
9134 "/* some\n"
9135 " comment */",
9136 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9137 "qqq\n"
9138 " /* some\n"
9139 " comment */",
9140 getLLVMStyle()));
9141 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9142 "wwww; /* some\n"
9143 " comment */",
9144 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9145 "wwww; /* some\n"
9146 " comment */",
9147 getLLVMStyle()));
9148}
9149
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009150TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00009151 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009152 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009153
9154 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009155 " continue;",
9156 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009157 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009158 " continue;",
9159 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009160 verifyFormat("if(true)\n"
9161 " f();\n"
9162 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009163 " f();",
9164 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009165 verifyFormat("do {\n"
9166 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009167 "} while(something());",
9168 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009169 verifyFormat("switch(x) {\n"
9170 "default:\n"
9171 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009172 "}",
9173 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00009174 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00009175 verifyFormat("size_t x = sizeof(x);", NoSpace);
9176 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
9177 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
9178 verifyFormat("alignas(128) char a[128];", NoSpace);
9179 verifyFormat("size_t x = alignof(MyType);", NoSpace);
9180 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
9181 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009182 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009183 verifyFormat("T A::operator()();", NoSpace);
9184 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009185
9186 FormatStyle Space = getLLVMStyle();
9187 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
9188
9189 verifyFormat("int f ();", Space);
9190 verifyFormat("void f (int a, T b) {\n"
9191 " while (true)\n"
9192 " continue;\n"
9193 "}",
9194 Space);
9195 verifyFormat("if (true)\n"
9196 " f ();\n"
9197 "else if (true)\n"
9198 " f ();",
9199 Space);
9200 verifyFormat("do {\n"
9201 " do_something ();\n"
9202 "} while (something ());",
9203 Space);
9204 verifyFormat("switch (x) {\n"
9205 "default:\n"
9206 " break;\n"
9207 "}",
9208 Space);
9209 verifyFormat("A::A () : a (1) {}", Space);
9210 verifyFormat("void f () __attribute__ ((asdf));", Space);
9211 verifyFormat("*(&a + 1);\n"
9212 "&((&a)[1]);\n"
9213 "a[(b + c) * d];\n"
9214 "(((a + 1) * 2) + 3) * 4;",
9215 Space);
9216 verifyFormat("#define A(x) x", Space);
9217 verifyFormat("#define A (x) x", Space);
9218 verifyFormat("#if defined(x)\n"
9219 "#endif",
9220 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00009221 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00009222 verifyFormat("size_t x = sizeof (x);", Space);
9223 verifyFormat("auto f (int x) -> decltype (x);", Space);
9224 verifyFormat("int f (T x) noexcept (x.create ());", Space);
9225 verifyFormat("alignas (128) char a[128];", Space);
9226 verifyFormat("size_t x = alignof (MyType);", Space);
9227 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
9228 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009229 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009230 verifyFormat("T A::operator() ();", Space);
9231 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009232}
9233
9234TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
9235 FormatStyle Spaces = getLLVMStyle();
9236
9237 Spaces.SpacesInParentheses = true;
Daniel Jasperd5e9ff42018-03-22 14:30:28 +00009238 verifyFormat("do_something( ::globalVar );", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009239 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009240 verifyFormat("call();", Spaces);
9241 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009242 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
9243 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009244 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009245 " continue;",
9246 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009247 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009248 " continue;",
9249 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009250 verifyFormat("if ( true )\n"
9251 " f();\n"
9252 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009253 " f();",
9254 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009255 verifyFormat("do {\n"
9256 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009257 "} while ( something() );",
9258 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009259 verifyFormat("switch ( x ) {\n"
9260 "default:\n"
9261 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009262 "}",
9263 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009264
9265 Spaces.SpacesInParentheses = false;
9266 Spaces.SpacesInCStyleCastParentheses = true;
9267 verifyFormat("Type *A = ( Type * )P;", Spaces);
9268 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9269 verifyFormat("x = ( int32 )y;", Spaces);
9270 verifyFormat("int a = ( int )(2.0f);", Spaces);
9271 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9272 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9273 verifyFormat("#define x (( int )-1)", Spaces);
9274
Daniel Jasper92e09822015-03-18 12:59:19 +00009275 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00009276 Spaces.SpacesInParentheses = false;
9277 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009278 Spaces.SpacesInCStyleCastParentheses = true;
9279 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 Jasperb55acad2013-08-20 12:36:34 +00009282 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009283 " continue;",
9284 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009285 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009286 " continue;",
9287 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009288 verifyFormat("if (true)\n"
9289 " f( );\n"
9290 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009291 " f( );",
9292 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009293 verifyFormat("do {\n"
9294 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009295 "} while (something( ));",
9296 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009297 verifyFormat("switch (x) {\n"
9298 "default:\n"
9299 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009300 "}",
9301 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009302
Daniel Jasper92e09822015-03-18 12:59:19 +00009303 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009304 Spaces.SpaceAfterCStyleCast = true;
9305 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009306 verifyFormat("call( );", Spaces);
9307 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009308 verifyFormat("while (( bool ) 1)\n"
9309 " continue;",
9310 Spaces);
9311 verifyFormat("for (;;)\n"
9312 " continue;",
9313 Spaces);
9314 verifyFormat("if (true)\n"
9315 " f( );\n"
9316 "else if (true)\n"
9317 " f( );",
9318 Spaces);
9319 verifyFormat("do {\n"
9320 " do_something(( int ) i);\n"
9321 "} while (something( ));",
9322 Spaces);
9323 verifyFormat("switch (x) {\n"
9324 "default:\n"
9325 " break;\n"
9326 "}",
9327 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009328
9329 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009330 Spaces.SpacesInCStyleCastParentheses = false;
9331 Spaces.SpaceAfterCStyleCast = true;
9332 verifyFormat("while ((bool) 1)\n"
9333 " continue;",
9334 Spaces);
9335 verifyFormat("do {\n"
9336 " do_something((int) i);\n"
9337 "} while (something( ));",
9338 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009339}
9340
Daniel Jasperad981f82014-08-26 11:41:14 +00009341TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9342 verifyFormat("int a[5];");
9343 verifyFormat("a[3] += 42;");
9344
9345 FormatStyle Spaces = getLLVMStyle();
9346 Spaces.SpacesInSquareBrackets = true;
9347 // Lambdas unchanged.
9348 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9349 verifyFormat("return [i, args...] {};", Spaces);
9350
9351 // Not lambdas.
9352 verifyFormat("int a[ 5 ];", Spaces);
9353 verifyFormat("a[ 3 ] += 42;", Spaces);
9354 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9355 verifyFormat("double &operator[](int i) { return 0; }\n"
9356 "int i;",
9357 Spaces);
9358 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9359 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9360 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9361}
9362
Daniel Jasperd94bff32013-09-25 15:15:02 +00009363TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9364 verifyFormat("int a = 5;");
9365 verifyFormat("a += 42;");
9366 verifyFormat("a or_eq 8;");
9367
9368 FormatStyle Spaces = getLLVMStyle();
9369 Spaces.SpaceBeforeAssignmentOperators = false;
9370 verifyFormat("int a= 5;", Spaces);
9371 verifyFormat("a+= 42;", Spaces);
9372 verifyFormat("a or_eq 8;", Spaces);
9373}
9374
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009375TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
9376 verifyFormat("class Foo : public Bar {};");
9377 verifyFormat("Foo::Foo() : foo(1) {}");
9378 verifyFormat("for (auto a : b) {\n}");
9379 verifyFormat("int x = a ? b : c;");
9380 verifyFormat("{\n"
9381 "label0:\n"
9382 " int x = 0;\n"
9383 "}");
9384 verifyFormat("switch (x) {\n"
9385 "case 1:\n"
9386 "default:\n"
9387 "}");
9388
9389 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
9390 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
9391 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
9392 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
9393 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
9394 verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
9395 verifyFormat("{\n"
9396 "label1:\n"
9397 " int x = 0;\n"
9398 "}",
9399 CtorInitializerStyle);
9400 verifyFormat("switch (x) {\n"
9401 "case 1:\n"
9402 "default:\n"
9403 "}",
9404 CtorInitializerStyle);
9405 CtorInitializerStyle.BreakConstructorInitializers =
9406 FormatStyle::BCIS_AfterColon;
9407 verifyFormat("Fooooooooooo::Fooooooooooo():\n"
9408 " aaaaaaaaaaaaaaaa(1),\n"
9409 " bbbbbbbbbbbbbbbb(2) {}",
9410 CtorInitializerStyle);
9411 CtorInitializerStyle.BreakConstructorInitializers =
9412 FormatStyle::BCIS_BeforeComma;
9413 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9414 " : aaaaaaaaaaaaaaaa(1)\n"
9415 " , bbbbbbbbbbbbbbbb(2) {}",
9416 CtorInitializerStyle);
9417 CtorInitializerStyle.BreakConstructorInitializers =
9418 FormatStyle::BCIS_BeforeColon;
9419 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9420 " : aaaaaaaaaaaaaaaa(1),\n"
9421 " bbbbbbbbbbbbbbbb(2) {}",
9422 CtorInitializerStyle);
9423 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
9424 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9425 ": aaaaaaaaaaaaaaaa(1),\n"
9426 " bbbbbbbbbbbbbbbb(2) {}",
9427 CtorInitializerStyle);
9428
Francois Ferrand6bb103f2018-06-11 14:41:26 +00009429 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009430 InheritanceStyle.SpaceBeforeInheritanceColon = false;
9431 verifyFormat("class Foo: public Bar {};", InheritanceStyle);
9432 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
9433 verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
9434 verifyFormat("int x = a ? b : c;", InheritanceStyle);
9435 verifyFormat("{\n"
9436 "label2:\n"
9437 " int x = 0;\n"
9438 "}",
9439 InheritanceStyle);
9440 verifyFormat("switch (x) {\n"
9441 "case 1:\n"
9442 "default:\n"
9443 "}",
9444 InheritanceStyle);
Francois Ferrand6bb103f2018-06-11 14:41:26 +00009445 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
9446 verifyFormat("class Foooooooooooooooooooooo:\n"
9447 " public aaaaaaaaaaaaaaaaaa,\n"
9448 " public bbbbbbbbbbbbbbbbbb {\n"
9449 "}",
9450 InheritanceStyle);
9451 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
9452 verifyFormat("class Foooooooooooooooooooooo\n"
9453 " : public aaaaaaaaaaaaaaaaaa\n"
9454 " , public bbbbbbbbbbbbbbbbbb {\n"
9455 "}",
9456 InheritanceStyle);
9457 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
9458 verifyFormat("class Foooooooooooooooooooooo\n"
9459 " : public aaaaaaaaaaaaaaaaaa,\n"
9460 " public bbbbbbbbbbbbbbbbbb {\n"
9461 "}",
9462 InheritanceStyle);
9463 InheritanceStyle.ConstructorInitializerIndentWidth = 0;
9464 verifyFormat("class Foooooooooooooooooooooo\n"
9465 ": public aaaaaaaaaaaaaaaaaa,\n"
9466 " public bbbbbbbbbbbbbbbbbb {}",
9467 InheritanceStyle);
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009468
9469 FormatStyle ForLoopStyle = getLLVMStyle();
9470 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
9471 verifyFormat("class Foo : public Bar {};", ForLoopStyle);
9472 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
9473 verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
9474 verifyFormat("int x = a ? b : c;", ForLoopStyle);
9475 verifyFormat("{\n"
9476 "label2:\n"
9477 " int x = 0;\n"
9478 "}",
9479 ForLoopStyle);
9480 verifyFormat("switch (x) {\n"
9481 "case 1:\n"
9482 "default:\n"
9483 "}",
9484 ForLoopStyle);
9485
9486 FormatStyle NoSpaceStyle = getLLVMStyle();
9487 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
9488 NoSpaceStyle.SpaceBeforeInheritanceColon = false;
9489 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
9490 verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
9491 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
9492 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
9493 verifyFormat("int x = a ? b : c;", NoSpaceStyle);
9494 verifyFormat("{\n"
9495 "label3:\n"
9496 " int x = 0;\n"
9497 "}",
9498 NoSpaceStyle);
9499 verifyFormat("switch (x) {\n"
9500 "case 1:\n"
9501 "default:\n"
9502 "}",
9503 NoSpaceStyle);
9504}
9505
Daniel Jaspera44991332015-04-29 13:06:49 +00009506TEST_F(FormatTest, AlignConsecutiveAssignments) {
9507 FormatStyle Alignment = getLLVMStyle();
9508 Alignment.AlignConsecutiveAssignments = false;
9509 verifyFormat("int a = 5;\n"
9510 "int oneTwoThree = 123;",
9511 Alignment);
9512 verifyFormat("int a = 5;\n"
9513 "int oneTwoThree = 123;",
9514 Alignment);
9515
9516 Alignment.AlignConsecutiveAssignments = true;
9517 verifyFormat("int a = 5;\n"
9518 "int oneTwoThree = 123;",
9519 Alignment);
9520 verifyFormat("int a = method();\n"
9521 "int oneTwoThree = 133;",
9522 Alignment);
9523 verifyFormat("a &= 5;\n"
9524 "bcd *= 5;\n"
9525 "ghtyf += 5;\n"
9526 "dvfvdb -= 5;\n"
9527 "a /= 5;\n"
9528 "vdsvsv %= 5;\n"
9529 "sfdbddfbdfbb ^= 5;\n"
9530 "dvsdsv |= 5;\n"
9531 "int dsvvdvsdvvv = 123;",
9532 Alignment);
9533 verifyFormat("int i = 1, j = 10;\n"
9534 "something = 2000;",
9535 Alignment);
9536 verifyFormat("something = 2000;\n"
9537 "int i = 1, j = 10;\n",
9538 Alignment);
9539 verifyFormat("something = 2000;\n"
9540 "another = 911;\n"
9541 "int i = 1, j = 10;\n"
9542 "oneMore = 1;\n"
9543 "i = 2;",
9544 Alignment);
9545 verifyFormat("int a = 5;\n"
9546 "int one = 1;\n"
9547 "method();\n"
9548 "int oneTwoThree = 123;\n"
9549 "int oneTwo = 12;",
9550 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009551 verifyFormat("int oneTwoThree = 123;\n"
9552 "int oneTwo = 12;\n"
9553 "method();\n",
9554 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009555 verifyFormat("int oneTwoThree = 123; // comment\n"
9556 "int oneTwo = 12; // comment",
9557 Alignment);
9558 EXPECT_EQ("int a = 5;\n"
9559 "\n"
9560 "int oneTwoThree = 123;",
9561 format("int a = 5;\n"
9562 "\n"
9563 "int oneTwoThree= 123;",
9564 Alignment));
9565 EXPECT_EQ("int a = 5;\n"
9566 "int one = 1;\n"
9567 "\n"
9568 "int oneTwoThree = 123;",
9569 format("int a = 5;\n"
9570 "int one = 1;\n"
9571 "\n"
9572 "int oneTwoThree = 123;",
9573 Alignment));
9574 EXPECT_EQ("int a = 5;\n"
9575 "int one = 1;\n"
9576 "\n"
9577 "int oneTwoThree = 123;\n"
9578 "int oneTwo = 12;",
9579 format("int a = 5;\n"
9580 "int one = 1;\n"
9581 "\n"
9582 "int oneTwoThree = 123;\n"
9583 "int oneTwo = 12;",
9584 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009585 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9586 verifyFormat("#define A \\\n"
9587 " int aaaa = 12; \\\n"
9588 " int b = 23; \\\n"
9589 " int ccc = 234; \\\n"
9590 " int dddddddddd = 2345;",
9591 Alignment);
9592 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00009593 verifyFormat("#define A \\\n"
9594 " int aaaa = 12; \\\n"
9595 " int b = 23; \\\n"
9596 " int ccc = 234; \\\n"
9597 " int dddddddddd = 2345;",
9598 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009599 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00009600 verifyFormat("#define A "
9601 " \\\n"
9602 " int aaaa = 12; "
9603 " \\\n"
9604 " int b = 23; "
9605 " \\\n"
9606 " int ccc = 234; "
9607 " \\\n"
9608 " int dddddddddd = 2345;",
9609 Alignment);
9610 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9611 "k = 4, int l = 5,\n"
9612 " int m = 6) {\n"
9613 " int j = 10;\n"
9614 " otherThing = 1;\n"
9615 "}",
9616 Alignment);
9617 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9618 " int i = 1;\n"
9619 " int j = 2;\n"
9620 " int big = 10000;\n"
9621 "}",
9622 Alignment);
9623 verifyFormat("class C {\n"
9624 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009625 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009626 " virtual void f() = 0;\n"
9627 "};",
9628 Alignment);
9629 verifyFormat("int i = 1;\n"
9630 "if (SomeType t = getSomething()) {\n"
9631 "}\n"
9632 "int j = 2;\n"
9633 "int big = 10000;",
9634 Alignment);
9635 verifyFormat("int j = 7;\n"
9636 "for (int k = 0; k < N; ++k) {\n"
9637 "}\n"
9638 "int j = 2;\n"
9639 "int big = 10000;\n"
9640 "}",
9641 Alignment);
9642 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9643 verifyFormat("int i = 1;\n"
9644 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9645 " = someLooooooooooooooooongFunction();\n"
9646 "int j = 2;",
9647 Alignment);
9648 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9649 verifyFormat("int i = 1;\n"
9650 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9651 " someLooooooooooooooooongFunction();\n"
9652 "int j = 2;",
9653 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009654
9655 verifyFormat("auto lambda = []() {\n"
9656 " auto i = 0;\n"
9657 " return 0;\n"
9658 "};\n"
9659 "int i = 0;\n"
9660 "auto v = type{\n"
9661 " i = 1, //\n"
9662 " (i = 2), //\n"
9663 " i = 3 //\n"
9664 "};",
9665 Alignment);
9666
Daniel Jaspera44991332015-04-29 13:06:49 +00009667 verifyFormat(
9668 "int i = 1;\n"
9669 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9670 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009671 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00009672 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009673
9674 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9675 " typename B = very_long_type_name_1,\n"
9676 " typename T_2 = very_long_type_name_2>\n"
9677 "auto foo() {}\n",
9678 Alignment);
9679 verifyFormat("int a, b = 1;\n"
9680 "int c = 2;\n"
9681 "int dd = 3;\n",
9682 Alignment);
9683 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9684 "float b[1][] = {{3.f}};\n",
9685 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009686 verifyFormat("for (int i = 0; i < 1; i++)\n"
9687 " int x = 1;\n",
9688 Alignment);
9689 verifyFormat("for (i = 0; i < 1; i++)\n"
9690 " x = 1;\n"
9691 "y = 1;\n",
9692 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009693}
9694
Daniel Jaspere12597c2015-10-01 10:06:54 +00009695TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9696 FormatStyle Alignment = getLLVMStyle();
9697 Alignment.AlignConsecutiveDeclarations = false;
9698 verifyFormat("float const a = 5;\n"
9699 "int oneTwoThree = 123;",
9700 Alignment);
9701 verifyFormat("int a = 5;\n"
9702 "float const oneTwoThree = 123;",
9703 Alignment);
9704
9705 Alignment.AlignConsecutiveDeclarations = true;
9706 verifyFormat("float const a = 5;\n"
9707 "int oneTwoThree = 123;",
9708 Alignment);
9709 verifyFormat("int a = method();\n"
9710 "float const oneTwoThree = 133;",
9711 Alignment);
9712 verifyFormat("int i = 1, j = 10;\n"
9713 "something = 2000;",
9714 Alignment);
9715 verifyFormat("something = 2000;\n"
9716 "int i = 1, j = 10;\n",
9717 Alignment);
9718 verifyFormat("float something = 2000;\n"
9719 "double another = 911;\n"
9720 "int i = 1, j = 10;\n"
9721 "const int *oneMore = 1;\n"
9722 "unsigned i = 2;",
9723 Alignment);
9724 verifyFormat("float a = 5;\n"
9725 "int one = 1;\n"
9726 "method();\n"
9727 "const double oneTwoThree = 123;\n"
9728 "const unsigned int oneTwo = 12;",
9729 Alignment);
9730 verifyFormat("int oneTwoThree{0}; // comment\n"
9731 "unsigned oneTwo; // comment",
9732 Alignment);
9733 EXPECT_EQ("float const a = 5;\n"
9734 "\n"
9735 "int oneTwoThree = 123;",
9736 format("float const a = 5;\n"
9737 "\n"
9738 "int oneTwoThree= 123;",
9739 Alignment));
9740 EXPECT_EQ("float a = 5;\n"
9741 "int one = 1;\n"
9742 "\n"
9743 "unsigned oneTwoThree = 123;",
9744 format("float a = 5;\n"
9745 "int one = 1;\n"
9746 "\n"
9747 "unsigned oneTwoThree = 123;",
9748 Alignment));
9749 EXPECT_EQ("float a = 5;\n"
9750 "int one = 1;\n"
9751 "\n"
9752 "unsigned oneTwoThree = 123;\n"
9753 "int oneTwo = 12;",
9754 format("float a = 5;\n"
9755 "int one = 1;\n"
9756 "\n"
9757 "unsigned oneTwoThree = 123;\n"
9758 "int oneTwo = 12;",
9759 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009760 // Function prototype alignment
9761 verifyFormat("int a();\n"
9762 "double b();",
9763 Alignment);
9764 verifyFormat("int a(int x);\n"
9765 "double b();",
9766 Alignment);
9767 unsigned OldColumnLimit = Alignment.ColumnLimit;
9768 // We need to set ColumnLimit to zero, in order to stress nested alignments,
9769 // otherwise the function parameters will be re-flowed onto a single line.
9770 Alignment.ColumnLimit = 0;
9771 EXPECT_EQ("int a(int x,\n"
9772 " float y);\n"
9773 "double b(int x,\n"
9774 " double y);",
9775 format("int a(int x,\n"
9776 " float y);\n"
9777 "double b(int x,\n"
9778 " double y);",
9779 Alignment));
9780 // This ensures that function parameters of function declarations are
9781 // correctly indented when their owning functions are indented.
9782 // The failure case here is for 'double y' to not be indented enough.
9783 EXPECT_EQ("double a(int x);\n"
9784 "int b(int y,\n"
9785 " double z);",
9786 format("double a(int x);\n"
9787 "int b(int y,\n"
9788 " double z);",
9789 Alignment));
9790 // Set ColumnLimit low so that we induce wrapping immediately after
9791 // the function name and opening paren.
9792 Alignment.ColumnLimit = 13;
9793 verifyFormat("int function(\n"
9794 " int x,\n"
9795 " bool y);",
9796 Alignment);
9797 Alignment.ColumnLimit = OldColumnLimit;
9798 // Ensure function pointers don't screw up recursive alignment
9799 verifyFormat("int a(int x, void (*fp)(int y));\n"
9800 "double b();",
9801 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009802 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009803 // Ensure recursive alignment is broken by function braces, so that the
9804 // "a = 1" does not align with subsequent assignments inside the function
9805 // body.
9806 verifyFormat("int func(int a = 1) {\n"
9807 " int b = 2;\n"
9808 " int cc = 3;\n"
9809 "}",
9810 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009811 verifyFormat("float something = 2000;\n"
9812 "double another = 911;\n"
9813 "int i = 1, j = 10;\n"
9814 "const int *oneMore = 1;\n"
9815 "unsigned i = 2;",
9816 Alignment);
9817 verifyFormat("int oneTwoThree = {0}; // comment\n"
9818 "unsigned oneTwo = 0; // comment",
9819 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009820 // Make sure that scope is correctly tracked, in the absence of braces
9821 verifyFormat("for (int i = 0; i < n; i++)\n"
9822 " j = i;\n"
9823 "double x = 1;\n",
9824 Alignment);
9825 verifyFormat("if (int i = 0)\n"
9826 " j = i;\n"
9827 "double x = 1;\n",
9828 Alignment);
9829 // Ensure operator[] and operator() are comprehended
9830 verifyFormat("struct test {\n"
9831 " long long int foo();\n"
9832 " int operator[](int a);\n"
9833 " double bar();\n"
9834 "};\n",
9835 Alignment);
9836 verifyFormat("struct test {\n"
9837 " long long int foo();\n"
9838 " int operator()(int a);\n"
9839 " double bar();\n"
9840 "};\n",
9841 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009842 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9843 " int const i = 1;\n"
9844 " int * j = 2;\n"
9845 " int big = 10000;\n"
9846 "\n"
9847 " unsigned oneTwoThree = 123;\n"
9848 " int oneTwo = 12;\n"
9849 " method();\n"
9850 " float k = 2;\n"
9851 " int ll = 10000;\n"
9852 "}",
9853 format("void SomeFunction(int parameter= 0) {\n"
9854 " int const i= 1;\n"
9855 " int *j=2;\n"
9856 " int big = 10000;\n"
9857 "\n"
9858 "unsigned oneTwoThree =123;\n"
9859 "int oneTwo = 12;\n"
9860 " method();\n"
9861 "float k= 2;\n"
9862 "int ll=10000;\n"
9863 "}",
9864 Alignment));
9865 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009866 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9867 verifyFormat("#define A \\\n"
9868 " int aaaa = 12; \\\n"
9869 " float b = 23; \\\n"
9870 " const int ccc = 234; \\\n"
9871 " unsigned dddddddddd = 2345;",
9872 Alignment);
9873 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009874 verifyFormat("#define A \\\n"
9875 " int aaaa = 12; \\\n"
9876 " float b = 23; \\\n"
9877 " const int ccc = 234; \\\n"
9878 " unsigned dddddddddd = 2345;",
9879 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009880 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009881 Alignment.ColumnLimit = 30;
9882 verifyFormat("#define A \\\n"
9883 " int aaaa = 12; \\\n"
9884 " float b = 23; \\\n"
9885 " const int ccc = 234; \\\n"
9886 " int dddddddddd = 2345;",
9887 Alignment);
9888 Alignment.ColumnLimit = 80;
9889 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9890 "k = 4, int l = 5,\n"
9891 " int m = 6) {\n"
9892 " const int j = 10;\n"
9893 " otherThing = 1;\n"
9894 "}",
9895 Alignment);
9896 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9897 " int const i = 1;\n"
9898 " int * j = 2;\n"
9899 " int big = 10000;\n"
9900 "}",
9901 Alignment);
9902 verifyFormat("class C {\n"
9903 "public:\n"
9904 " int i = 1;\n"
9905 " virtual void f() = 0;\n"
9906 "};",
9907 Alignment);
9908 verifyFormat("float i = 1;\n"
9909 "if (SomeType t = getSomething()) {\n"
9910 "}\n"
9911 "const unsigned j = 2;\n"
9912 "int big = 10000;",
9913 Alignment);
9914 verifyFormat("float j = 7;\n"
9915 "for (int k = 0; k < N; ++k) {\n"
9916 "}\n"
9917 "unsigned j = 2;\n"
9918 "int big = 10000;\n"
9919 "}",
9920 Alignment);
9921 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9922 verifyFormat("float i = 1;\n"
9923 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9924 " = someLooooooooooooooooongFunction();\n"
9925 "int j = 2;",
9926 Alignment);
9927 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9928 verifyFormat("int i = 1;\n"
9929 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9930 " someLooooooooooooooooongFunction();\n"
9931 "int j = 2;",
9932 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009933
9934 Alignment.AlignConsecutiveAssignments = true;
9935 verifyFormat("auto lambda = []() {\n"
9936 " auto ii = 0;\n"
9937 " float j = 0;\n"
9938 " return 0;\n"
9939 "};\n"
9940 "int i = 0;\n"
9941 "float i2 = 0;\n"
9942 "auto v = type{\n"
9943 " i = 1, //\n"
9944 " (i = 2), //\n"
9945 " i = 3 //\n"
9946 "};",
9947 Alignment);
9948 Alignment.AlignConsecutiveAssignments = false;
9949
Daniel Jaspere12597c2015-10-01 10:06:54 +00009950 verifyFormat(
9951 "int i = 1;\n"
9952 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9953 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009954 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009955 Alignment);
9956
9957 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9958 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009959 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00009960 // happens.
9961 Alignment.AlignConsecutiveAssignments = true;
9962 Alignment.ColumnLimit = 30;
9963 verifyFormat("float ii = 1;\n"
9964 "unsigned j = 2;\n"
9965 "int someVerylongVariable = 1;\n"
9966 "AnotherLongType ll = 123456;\n"
9967 "VeryVeryLongType k = 2;\n"
9968 "int myvar = 1;",
9969 Alignment);
9970 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009971 Alignment.AlignConsecutiveAssignments = false;
9972
9973 verifyFormat(
9974 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9975 " typename LongType, typename B>\n"
9976 "auto foo() {}\n",
9977 Alignment);
9978 verifyFormat("float a, b = 1;\n"
9979 "int c = 2;\n"
9980 "int dd = 3;\n",
9981 Alignment);
9982 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9983 "float b[1][] = {{3.f}};\n",
9984 Alignment);
9985 Alignment.AlignConsecutiveAssignments = true;
9986 verifyFormat("float a, b = 1;\n"
9987 "int c = 2;\n"
9988 "int dd = 3;\n",
9989 Alignment);
9990 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9991 "float b[1][] = {{3.f}};\n",
9992 Alignment);
9993 Alignment.AlignConsecutiveAssignments = false;
9994
9995 Alignment.ColumnLimit = 30;
9996 Alignment.BinPackParameters = false;
9997 verifyFormat("void foo(float a,\n"
9998 " float b,\n"
9999 " int c,\n"
10000 " uint32_t *d) {\n"
10001 " int * e = 0;\n"
10002 " float f = 0;\n"
10003 " double g = 0;\n"
10004 "}\n"
10005 "void bar(ino_t a,\n"
10006 " int b,\n"
10007 " uint32_t *c,\n"
10008 " bool d) {}\n",
10009 Alignment);
10010 Alignment.BinPackParameters = true;
10011 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +000010012
10013 // Bug 33507
10014 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
10015 verifyFormat(
10016 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
10017 " static const Version verVs2017;\n"
10018 " return true;\n"
10019 "});\n",
10020 Alignment);
10021 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Ilya Biryukovf16a6fa2018-08-01 15:32:56 +000010022
10023 // See llvm.org/PR35641
10024 Alignment.AlignConsecutiveDeclarations = true;
10025 verifyFormat("int func() { //\n"
10026 " int b;\n"
10027 " unsigned c;\n"
10028 "}",
10029 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010030}
10031
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010032TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010033 FormatStyle LinuxBraceStyle = getLLVMStyle();
10034 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010035 verifyFormat("namespace a\n"
10036 "{\n"
10037 "class A\n"
10038 "{\n"
10039 " void f()\n"
10040 " {\n"
10041 " if (true) {\n"
10042 " a();\n"
10043 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +000010044 " } else {\n"
10045 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010046 " }\n"
10047 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +000010048 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010049 "};\n"
10050 "struct B {\n"
10051 " int x;\n"
10052 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010053 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010054 LinuxBraceStyle);
10055 verifyFormat("enum X {\n"
10056 " Y = 0,\n"
10057 "}\n",
10058 LinuxBraceStyle);
10059 verifyFormat("struct S {\n"
10060 " int Type;\n"
10061 " union {\n"
10062 " int x;\n"
10063 " double y;\n"
10064 " } Value;\n"
10065 " class C\n"
10066 " {\n"
10067 " MyFavoriteType Value;\n"
10068 " } Class;\n"
10069 "}\n",
10070 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010071}
10072
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010073TEST_F(FormatTest, MozillaBraceBreaking) {
10074 FormatStyle MozillaBraceStyle = getLLVMStyle();
10075 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010076 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010077 verifyFormat("namespace a {\n"
10078 "class A\n"
10079 "{\n"
10080 " void f()\n"
10081 " {\n"
10082 " if (true) {\n"
10083 " a();\n"
10084 " b();\n"
10085 " }\n"
10086 " }\n"
10087 " void g() { return; }\n"
10088 "};\n"
10089 "enum E\n"
10090 "{\n"
10091 " A,\n"
10092 " // foo\n"
10093 " B,\n"
10094 " C\n"
10095 "};\n"
10096 "struct B\n"
10097 "{\n"
10098 " int x;\n"
10099 "};\n"
10100 "}\n",
10101 MozillaBraceStyle);
10102 verifyFormat("struct S\n"
10103 "{\n"
10104 " int Type;\n"
10105 " union\n"
10106 " {\n"
10107 " int x;\n"
10108 " double y;\n"
10109 " } Value;\n"
10110 " class C\n"
10111 " {\n"
10112 " MyFavoriteType Value;\n"
10113 " } Class;\n"
10114 "}\n",
10115 MozillaBraceStyle);
10116}
10117
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010118TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010119 FormatStyle StroustrupBraceStyle = getLLVMStyle();
10120 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010121 verifyFormat("namespace a {\n"
10122 "class A {\n"
10123 " void f()\n"
10124 " {\n"
10125 " if (true) {\n"
10126 " a();\n"
10127 " b();\n"
10128 " }\n"
10129 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +000010130 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010131 "};\n"
10132 "struct B {\n"
10133 " int x;\n"
10134 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000010135 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010136 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010137
Daniel Jasperd9670872014-08-05 12:06:20 +000010138 verifyFormat("void foo()\n"
10139 "{\n"
10140 " if (a) {\n"
10141 " a();\n"
10142 " }\n"
10143 " else {\n"
10144 " b();\n"
10145 " }\n"
10146 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010147 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +000010148
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010149 verifyFormat("#ifdef _DEBUG\n"
10150 "int foo(int i = 0)\n"
10151 "#else\n"
10152 "int foo(int i = 5)\n"
10153 "#endif\n"
10154 "{\n"
10155 " return i;\n"
10156 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010157 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010158
10159 verifyFormat("void foo() {}\n"
10160 "void bar()\n"
10161 "#ifdef _DEBUG\n"
10162 "{\n"
10163 " foo();\n"
10164 "}\n"
10165 "#else\n"
10166 "{\n"
10167 "}\n"
10168 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010169 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010170
10171 verifyFormat("void foobar() { int i = 5; }\n"
10172 "#ifdef _DEBUG\n"
10173 "void bar() {}\n"
10174 "#else\n"
10175 "void bar() { foobar(); }\n"
10176 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010177 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010178}
10179
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010180TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010181 FormatStyle AllmanBraceStyle = getLLVMStyle();
10182 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010183
10184 EXPECT_EQ("namespace a\n"
10185 "{\n"
10186 "void f();\n"
10187 "void g();\n"
10188 "} // namespace a\n",
10189 format("namespace a\n"
10190 "{\n"
10191 "void f();\n"
10192 "void g();\n"
10193 "}\n",
10194 AllmanBraceStyle));
10195
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010196 verifyFormat("namespace a\n"
10197 "{\n"
10198 "class A\n"
10199 "{\n"
10200 " void f()\n"
10201 " {\n"
10202 " if (true)\n"
10203 " {\n"
10204 " a();\n"
10205 " b();\n"
10206 " }\n"
10207 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +000010208 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010209 "};\n"
10210 "struct B\n"
10211 "{\n"
10212 " int x;\n"
10213 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010214 "} // namespace a",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010215 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010216
10217 verifyFormat("void f()\n"
10218 "{\n"
10219 " if (true)\n"
10220 " {\n"
10221 " a();\n"
10222 " }\n"
10223 " else if (false)\n"
10224 " {\n"
10225 " b();\n"
10226 " }\n"
10227 " else\n"
10228 " {\n"
10229 " c();\n"
10230 " }\n"
10231 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010232 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010233
10234 verifyFormat("void f()\n"
10235 "{\n"
10236 " for (int i = 0; i < 10; ++i)\n"
10237 " {\n"
10238 " a();\n"
10239 " }\n"
10240 " while (false)\n"
10241 " {\n"
10242 " b();\n"
10243 " }\n"
10244 " do\n"
10245 " {\n"
10246 " c();\n"
10247 " } while (false)\n"
10248 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010249 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010250
10251 verifyFormat("void f(int a)\n"
10252 "{\n"
10253 " switch (a)\n"
10254 " {\n"
10255 " case 0:\n"
10256 " break;\n"
10257 " case 1:\n"
10258 " {\n"
10259 " break;\n"
10260 " }\n"
10261 " case 2:\n"
10262 " {\n"
10263 " }\n"
10264 " break;\n"
10265 " default:\n"
10266 " break;\n"
10267 " }\n"
10268 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010269 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +000010270
10271 verifyFormat("enum X\n"
10272 "{\n"
10273 " Y = 0,\n"
10274 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010275 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +000010276 verifyFormat("enum X\n"
10277 "{\n"
10278 " Y = 0\n"
10279 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010280 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +000010281
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010282 verifyFormat("@interface BSApplicationController ()\n"
10283 "{\n"
10284 "@private\n"
10285 " id _extraIvar;\n"
10286 "}\n"
10287 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010288 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010289
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010290 verifyFormat("#ifdef _DEBUG\n"
10291 "int foo(int i = 0)\n"
10292 "#else\n"
10293 "int foo(int i = 5)\n"
10294 "#endif\n"
10295 "{\n"
10296 " return i;\n"
10297 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010298 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010299
10300 verifyFormat("void foo() {}\n"
10301 "void bar()\n"
10302 "#ifdef _DEBUG\n"
10303 "{\n"
10304 " foo();\n"
10305 "}\n"
10306 "#else\n"
10307 "{\n"
10308 "}\n"
10309 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010310 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010311
10312 verifyFormat("void foobar() { int i = 5; }\n"
10313 "#ifdef _DEBUG\n"
10314 "void bar() {}\n"
10315 "#else\n"
10316 "void bar() { foobar(); }\n"
10317 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010318 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010319
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010320 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010321 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010322 " // ...\n"
10323 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010324 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010325 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010326 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010327 " // ...\n"
10328 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010329 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010330 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010331 // .. or dict literals.
10332 verifyFormat("void f()\n"
10333 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +000010334 " // ...\n"
10335 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
10336 "}",
10337 AllmanBraceStyle);
10338 verifyFormat("void f()\n"
10339 "{\n"
10340 " // ...\n"
10341 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010342 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010343 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +000010344 verifyFormat("int f()\n"
10345 "{ // comment\n"
10346 " return 42;\n"
10347 "}",
10348 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010349
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010350 AllmanBraceStyle.ColumnLimit = 19;
10351 verifyFormat("void f() { int i; }", AllmanBraceStyle);
10352 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +000010353 verifyFormat("void f()\n"
10354 "{\n"
10355 " int i;\n"
10356 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010357 AllmanBraceStyle);
10358 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +000010359
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010360 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +000010361 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
10362 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
10363 verifyFormat("void f(bool b)\n"
10364 "{\n"
10365 " if (b)\n"
10366 " {\n"
10367 " return;\n"
10368 " }\n"
10369 "}\n",
10370 BreakBeforeBraceShortIfs);
10371 verifyFormat("void f(bool b)\n"
10372 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010373 " if constexpr (b)\n"
10374 " {\n"
10375 " return;\n"
10376 " }\n"
10377 "}\n",
10378 BreakBeforeBraceShortIfs);
10379 verifyFormat("void f(bool b)\n"
10380 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +000010381 " if (b) return;\n"
10382 "}\n",
10383 BreakBeforeBraceShortIfs);
10384 verifyFormat("void f(bool b)\n"
10385 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010386 " if constexpr (b) return;\n"
10387 "}\n",
10388 BreakBeforeBraceShortIfs);
10389 verifyFormat("void f(bool b)\n"
10390 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +000010391 " while (b)\n"
10392 " {\n"
10393 " return;\n"
10394 " }\n"
10395 "}\n",
10396 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010397}
10398
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010399TEST_F(FormatTest, GNUBraceBreaking) {
10400 FormatStyle GNUBraceStyle = getLLVMStyle();
10401 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
10402 verifyFormat("namespace a\n"
10403 "{\n"
10404 "class A\n"
10405 "{\n"
10406 " void f()\n"
10407 " {\n"
10408 " int a;\n"
10409 " {\n"
10410 " int b;\n"
10411 " }\n"
10412 " if (true)\n"
10413 " {\n"
10414 " a();\n"
10415 " b();\n"
10416 " }\n"
10417 " }\n"
10418 " void g() { return; }\n"
10419 "}\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010420 "} // namespace a",
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010421 GNUBraceStyle);
10422
10423 verifyFormat("void f()\n"
10424 "{\n"
10425 " if (true)\n"
10426 " {\n"
10427 " a();\n"
10428 " }\n"
10429 " else if (false)\n"
10430 " {\n"
10431 " b();\n"
10432 " }\n"
10433 " else\n"
10434 " {\n"
10435 " c();\n"
10436 " }\n"
10437 "}\n",
10438 GNUBraceStyle);
10439
10440 verifyFormat("void f()\n"
10441 "{\n"
10442 " for (int i = 0; i < 10; ++i)\n"
10443 " {\n"
10444 " a();\n"
10445 " }\n"
10446 " while (false)\n"
10447 " {\n"
10448 " b();\n"
10449 " }\n"
10450 " do\n"
10451 " {\n"
10452 " c();\n"
10453 " }\n"
10454 " while (false);\n"
10455 "}\n",
10456 GNUBraceStyle);
10457
10458 verifyFormat("void f(int a)\n"
10459 "{\n"
10460 " switch (a)\n"
10461 " {\n"
10462 " case 0:\n"
10463 " break;\n"
10464 " case 1:\n"
10465 " {\n"
10466 " break;\n"
10467 " }\n"
10468 " case 2:\n"
10469 " {\n"
10470 " }\n"
10471 " break;\n"
10472 " default:\n"
10473 " break;\n"
10474 " }\n"
10475 "}\n",
10476 GNUBraceStyle);
10477
10478 verifyFormat("enum X\n"
10479 "{\n"
10480 " Y = 0,\n"
10481 "}\n",
10482 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010483
10484 verifyFormat("@interface BSApplicationController ()\n"
10485 "{\n"
10486 "@private\n"
10487 " id _extraIvar;\n"
10488 "}\n"
10489 "@end\n",
10490 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010491
10492 verifyFormat("#ifdef _DEBUG\n"
10493 "int foo(int i = 0)\n"
10494 "#else\n"
10495 "int foo(int i = 5)\n"
10496 "#endif\n"
10497 "{\n"
10498 " return i;\n"
10499 "}",
10500 GNUBraceStyle);
10501
10502 verifyFormat("void foo() {}\n"
10503 "void bar()\n"
10504 "#ifdef _DEBUG\n"
10505 "{\n"
10506 " foo();\n"
10507 "}\n"
10508 "#else\n"
10509 "{\n"
10510 "}\n"
10511 "#endif",
10512 GNUBraceStyle);
10513
10514 verifyFormat("void foobar() { int i = 5; }\n"
10515 "#ifdef _DEBUG\n"
10516 "void bar() {}\n"
10517 "#else\n"
10518 "void bar() { foobar(); }\n"
10519 "#endif",
10520 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010521}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010522
10523TEST_F(FormatTest, WebKitBraceBreaking) {
10524 FormatStyle WebKitBraceStyle = getLLVMStyle();
10525 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010526 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010527 verifyFormat("namespace a {\n"
10528 "class A {\n"
10529 " void f()\n"
10530 " {\n"
10531 " if (true) {\n"
10532 " a();\n"
10533 " b();\n"
10534 " }\n"
10535 " }\n"
10536 " void g() { return; }\n"
10537 "};\n"
10538 "enum E {\n"
10539 " A,\n"
10540 " // foo\n"
10541 " B,\n"
10542 " C\n"
10543 "};\n"
10544 "struct B {\n"
10545 " int x;\n"
10546 "};\n"
10547 "}\n",
10548 WebKitBraceStyle);
10549 verifyFormat("struct S {\n"
10550 " int Type;\n"
10551 " union {\n"
10552 " int x;\n"
10553 " double y;\n"
10554 " } Value;\n"
10555 " class C {\n"
10556 " MyFavoriteType Value;\n"
10557 " } Class;\n"
10558 "};\n",
10559 WebKitBraceStyle);
10560}
10561
Manuel Klimekd5735502013-08-12 03:51:17 +000010562TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10563 verifyFormat("void f() {\n"
10564 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010565 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010566 " }\n"
10567 "}\n",
10568 getLLVMStyle());
10569}
10570
Daniel Jasper9613c812013-08-07 16:29:23 +000010571TEST_F(FormatTest, UnderstandsPragmas) {
10572 verifyFormat("#pragma omp reduction(| : var)");
10573 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010574
10575 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10576 "(including parentheses).",
10577 format("#pragma mark Any non-hyphenated or hyphenated string "
10578 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010579}
10580
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010581TEST_F(FormatTest, UnderstandPragmaOption) {
10582 verifyFormat("#pragma option -C -A");
10583
10584 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10585}
10586
Manuel Klimek77866142017-11-17 11:17:15 +000010587TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
10588 FormatStyle Style = getLLVMStyle();
10589 Style.ColumnLimit = 20;
10590
10591 verifyFormat("int a; // the\n"
10592 " // comment", Style);
10593 EXPECT_EQ("int a; /* first line\n"
10594 " * second\n"
10595 " * line third\n"
10596 " * line\n"
10597 " */",
10598 format("int a; /* first line\n"
10599 " * second\n"
10600 " * line third\n"
10601 " * line\n"
10602 " */",
10603 Style));
10604 EXPECT_EQ("int a; // first line\n"
10605 " // second\n"
10606 " // line third\n"
10607 " // line",
10608 format("int a; // first line\n"
10609 " // second line\n"
10610 " // third line",
10611 Style));
10612
10613 Style.PenaltyExcessCharacter = 90;
10614 verifyFormat("int a; // the comment", Style);
Manuel Klimek93699f42017-11-29 14:29:43 +000010615 EXPECT_EQ("int a; // the comment\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010616 " // aaa",
10617 format("int a; // the comment aaa", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010618 EXPECT_EQ("int a; /* first line\n"
10619 " * second line\n"
10620 " * third line\n"
10621 " */",
10622 format("int a; /* first line\n"
10623 " * second line\n"
10624 " * third line\n"
10625 " */",
10626 Style));
Manuel Klimek93699f42017-11-29 14:29:43 +000010627 EXPECT_EQ("int a; // first line\n"
10628 " // second line\n"
10629 " // third line",
10630 format("int a; // first line\n"
10631 " // second line\n"
10632 " // third line",
10633 Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010634 // FIXME: Investigate why this is not getting the same layout as the test
10635 // above.
10636 EXPECT_EQ("int a; /* first line\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010637 " * second line\n"
10638 " * third line\n"
Manuel Klimek77866142017-11-17 11:17:15 +000010639 " */",
10640 format("int a; /* first line second line third line"
10641 "\n*/",
10642 Style));
10643
10644 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010645 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010646 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010647 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010648 Style));
10649 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010650 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010651 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010652 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010653 Style));
10654
10655 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
10656 // next one.
Manuel Klimek93699f42017-11-29 14:29:43 +000010657 EXPECT_EQ("// foo bar baz bazfoo\n"
10658 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010659 format("// foo bar baz bazfoo bar\n"
10660 "// foo bar\n",
10661 Style));
10662
10663 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010664 "// foo bar baz bazfoo\n"
10665 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010666 format("// foo bar baz bazfoo\n"
10667 "// foo bar baz bazfoo bar\n"
10668 "// foo bar\n",
10669 Style));
10670
Manuel Klimek77866142017-11-17 11:17:15 +000010671 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010672 "// foo bar baz bazfoo\n"
10673 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010674 format("// foo bar baz bazfoo\n"
10675 "// foo bar baz bazfoo bar\n"
10676 "// foo bar\n",
10677 Style));
Manuel Klimek0b58c322017-12-01 13:28:08 +000010678
10679 // Make sure we do not keep protruding characters if strict mode reflow is
10680 // cheaper than keeping protruding characters.
10681 Style.ColumnLimit = 21;
10682 EXPECT_EQ("// foo foo foo foo\n"
10683 "// foo foo foo foo\n"
10684 "// foo foo foo foo\n",
10685 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
10686 Style));
10687
10688 EXPECT_EQ("int a = /* long block\n"
10689 " comment */\n"
10690 " 42;",
10691 format("int a = /* long block comment */ 42;", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010692}
10693
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010694#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10695 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010696 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10697 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010698
10699TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010700 SmallVector<FormatStyle, 3> Styles;
10701 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010702
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010703 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010704 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10705 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10706 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010707
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010708 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010709 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10710 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10711 EXPECT_ALL_STYLES_EQUAL(Styles);
10712
Nico Weber514ecc82014-02-02 20:50:45 +000010713 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010714 EXPECT_TRUE(
10715 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10716 EXPECT_TRUE(
10717 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10718 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010719
Nico Weber514ecc82014-02-02 20:50:45 +000010720 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010721 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10722 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10723 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010724
10725 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010726 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10727 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10728 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010729
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010730 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010731 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10732 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10733 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010734
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010735 Styles[0] = getGNUStyle();
10736 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10737 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10738 EXPECT_ALL_STYLES_EQUAL(Styles);
10739
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010740 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10741}
10742
10743TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10744 SmallVector<FormatStyle, 8> Styles;
10745 Styles.resize(2);
10746
10747 Styles[0] = getGoogleStyle();
10748 Styles[1] = getLLVMStyle();
10749 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10750 EXPECT_ALL_STYLES_EQUAL(Styles);
10751
10752 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010753 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010754 Styles[1] = getLLVMStyle();
10755 Styles[1].Language = FormatStyle::LK_JavaScript;
10756 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10757
10758 Styles[2] = getLLVMStyle();
10759 Styles[2].Language = FormatStyle::LK_JavaScript;
10760 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10761 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010762 &Styles[2])
10763 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010764
10765 Styles[3] = getLLVMStyle();
10766 Styles[3].Language = FormatStyle::LK_JavaScript;
10767 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10768 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010769 &Styles[3])
10770 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010771
10772 Styles[4] = getLLVMStyle();
10773 Styles[4].Language = FormatStyle::LK_JavaScript;
10774 EXPECT_EQ(0, parseConfiguration("---\n"
10775 "BasedOnStyle: LLVM\n"
10776 "IndentWidth: 123\n"
10777 "---\n"
10778 "BasedOnStyle: Google\n"
10779 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010780 &Styles[4])
10781 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010782 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010783}
10784
Daniel Jasper91881d92014-09-29 08:07:46 +000010785#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010786 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010787 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010788 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010789 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010790 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010791
Daniel Jasper91881d92014-09-29 08:07:46 +000010792#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10793
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010794#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10795 Style.STRUCT.FIELD = false; \
10796 EXPECT_EQ(0, \
10797 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10798 .value()); \
10799 EXPECT_TRUE(Style.STRUCT.FIELD); \
10800 EXPECT_EQ(0, \
10801 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10802 .value()); \
10803 EXPECT_FALSE(Style.STRUCT.FIELD);
10804
10805#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10806 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10807
Daniel Jasper00853002014-09-16 16:22:30 +000010808#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10809 EXPECT_NE(VALUE, Style.FIELD); \
10810 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10811 EXPECT_EQ(VALUE, Style.FIELD)
10812
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010813TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010814 FormatStyle Style = {};
10815 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +000010816 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010817 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010818 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010819 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010820 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010821 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010822 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010823 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010824 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper18210d72014-10-09 09:52:05 +000010825 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010826 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010827 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010828 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010829 CHECK_PARSE_BOOL(BreakStringLiterals);
Francois Ferrande56a8292017-06-14 12:29:47 +000010830 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010831 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010832 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010833 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010834 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010835 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010836 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010837 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010838 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010839 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010840 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010841 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010842 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +000010843 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010844 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010845 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010846 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010847 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010848 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010849 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010850 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010851 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010852 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Hans Wennborgbfc34062018-06-14 08:01:09 +000010853 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
Francois Ferrand2a9ea782018-03-01 10:09:13 +000010854 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
10855 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
10856 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010857
10858 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10859 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10860 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10861 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10862 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10863 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10864 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10865 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
Krasimir Georgievd6ce9372017-09-15 11:23:50 +000010866 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010867 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10868 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10869 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +000010870 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10871 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10872 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010873}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010874
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010875#undef CHECK_PARSE_BOOL
10876
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010877TEST_F(FormatTest, ParsesConfiguration) {
10878 FormatStyle Style = {};
10879 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010880 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010881 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10882 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010883 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010884 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10885 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +000010886 CHECK_PARSE("PenaltyBreakAssignment: 1234",
10887 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010888 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10889 PenaltyBreakBeforeFirstCallParameter, 1234u);
Francois Ferrand58e6fe52018-05-16 08:25:03 +000010890 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
10891 PenaltyBreakTemplateDeclaration, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010892 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10893 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10894 PenaltyReturnTypeOnItsOwnLine, 1234u);
10895 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10896 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010897 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010898 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010899 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010900
Daniel Jasper553d4872014-06-17 12:40:34 +000010901 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010902 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10903 FormatStyle::PAS_Left);
10904 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10905 FormatStyle::PAS_Right);
10906 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10907 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010908 // For backward compatibility:
10909 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10910 FormatStyle::PAS_Left);
10911 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10912 FormatStyle::PAS_Right);
10913 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10914 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010915
Alexander Kornienkod6538332013-05-07 15:32:14 +000010916 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010917 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10918 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010919 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10920 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10921 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10922
Daniel Jasperac043c92014-09-15 11:11:00 +000010923 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010924 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10925 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010926 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10927 FormatStyle::BOS_None);
10928 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10929 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010930 // For backward compatibility:
10931 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10932 FormatStyle::BOS_None);
10933 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10934 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010935
Francois Ferranda6b6d512017-05-24 11:36:58 +000010936 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10937 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10938 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10939 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10940 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10941 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10942 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10943 // For backward compatibility:
10944 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10945 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10946
Francois Ferrand6bb103f2018-06-11 14:41:26 +000010947 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
10948 CHECK_PARSE("BreakInheritanceList: BeforeComma",
10949 BreakInheritanceList, FormatStyle::BILS_BeforeComma);
10950 CHECK_PARSE("BreakInheritanceList: AfterColon",
10951 BreakInheritanceList, FormatStyle::BILS_AfterColon);
10952 CHECK_PARSE("BreakInheritanceList: BeforeColon",
10953 BreakInheritanceList, FormatStyle::BILS_BeforeColon);
10954 // For backward compatibility:
10955 CHECK_PARSE("BreakBeforeInheritanceComma: true",
10956 BreakInheritanceList, FormatStyle::BILS_BeforeComma);
10957
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010958 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10959 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10960 FormatStyle::BAS_Align);
10961 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10962 FormatStyle::BAS_DontAlign);
10963 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10964 FormatStyle::BAS_AlwaysBreak);
10965 // For backward compatibility:
10966 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10967 FormatStyle::BAS_DontAlign);
10968 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10969 FormatStyle::BAS_Align);
10970
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +000010971 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10972 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
10973 FormatStyle::ENAS_DontAlign);
10974 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
10975 FormatStyle::ENAS_Left);
10976 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
10977 FormatStyle::ENAS_Right);
10978 // For backward compatibility:
10979 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
10980 FormatStyle::ENAS_Left);
10981 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
10982 FormatStyle::ENAS_Right);
10983
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010984 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010985 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10986 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10987 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010988 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10989 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010990 // For backward compatibility:
10991 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10992 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010993
Daniel Jasperd74cf402014-04-08 12:46:38 +000010994 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010995 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10996 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10997 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10998 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010999 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
11000 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000011001 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
11002 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000011003 // For backward compatibility:
11004 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
11005 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
11006 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
11007 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000011008
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000011009 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
11010 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
11011 FormatStyle::SBPO_Never);
11012 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
11013 FormatStyle::SBPO_Always);
11014 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
11015 FormatStyle::SBPO_ControlStatements);
11016 // For backward compatibility:
11017 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
11018 FormatStyle::SBPO_Never);
11019 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
11020 FormatStyle::SBPO_ControlStatements);
11021
Alexander Kornienkod6538332013-05-07 15:32:14 +000011022 Style.ColumnLimit = 123;
11023 FormatStyle BaseStyle = getLLVMStyle();
11024 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
11025 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
11026
Manuel Klimeka8eb9142013-05-13 12:51:40 +000011027 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
11028 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
11029 FormatStyle::BS_Attach);
11030 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
11031 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000011032 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
11033 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000011034 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
11035 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000011036 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
11037 FormatStyle::BS_Allman);
11038 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000011039 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
11040 FormatStyle::BS_WebKit);
11041 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
11042 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000011043
Zachary Turner448592e2015-12-18 22:20:15 +000011044 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
11045 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
11046 FormatStyle::RTBS_None);
11047 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
11048 FormatStyle::RTBS_All);
11049 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000011050 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000011051 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
11052 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
11053 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
11054 AlwaysBreakAfterReturnType,
11055 FormatStyle::RTBS_TopLevelDefinitions);
11056
Francois Ferrand58e6fe52018-05-16 08:25:03 +000011057 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
11058 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", AlwaysBreakTemplateDeclarations,
11059 FormatStyle::BTDS_No);
11060 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", AlwaysBreakTemplateDeclarations,
11061 FormatStyle::BTDS_MultiLine);
11062 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", AlwaysBreakTemplateDeclarations,
11063 FormatStyle::BTDS_Yes);
11064 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", AlwaysBreakTemplateDeclarations,
11065 FormatStyle::BTDS_MultiLine);
11066 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", AlwaysBreakTemplateDeclarations,
11067 FormatStyle::BTDS_Yes);
11068
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000011069 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
11070 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
11071 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
11072 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
11073 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
11074 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
11075 AlwaysBreakAfterDefinitionReturnType,
11076 FormatStyle::DRTBS_TopLevel);
11077
Daniel Jasper65ee3472013-07-31 23:16:02 +000011078 Style.NamespaceIndentation = FormatStyle::NI_All;
11079 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
11080 FormatStyle::NI_None);
11081 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
11082 FormatStyle::NI_Inner);
11083 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
11084 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000011085
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000011086 // FIXME: This is required because parsing a configuration simply overwrites
11087 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000011088 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000011089 std::vector<std::string> BoostForeach;
11090 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000011091 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000011092 std::vector<std::string> BoostAndQForeach;
11093 BoostAndQForeach.push_back("BOOST_FOREACH");
11094 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000011095 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
11096 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000011097
Eric Liu9d92c022018-05-14 19:51:33 +000011098 Style.IncludeStyle.IncludeCategories.clear();
11099 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
11100 {"abc/.*", 2}, {".*", 1}};
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000011101 CHECK_PARSE("IncludeCategories:\n"
11102 " - Regex: abc/.*\n"
11103 " Priority: 2\n"
11104 " - Regex: .*\n"
11105 " Priority: 1",
Eric Liu9d92c022018-05-14 19:51:33 +000011106 IncludeStyle.IncludeCategories, ExpectedCategories);
11107 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
11108 "abc$");
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011109
11110 Style.RawStringFormats.clear();
11111 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011112 {
11113 FormatStyle::LK_TextProto,
11114 {"pb", "proto"},
11115 {"PARSE_TEXT_PROTO"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000011116 /*CanonicalDelimiter=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011117 "llvm",
11118 },
11119 {
11120 FormatStyle::LK_Cpp,
11121 {"cc", "cpp"},
11122 {"C_CODEBLOCK", "CPPEVAL"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000011123 /*CanonicalDelimiter=*/"cc",
11124 /*BasedOnStyle=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011125 },
Krasimir Georgiev4527f132018-01-17 12:24:59 +000011126 };
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011127
11128 CHECK_PARSE("RawStringFormats:\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000011129 " - Language: TextProto\n"
11130 " Delimiters:\n"
11131 " - 'pb'\n"
11132 " - 'proto'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011133 " EnclosingFunctions:\n"
11134 " - 'PARSE_TEXT_PROTO'\n"
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011135 " BasedOnStyle: llvm\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000011136 " - Language: Cpp\n"
11137 " Delimiters:\n"
11138 " - 'cc'\n"
11139 " - 'cpp'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011140 " EnclosingFunctions:\n"
11141 " - 'C_CODEBLOCK'\n"
Krasimir Georgiev412ed092018-01-19 16:18:47 +000011142 " - 'CPPEVAL'\n"
11143 " CanonicalDelimiter: 'cc'",
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011144 RawStringFormats, ExpectedRawStringFormats);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011145}
11146
11147TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
11148 FormatStyle Style = {};
11149 Style.Language = FormatStyle::LK_Cpp;
11150 CHECK_PARSE("Language: Cpp\n"
11151 "IndentWidth: 12",
11152 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000011153 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
11154 "IndentWidth: 34",
11155 &Style),
11156 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011157 EXPECT_EQ(12u, Style.IndentWidth);
11158 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
11159 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
11160
11161 Style.Language = FormatStyle::LK_JavaScript;
11162 CHECK_PARSE("Language: JavaScript\n"
11163 "IndentWidth: 12",
11164 IndentWidth, 12u);
11165 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000011166 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
11167 "IndentWidth: 34",
11168 &Style),
11169 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011170 EXPECT_EQ(23u, Style.IndentWidth);
11171 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
11172 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
11173
11174 CHECK_PARSE("BasedOnStyle: LLVM\n"
11175 "IndentWidth: 67",
11176 IndentWidth, 67u);
11177
11178 CHECK_PARSE("---\n"
11179 "Language: JavaScript\n"
11180 "IndentWidth: 12\n"
11181 "---\n"
11182 "Language: Cpp\n"
11183 "IndentWidth: 34\n"
11184 "...\n",
11185 IndentWidth, 12u);
11186
11187 Style.Language = FormatStyle::LK_Cpp;
11188 CHECK_PARSE("---\n"
11189 "Language: JavaScript\n"
11190 "IndentWidth: 12\n"
11191 "---\n"
11192 "Language: Cpp\n"
11193 "IndentWidth: 34\n"
11194 "...\n",
11195 IndentWidth, 34u);
11196 CHECK_PARSE("---\n"
11197 "IndentWidth: 78\n"
11198 "---\n"
11199 "Language: JavaScript\n"
11200 "IndentWidth: 56\n"
11201 "...\n",
11202 IndentWidth, 78u);
11203
11204 Style.ColumnLimit = 123;
11205 Style.IndentWidth = 234;
11206 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
11207 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000011208 EXPECT_FALSE(parseConfiguration("---\n"
11209 "IndentWidth: 456\n"
11210 "BreakBeforeBraces: Allman\n"
11211 "---\n"
11212 "Language: JavaScript\n"
11213 "IndentWidth: 111\n"
11214 "TabWidth: 111\n"
11215 "---\n"
11216 "Language: Cpp\n"
11217 "BreakBeforeBraces: Stroustrup\n"
11218 "TabWidth: 789\n"
11219 "...\n",
11220 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011221 EXPECT_EQ(123u, Style.ColumnLimit);
11222 EXPECT_EQ(456u, Style.IndentWidth);
11223 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
11224 EXPECT_EQ(789u, Style.TabWidth);
11225
Rafael Espindola1f243172014-06-12 11:35:17 +000011226 EXPECT_EQ(parseConfiguration("---\n"
11227 "Language: JavaScript\n"
11228 "IndentWidth: 56\n"
11229 "---\n"
11230 "IndentWidth: 78\n"
11231 "...\n",
11232 &Style),
11233 ParseError::Error);
11234 EXPECT_EQ(parseConfiguration("---\n"
11235 "Language: JavaScript\n"
11236 "IndentWidth: 56\n"
11237 "---\n"
11238 "Language: JavaScript\n"
11239 "IndentWidth: 78\n"
11240 "...\n",
11241 &Style),
11242 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011243
11244 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
11245}
Daniel Jasper65ee3472013-07-31 23:16:02 +000011246
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011247#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011248
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011249TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
11250 FormatStyle Style = {};
11251 Style.Language = FormatStyle::LK_JavaScript;
11252 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011253 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000011254 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011255
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011256 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011257 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011258 "BasedOnStyle: Google\n"
11259 "---\n"
11260 "Language: JavaScript\n"
11261 "IndentWidth: 76\n"
11262 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011263 &Style)
11264 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000011265 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011266 EXPECT_EQ(76u, Style.IndentWidth);
11267 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
11268}
11269
Alexander Kornienkod6538332013-05-07 15:32:14 +000011270TEST_F(FormatTest, ConfigurationRoundTripTest) {
11271 FormatStyle Style = getLLVMStyle();
11272 std::string YAML = configurationAsText(Style);
11273 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011274 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000011275 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
11276 EXPECT_EQ(Style, ParsedStyle);
11277}
11278
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011279TEST_F(FormatTest, WorksFor8bitEncodings) {
11280 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
11281 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
11282 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
11283 "\"\xef\xee\xf0\xf3...\"",
11284 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
11285 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
11286 "\xef\xee\xf0\xf3...\"",
11287 getLLVMStyleWithColumns(12)));
11288}
11289
Alexander Kornienko393e3082013-11-13 14:04:17 +000011290TEST_F(FormatTest, HandlesUTF8BOM) {
11291 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
11292 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
11293 format("\xef\xbb\xbf#include <iostream>"));
11294 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
11295 format("\xef\xbb\xbf\n#include <iostream>"));
11296}
11297
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000011298// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
11299#if !defined(_MSC_VER)
11300
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011301TEST_F(FormatTest, CountsUTF8CharactersProperly) {
11302 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
11303 getLLVMStyleWithColumns(35));
11304 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011305 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011306 verifyFormat("// Однажды в студёную зимнюю пору...",
11307 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000011308 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011309 verifyFormat("/* Однажды в студёную зимнюю пору... */",
11310 getLLVMStyleWithColumns(39));
11311 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011312 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011313}
11314
11315TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000011316 // Non-printable characters' width is currently considered to be the length in
11317 // bytes in UTF8. The characters can be displayed in very different manner
11318 // (zero-width, single width with a substitution glyph, expanded to their code
11319 // (e.g. "<8d>"), so there's no single correct way to handle them.
11320 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011321 "\"\xc2\x8d\";",
11322 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000011323 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011324 "\"\xc2\x8d\";",
11325 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000011326 EXPECT_EQ("\"Однажды, в \"\n"
11327 "\"студёную \"\n"
11328 "\"зимнюю \"\n"
11329 "\"пору,\"",
11330 format("\"Однажды, в студёную зимнюю пору,\"",
11331 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011332 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000011333 "\"一 二 三 \"\n"
11334 "\"四 五六 \"\n"
11335 "\"七 八 九 \"\n"
11336 "\"十\"",
11337 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Manuel Klimek93699f42017-11-29 14:29:43 +000011338 EXPECT_EQ("\"一\t\"\n"
11339 "\"二 \t\"\n"
11340 "\"三 四 \"\n"
11341 "\"五\t\"\n"
11342 "\"六 \t\"\n"
11343 "\"七 \"\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011344 "\"八九十\tqq\"",
11345 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
11346 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000011347
11348 // UTF8 character in an escape sequence.
11349 EXPECT_EQ("\"aaaaaa\"\n"
11350 "\"\\\xC2\x8D\"",
11351 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011352}
11353
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011354TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
11355 EXPECT_EQ("const char *sssss =\n"
11356 " \"一二三四五六七八\\\n"
11357 " 九 十\";",
11358 format("const char *sssss = \"一二三四五六七八\\\n"
11359 " 九 十\";",
11360 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011361}
11362
11363TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011364 EXPECT_EQ("// aaaaÄ\xc2\x8d",
11365 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011366 EXPECT_EQ("// Я из лесу\n"
11367 "// вышел; был\n"
11368 "// сильный\n"
11369 "// мороз.",
11370 format("// Я из лесу вышел; был сильный мороз.",
11371 getLLVMStyleWithColumns(13)));
11372 EXPECT_EQ("// 一二三\n"
11373 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011374 "// 八 九\n"
11375 "// 十",
11376 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011377}
11378
11379TEST_F(FormatTest, SplitsUTF8BlockComments) {
11380 EXPECT_EQ("/* Гляжу,\n"
11381 " * поднимается\n"
11382 " * медленно в\n"
11383 " * гору\n"
11384 " * Лошадка,\n"
11385 " * везущая\n"
11386 " * хворосту\n"
11387 " * воз. */",
11388 format("/* Гляжу, поднимается медленно в гору\n"
11389 " * Лошадка, везущая хворосту воз. */",
11390 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011391 EXPECT_EQ(
11392 "/* 一二三\n"
11393 " * 四五六七\n"
11394 " * 八 九\n"
11395 " * 十 */",
11396 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000011397 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
11398 " * 𝕓𝕪𝕥𝕖\n"
11399 " * 𝖀𝕿𝕱-𝟠 */",
11400 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011401}
11402
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011403#endif // _MSC_VER
11404
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011405TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
11406 FormatStyle Style = getLLVMStyle();
11407
11408 Style.ConstructorInitializerIndentWidth = 4;
11409 verifyFormat(
11410 "SomeClass::Constructor()\n"
11411 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11412 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11413 Style);
11414
11415 Style.ConstructorInitializerIndentWidth = 2;
11416 verifyFormat(
11417 "SomeClass::Constructor()\n"
11418 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11419 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11420 Style);
11421
11422 Style.ConstructorInitializerIndentWidth = 0;
11423 verifyFormat(
11424 "SomeClass::Constructor()\n"
11425 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11426 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11427 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000011428 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
11429 verifyFormat(
11430 "SomeLongTemplateVariableName<\n"
11431 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
11432 Style);
11433 verifyFormat(
11434 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
11435 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
11436 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000011437}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011438
Daniel Jasper00853002014-09-16 16:22:30 +000011439TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
11440 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000011441 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011442 Style.ConstructorInitializerIndentWidth = 4;
11443 verifyFormat("SomeClass::Constructor()\n"
11444 " : a(a)\n"
11445 " , b(b)\n"
11446 " , c(c) {}",
11447 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011448 verifyFormat("SomeClass::Constructor()\n"
11449 " : a(a) {}",
11450 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011451
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011452 Style.ColumnLimit = 0;
11453 verifyFormat("SomeClass::Constructor()\n"
11454 " : a(a) {}",
11455 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000011456 verifyFormat("SomeClass::Constructor() noexcept\n"
11457 " : a(a) {}",
11458 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011459 verifyFormat("SomeClass::Constructor()\n"
11460 " : a(a)\n"
11461 " , b(b)\n"
11462 " , c(c) {}",
11463 Style);
11464 verifyFormat("SomeClass::Constructor()\n"
11465 " : a(a) {\n"
11466 " foo();\n"
11467 " bar();\n"
11468 "}",
11469 Style);
11470
Daniel Jasperd74cf402014-04-08 12:46:38 +000011471 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011472 verifyFormat("SomeClass::Constructor()\n"
11473 " : a(a)\n"
11474 " , b(b)\n"
11475 " , c(c) {\n}",
11476 Style);
11477 verifyFormat("SomeClass::Constructor()\n"
11478 " : a(a) {\n}",
11479 Style);
11480
11481 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000011482 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011483 Style.ConstructorInitializerIndentWidth = 2;
11484 verifyFormat("SomeClass::Constructor()\n"
11485 " : a(a)\n"
11486 " , b(b)\n"
11487 " , c(c) {}",
11488 Style);
11489
11490 Style.ConstructorInitializerIndentWidth = 0;
11491 verifyFormat("SomeClass::Constructor()\n"
11492 ": a(a)\n"
11493 ", b(b)\n"
11494 ", c(c) {}",
11495 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011496
11497 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
11498 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011499 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
11500 verifyFormat(
11501 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
11502 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011503 verifyFormat(
11504 "SomeClass::Constructor()\n"
11505 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
11506 Style);
11507 Style.ConstructorInitializerIndentWidth = 4;
11508 Style.ColumnLimit = 60;
11509 verifyFormat("SomeClass::Constructor()\n"
11510 " : aaaaaaaa(aaaaaaaa)\n"
11511 " , aaaaaaaa(aaaaaaaa)\n"
11512 " , aaaaaaaa(aaaaaaaa) {}",
11513 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011514}
11515
Daniel Jasper38efc132014-10-21 07:51:54 +000011516TEST_F(FormatTest, Destructors) {
11517 verifyFormat("void F(int &i) { i.~int(); }");
11518 verifyFormat("void F(int &i) { i->~int(); }");
11519}
11520
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011521TEST_F(FormatTest, FormatsWithWebKitStyle) {
11522 FormatStyle Style = getWebKitStyle();
11523
11524 // Don't indent in outer namespaces.
11525 verifyFormat("namespace outer {\n"
11526 "int i;\n"
11527 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000011528 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011529 "} // namespace inner\n"
11530 "} // namespace outer\n"
11531 "namespace other_outer {\n"
11532 "int i;\n"
11533 "}",
11534 Style);
11535
11536 // Don't indent case labels.
11537 verifyFormat("switch (variable) {\n"
11538 "case 1:\n"
11539 "case 2:\n"
11540 " doSomething();\n"
11541 " break;\n"
11542 "default:\n"
11543 " ++variable;\n"
11544 "}",
11545 Style);
11546
11547 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000011548 EXPECT_EQ("void f()\n"
11549 "{\n"
11550 " if (aaaaaaaaaaaaaaaa\n"
11551 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
11552 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11553 " return;\n"
11554 "}",
11555 format("void f() {\n"
11556 "if (aaaaaaaaaaaaaaaa\n"
11557 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
11558 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11559 "return;\n"
11560 "}",
11561 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011562
Daniel Jasper35995672014-04-29 14:05:20 +000011563 // Allow functions on a single line.
11564 verifyFormat("void f() { return; }", Style);
11565
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011566 // Constructor initializers are formatted one per line with the "," on the
11567 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011568 verifyFormat("Constructor()\n"
11569 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
11570 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000011571 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011572 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
11573 "{\n"
11574 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011575 Style);
11576 verifyFormat("SomeClass::Constructor()\n"
11577 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011578 "{\n"
11579 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011580 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000011581 EXPECT_EQ("SomeClass::Constructor()\n"
11582 " : a(a)\n"
11583 "{\n"
11584 "}",
11585 format("SomeClass::Constructor():a(a){}", Style));
11586 verifyFormat("SomeClass::Constructor()\n"
11587 " : a(a)\n"
11588 " , b(b)\n"
11589 " , c(c)\n"
11590 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011591 "}",
11592 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011593 verifyFormat("SomeClass::Constructor()\n"
11594 " : a(a)\n"
11595 "{\n"
11596 " foo();\n"
11597 " bar();\n"
11598 "}",
11599 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011600
Daniel Jasper65ee3472013-07-31 23:16:02 +000011601 // Access specifiers should be aligned left.
11602 verifyFormat("class C {\n"
11603 "public:\n"
11604 " int i;\n"
11605 "};",
11606 Style);
11607
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011608 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000011609 verifyFormat("int a; // Do not\n"
11610 "double b; // align comments.",
11611 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011612
Daniel Jasper3219e432014-12-02 13:24:51 +000011613 // Do not align operands.
11614 EXPECT_EQ("ASSERT(aaaa\n"
11615 " || bbbb);",
11616 format("ASSERT ( aaaa\n||bbbb);", Style));
11617
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011618 // Accept input's line breaks.
11619 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
11620 " || bbbbbbbbbbbbbbb) {\n"
11621 " i++;\n"
11622 "}",
11623 format("if (aaaaaaaaaaaaaaa\n"
11624 "|| bbbbbbbbbbbbbbb) { i++; }",
11625 Style));
11626 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
11627 " i++;\n"
11628 "}",
11629 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000011630
11631 // Don't automatically break all macro definitions (llvm.org/PR17842).
11632 verifyFormat("#define aNumber 10", Style);
11633 // However, generally keep the line breaks that the user authored.
11634 EXPECT_EQ("#define aNumber \\\n"
11635 " 10",
11636 format("#define aNumber \\\n"
11637 " 10",
11638 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000011639
11640 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011641 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
11642 " copyItems:YES];",
11643 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
11644 "copyItems:YES];",
11645 Style));
11646 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
11647 " copyItems:YES];",
11648 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
11649 " copyItems:YES];",
11650 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000011651 // FIXME: This does not seem right, there should be more indentation before
11652 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011653 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000011654 " @\"a\",\n"
11655 " @\"a\"\n"
11656 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011657 " copyItems:YES];",
11658 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11659 " @\"a\",\n"
11660 " @\"a\"\n"
11661 " ]\n"
11662 " copyItems:YES];",
11663 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011664 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011665 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11666 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011667 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11668 " copyItems:YES];",
11669 Style));
11670
11671 verifyFormat("[self.a b:c c:d];", Style);
11672 EXPECT_EQ("[self.a b:c\n"
11673 " c:d];",
11674 format("[self.a b:c\n"
11675 "c:d];",
11676 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011677}
11678
Manuel Klimekffdeb592013-09-03 15:10:01 +000011679TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011680 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11681 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11682 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11683 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11684 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011685 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Manuel Klimek9f0a4e52017-09-19 09:59:30 +000011686 verifyFormat("auto c = [a = [b = 42] {}] {};\n");
11687 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011688 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011689 verifyFormat("void f() {\n"
11690 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11691 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011692 verifyFormat("void f() {\n"
11693 " other(x.begin(), //\n"
11694 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011695 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011696 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011697 verifyFormat("SomeFunction([]() { // A cool function...\n"
11698 " return 43;\n"
11699 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011700 EXPECT_EQ("SomeFunction([]() {\n"
11701 "#define A a\n"
11702 " return 43;\n"
11703 "});",
11704 format("SomeFunction([](){\n"
11705 "#define A a\n"
11706 "return 43;\n"
11707 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011708 verifyFormat("void f() {\n"
11709 " SomeFunction([](decltype(x), A *a) {});\n"
11710 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011711 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11712 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011713 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11714 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11715 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011716 verifyFormat("Constructor()\n"
11717 " : Field([] { // comment\n"
11718 " int i;\n"
11719 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011720 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11721 " return some_parameter.size();\n"
11722 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011723 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11724 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011725 verifyFormat("int i = aaaaaa ? 1 //\n"
11726 " : [] {\n"
11727 " return 2; //\n"
11728 " }();");
11729 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11730 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11731 " return x == 2; // force break\n"
11732 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011733 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11734 " [=](int iiiiiiiiiiii) {\n"
11735 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
11736 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
11737 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011738 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011739 verifyFormat("SomeFunction({[&] {\n"
11740 " // comment\n"
11741 " },\n"
11742 " [&] {\n"
11743 " // comment\n"
11744 " }});");
11745 verifyFormat("SomeFunction({[&] {\n"
11746 " // comment\n"
11747 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011748 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11749 " [&]() { return true; },\n"
11750 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011751
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011752 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011753 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011754 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011755 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11756 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011757 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011758 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011759 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11760 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011761 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011762 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11763 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011764 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011765 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011766 verifyFormat(
11767 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11768 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11769 " return aaaaaaaaaaaaaaaaa;\n"
11770 " });",
11771 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011772 verifyFormat("[]() //\n"
11773 " -> int {\n"
11774 " return 1; //\n"
11775 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011776
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011777 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011778 verifyFormat("SomeFunction(\n"
11779 " []() {\n"
11780 " int i = 42;\n"
11781 " return i;\n"
11782 " },\n"
11783 " []() {\n"
11784 " int j = 43;\n"
11785 " return j;\n"
11786 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011787
Daniel Jasperda18fd82014-06-10 06:39:03 +000011788 // More complex introducers.
11789 verifyFormat("return [i, args...] {};");
11790
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011791 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011792 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011793 verifyFormat("double &operator[](int i) { return 0; }\n"
11794 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011795 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011796 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011797 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011798
11799 // Other corner cases.
11800 verifyFormat("void f() {\n"
11801 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000011802 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000011803 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011804
11805 // Lambdas created through weird macros.
11806 verifyFormat("void f() {\n"
11807 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011808 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011809 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011810
11811 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11812 " doo_dah();\n"
11813 " doo_dah();\n"
11814 " })) {\n"
11815 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000011816 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
11817 " doo_dah();\n"
11818 " doo_dah();\n"
11819 " })) {\n"
11820 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011821 verifyFormat("auto lambda = []() {\n"
11822 " int a = 2\n"
11823 "#if A\n"
11824 " + 2\n"
11825 "#endif\n"
11826 " ;\n"
11827 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011828
11829 // Lambdas with complex multiline introducers.
11830 verifyFormat(
11831 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11832 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
11833 " -> ::std::unordered_set<\n"
11834 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
11835 " //\n"
11836 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011837}
11838
Martin Probsta004b3f2017-11-17 18:06:33 +000011839TEST_F(FormatTest, EmptyLinesInLambdas) {
11840 verifyFormat("auto lambda = []() {\n"
11841 " x(); //\n"
11842 "};",
11843 "auto lambda = []() {\n"
11844 "\n"
11845 " x(); //\n"
11846 "\n"
11847 "};");
11848}
11849
Manuel Klimek516e0542013-09-04 13:25:30 +000011850TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011851 FormatStyle ShortBlocks = getLLVMStyle();
11852 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11853 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11854 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11855 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11856 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11857 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11858 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011859
Daniel Jasper76284682014-10-22 09:12:44 +000011860 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11861 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11862 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011863
Daniel Jasper76284682014-10-22 09:12:44 +000011864 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011865 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011866 "}];");
11867 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011868 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011869 "}]};");
11870 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011871 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011872 "}];");
11873 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011874 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011875 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011876 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011877 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011878 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011879 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011880 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011881
11882 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011883 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011884 "}];",
11885 getLLVMStyleWithColumns(60));
11886 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011887 " NSString *path = [self sessionFilePath];\n"
11888 " if (path) {\n"
11889 " // ...\n"
11890 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011891 "});");
11892 verifyFormat("[[SessionService sharedService]\n"
11893 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011894 " if (window) {\n"
11895 " [self windowDidLoad:window];\n"
11896 " } else {\n"
11897 " [self errorLoadingWindow];\n"
11898 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011899 " }];");
11900 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011901 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011902 "};\n",
11903 getLLVMStyleWithColumns(40));
11904 verifyFormat("[[SessionService sharedService]\n"
11905 " loadWindowWithCompletionBlock: //\n"
11906 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011907 " if (window) {\n"
11908 " [self windowDidLoad:window];\n"
11909 " } else {\n"
11910 " [self errorLoadingWindow];\n"
11911 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011912 " }];",
11913 getLLVMStyleWithColumns(60));
11914 verifyFormat("[myObject doSomethingWith:arg1\n"
11915 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011916 " // ...\n"
11917 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011918 " }\n"
11919 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011920 " // ...\n"
11921 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011922 " }\n"
11923 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011924 " // ...\n"
11925 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011926 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011927 verifyFormat("[myObject doSomethingWith:arg1\n"
11928 " firstBlock:-1\n"
11929 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011930 " // ...\n"
11931 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011932 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011933
11934 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011935 " @autoreleasepool {\n"
11936 " if (a) {\n"
11937 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011938 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011939 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011940 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011941 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011942 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11943 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011944
11945 FormatStyle FourIndent = getLLVMStyle();
11946 FourIndent.ObjCBlockIndentWidth = 4;
11947 verifyFormat("[operation setCompletionBlock:^{\n"
11948 " [self onOperationDone];\n"
11949 "}];",
11950 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011951}
11952
Daniel Jasper289afc02015-04-23 09:23:17 +000011953TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11954 FormatStyle ZeroColumn = getLLVMStyle();
11955 ZeroColumn.ColumnLimit = 0;
11956
11957 verifyFormat("[[SessionService sharedService] "
11958 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11959 " if (window) {\n"
11960 " [self windowDidLoad:window];\n"
11961 " } else {\n"
11962 " [self errorLoadingWindow];\n"
11963 " }\n"
11964 "}];",
11965 ZeroColumn);
11966 EXPECT_EQ("[[SessionService sharedService]\n"
11967 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11968 " if (window) {\n"
11969 " [self windowDidLoad:window];\n"
11970 " } else {\n"
11971 " [self errorLoadingWindow];\n"
11972 " }\n"
11973 " }];",
11974 format("[[SessionService sharedService]\n"
11975 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11976 " if (window) {\n"
11977 " [self windowDidLoad:window];\n"
11978 " } else {\n"
11979 " [self errorLoadingWindow];\n"
11980 " }\n"
11981 "}];",
11982 ZeroColumn));
11983 verifyFormat("[myObject doSomethingWith:arg1\n"
11984 " firstBlock:^(Foo *a) {\n"
11985 " // ...\n"
11986 " int i;\n"
11987 " }\n"
11988 " secondBlock:^(Bar *b) {\n"
11989 " // ...\n"
11990 " int i;\n"
11991 " }\n"
11992 " thirdBlock:^Foo(Bar *b) {\n"
11993 " // ...\n"
11994 " int i;\n"
11995 " }];",
11996 ZeroColumn);
11997 verifyFormat("f(^{\n"
11998 " @autoreleasepool {\n"
11999 " if (a) {\n"
12000 " g();\n"
12001 " }\n"
12002 " }\n"
12003 "});",
12004 ZeroColumn);
12005 verifyFormat("void (^largeBlock)(void) = ^{\n"
12006 " // ...\n"
12007 "};",
12008 ZeroColumn);
12009
12010 ZeroColumn.AllowShortBlocksOnASingleLine = true;
12011 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000012012 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000012013 ZeroColumn.AllowShortBlocksOnASingleLine = false;
12014 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
12015 " int i;\n"
12016 "};",
12017 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
12018}
12019
Alexander Kornienko9e649af2013-09-11 12:25:57 +000012020TEST_F(FormatTest, SupportsCRLF) {
12021 EXPECT_EQ("int a;\r\n"
12022 "int b;\r\n"
12023 "int c;\r\n",
12024 format("int a;\r\n"
12025 " int b;\r\n"
12026 " int c;\r\n",
12027 getLLVMStyle()));
12028 EXPECT_EQ("int a;\r\n"
12029 "int b;\r\n"
12030 "int c;\r\n",
12031 format("int a;\r\n"
12032 " int b;\n"
12033 " int c;\r\n",
12034 getLLVMStyle()));
12035 EXPECT_EQ("int a;\n"
12036 "int b;\n"
12037 "int c;\n",
12038 format("int a;\r\n"
12039 " int b;\n"
12040 " int c;\n",
12041 getLLVMStyle()));
12042 EXPECT_EQ("\"aaaaaaa \"\r\n"
12043 "\"bbbbbbb\";\r\n",
12044 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
12045 EXPECT_EQ("#define A \\\r\n"
12046 " b; \\\r\n"
12047 " c; \\\r\n"
12048 " d;\r\n",
12049 format("#define A \\\r\n"
12050 " b; \\\r\n"
12051 " c; d; \r\n",
12052 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000012053
12054 EXPECT_EQ("/*\r\n"
12055 "multi line block comments\r\n"
12056 "should not introduce\r\n"
12057 "an extra carriage return\r\n"
12058 "*/\r\n",
12059 format("/*\r\n"
12060 "multi line block comments\r\n"
12061 "should not introduce\r\n"
12062 "an extra carriage return\r\n"
12063 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000012064}
12065
Manuel Klimekb212f3b2013-10-12 22:46:56 +000012066TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
12067 verifyFormat("MY_CLASS(C) {\n"
12068 " int i;\n"
12069 " int j;\n"
12070 "};");
12071}
12072
Daniel Jasper6633ab82013-10-18 10:38:14 +000012073TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
12074 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
12075 TwoIndent.ContinuationIndentWidth = 2;
12076
12077 EXPECT_EQ("int i =\n"
12078 " longFunction(\n"
12079 " arg);",
12080 format("int i = longFunction(arg);", TwoIndent));
12081
12082 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
12083 SixIndent.ContinuationIndentWidth = 6;
12084
12085 EXPECT_EQ("int i =\n"
12086 " longFunction(\n"
12087 " arg);",
12088 format("int i = longFunction(arg);", SixIndent));
12089}
12090
Daniel Jasperdd978ae2013-10-29 14:52:02 +000012091TEST_F(FormatTest, SpacesInAngles) {
12092 FormatStyle Spaces = getLLVMStyle();
12093 Spaces.SpacesInAngles = true;
12094
12095 verifyFormat("static_cast< int >(arg);", Spaces);
12096 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
12097 verifyFormat("f< int, float >();", Spaces);
12098 verifyFormat("template <> g() {}", Spaces);
12099 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000012100 verifyFormat("std::function< void(int, int) > fct;", Spaces);
12101 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
12102 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000012103
12104 Spaces.Standard = FormatStyle::LS_Cpp03;
12105 Spaces.SpacesInAngles = true;
12106 verifyFormat("A< A< int > >();", Spaces);
12107
12108 Spaces.SpacesInAngles = false;
12109 verifyFormat("A<A<int> >();", Spaces);
12110
12111 Spaces.Standard = FormatStyle::LS_Cpp11;
12112 Spaces.SpacesInAngles = true;
12113 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000012114
Daniel Jasperdd978ae2013-10-29 14:52:02 +000012115 Spaces.SpacesInAngles = false;
12116 verifyFormat("A<A<int>>();", Spaces);
12117}
12118
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000012119TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
12120 FormatStyle Style = getLLVMStyle();
12121 Style.SpaceAfterTemplateKeyword = false;
12122 verifyFormat("template<int> void foo();", Style);
12123}
12124
Jacques Pienaarfc275112015-02-18 23:48:37 +000012125TEST_F(FormatTest, TripleAngleBrackets) {
12126 verifyFormat("f<<<1, 1>>>();");
12127 verifyFormat("f<<<1, 1, 1, s>>>();");
12128 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000012129 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000012130 verifyFormat("f<param><<<1, 1>>>();");
12131 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000012132 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000012133 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12134 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000012135 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
12136 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000012137}
12138
12139TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000012140 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000012141 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000012142 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12143 "aaallvm::outs() <<");
12144 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12145 "aaaallvm::outs()\n <<");
12146}
12147
Manuel Klimek819788d2014-03-18 11:22:45 +000012148TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
12149 std::string code = "#if A\n"
12150 "#if B\n"
12151 "a.\n"
12152 "#endif\n"
12153 " a = 1;\n"
12154 "#else\n"
12155 "#endif\n"
12156 "#if C\n"
12157 "#else\n"
12158 "#endif\n";
12159 EXPECT_EQ(code, format(code));
12160}
12161
Manuel Klimek68b03042014-04-14 09:14:11 +000012162TEST_F(FormatTest, HandleConflictMarkers) {
12163 // Git/SVN conflict markers.
12164 EXPECT_EQ("int a;\n"
12165 "void f() {\n"
12166 " callme(some(parameter1,\n"
12167 "<<<<<<< text by the vcs\n"
12168 " parameter2),\n"
12169 "||||||| text by the vcs\n"
12170 " parameter2),\n"
12171 " parameter3,\n"
12172 "======= text by the vcs\n"
12173 " parameter2, parameter3),\n"
12174 ">>>>>>> text by the vcs\n"
12175 " otherparameter);\n",
12176 format("int a;\n"
12177 "void f() {\n"
12178 " callme(some(parameter1,\n"
12179 "<<<<<<< text by the vcs\n"
12180 " parameter2),\n"
12181 "||||||| text by the vcs\n"
12182 " parameter2),\n"
12183 " parameter3,\n"
12184 "======= text by the vcs\n"
12185 " parameter2,\n"
12186 " parameter3),\n"
12187 ">>>>>>> text by the vcs\n"
12188 " otherparameter);\n"));
12189
12190 // Perforce markers.
12191 EXPECT_EQ("void f() {\n"
12192 " function(\n"
12193 ">>>> text by the vcs\n"
12194 " parameter,\n"
12195 "==== text by the vcs\n"
12196 " parameter,\n"
12197 "==== text by the vcs\n"
12198 " parameter,\n"
12199 "<<<< text by the vcs\n"
12200 " parameter);\n",
12201 format("void f() {\n"
12202 " function(\n"
12203 ">>>> text by the vcs\n"
12204 " parameter,\n"
12205 "==== text by the vcs\n"
12206 " parameter,\n"
12207 "==== text by the vcs\n"
12208 " parameter,\n"
12209 "<<<< text by the vcs\n"
12210 " parameter);\n"));
12211
12212 EXPECT_EQ("<<<<<<<\n"
12213 "|||||||\n"
12214 "=======\n"
12215 ">>>>>>>",
12216 format("<<<<<<<\n"
12217 "|||||||\n"
12218 "=======\n"
12219 ">>>>>>>"));
12220
12221 EXPECT_EQ("<<<<<<<\n"
12222 "|||||||\n"
12223 "int i;\n"
12224 "=======\n"
12225 ">>>>>>>",
12226 format("<<<<<<<\n"
12227 "|||||||\n"
12228 "int i;\n"
12229 "=======\n"
12230 ">>>>>>>"));
12231
12232 // FIXME: Handle parsing of macros around conflict markers correctly:
12233 EXPECT_EQ("#define Macro \\\n"
12234 "<<<<<<<\n"
12235 "Something \\\n"
12236 "|||||||\n"
12237 "Else \\\n"
12238 "=======\n"
12239 "Other \\\n"
12240 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000012241 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000012242 format("#define Macro \\\n"
12243 "<<<<<<<\n"
12244 " Something \\\n"
12245 "|||||||\n"
12246 " Else \\\n"
12247 "=======\n"
12248 " Other \\\n"
12249 ">>>>>>>\n"
12250 " End\n"
12251 "int i;\n"));
12252}
12253
Daniel Jasper471894432014-08-06 13:40:26 +000012254TEST_F(FormatTest, DisableRegions) {
12255 EXPECT_EQ("int i;\n"
12256 "// clang-format off\n"
12257 " int j;\n"
12258 "// clang-format on\n"
12259 "int k;",
12260 format(" int i;\n"
12261 " // clang-format off\n"
12262 " int j;\n"
12263 " // clang-format on\n"
12264 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000012265 EXPECT_EQ("int i;\n"
12266 "/* clang-format off */\n"
12267 " int j;\n"
12268 "/* clang-format on */\n"
12269 "int k;",
12270 format(" int i;\n"
12271 " /* clang-format off */\n"
12272 " int j;\n"
12273 " /* clang-format on */\n"
12274 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000012275
12276 // Don't reflow comments within disabled regions.
12277 EXPECT_EQ(
12278 "// clang-format off\n"
12279 "// long long long long long long line\n"
12280 "/* clang-format on */\n"
12281 "/* long long long\n"
12282 " * long long long\n"
12283 " * line */\n"
12284 "int i;\n"
12285 "/* clang-format off */\n"
12286 "/* long long long long long long line */\n",
12287 format("// clang-format off\n"
12288 "// long long long long long long line\n"
12289 "/* clang-format on */\n"
12290 "/* long long long long long long line */\n"
12291 "int i;\n"
12292 "/* clang-format off */\n"
12293 "/* long long long long long long line */\n",
12294 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000012295}
12296
Manuel Klimekf0c95b32015-06-11 10:14:13 +000012297TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
12298 format("? ) =");
12299 verifyNoCrash("#define a\\\n /**/}");
12300}
Manuel Klimek5f594f82014-08-13 14:00:41 +000012301
Daniel Jasper498f5582015-12-25 08:53:31 +000012302TEST_F(FormatTest, FormatsTableGenCode) {
12303 FormatStyle Style = getLLVMStyle();
12304 Style.Language = FormatStyle::LK_TableGen;
12305 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
12306}
12307
Nico Weberb2673a12016-11-10 21:49:25 +000012308TEST_F(FormatTest, ArrayOfTemplates) {
12309 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
12310 format("auto a = new unique_ptr<int > [ 10];"));
12311
12312 FormatStyle Spaces = getLLVMStyle();
12313 Spaces.SpacesInSquareBrackets = true;
12314 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
12315 format("auto a = new unique_ptr<int > [10];", Spaces));
12316}
12317
12318TEST_F(FormatTest, ArrayAsTemplateType) {
12319 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
12320 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
12321
12322 FormatStyle Spaces = getLLVMStyle();
12323 Spaces.SpacesInSquareBrackets = true;
12324 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
12325 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
12326}
12327
Martin Probstc9c51c42017-03-16 10:21:35 +000012328TEST_F(FormatTest, NoSpaceAfterSuper) {
12329 verifyFormat("__super::FooBar();");
12330}
12331
Ben Hamilton07e58362018-02-21 21:27:27 +000012332TEST(FormatStyle, GetStyleWithEmptyFileName) {
Bjorn Pettersson0b2f7742018-02-26 14:14:11 +000012333 vfs::InMemoryFileSystem FS;
12334 auto Style1 = getStyle("file", "", "Google", "", &FS);
Ben Hamilton07e58362018-02-21 21:27:27 +000012335 ASSERT_TRUE((bool)Style1);
12336 ASSERT_EQ(*Style1, getGoogleStyle());
12337}
12338
Eric Liu547d8792016-03-24 13:22:42 +000012339TEST(FormatStyle, GetStyleOfFile) {
12340 vfs::InMemoryFileSystem FS;
12341 // Test 1: format file in the same directory.
12342 ASSERT_TRUE(
12343 FS.addFile("/a/.clang-format", 0,
12344 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
12345 ASSERT_TRUE(
12346 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012347 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012348 ASSERT_TRUE((bool)Style1);
12349 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000012350
Antonio Maiorano7eb75072017-01-20 01:22:42 +000012351 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000012352 ASSERT_TRUE(
12353 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012354 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012355 ASSERT_TRUE((bool)Style2);
12356 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000012357
Antonio Maiorano7eb75072017-01-20 01:22:42 +000012358 // Test 2.2: no format on 'none' fallback style.
12359 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
12360 ASSERT_TRUE((bool)Style2);
12361 ASSERT_EQ(*Style2, getNoStyle());
12362
12363 // Test 2.3: format if config is found with no based style while fallback is
12364 // 'none'.
12365 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
12366 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
12367 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
12368 ASSERT_TRUE((bool)Style2);
12369 ASSERT_EQ(*Style2, getLLVMStyle());
12370
12371 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
12372 Style2 = getStyle("{}", "a.h", "none", "", &FS);
12373 ASSERT_TRUE((bool)Style2);
12374 ASSERT_EQ(*Style2, getLLVMStyle());
12375
Eric Liu547d8792016-03-24 13:22:42 +000012376 // Test 3: format file in parent directory.
12377 ASSERT_TRUE(
12378 FS.addFile("/c/.clang-format", 0,
12379 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
12380 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
12381 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012382 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012383 ASSERT_TRUE((bool)Style3);
12384 ASSERT_EQ(*Style3, getGoogleStyle());
12385
12386 // Test 4: error on invalid fallback style
12387 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
12388 ASSERT_FALSE((bool)Style4);
12389 llvm::consumeError(Style4.takeError());
12390
12391 // Test 5: error on invalid yaml on command line
12392 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
12393 ASSERT_FALSE((bool)Style5);
12394 llvm::consumeError(Style5.takeError());
12395
12396 // Test 6: error on invalid style
12397 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
12398 ASSERT_FALSE((bool)Style6);
12399 llvm::consumeError(Style6.takeError());
12400
12401 // Test 7: found config file, error on parsing it
12402 ASSERT_TRUE(
12403 FS.addFile("/d/.clang-format", 0,
12404 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
12405 "InvalidKey: InvalidValue")));
12406 ASSERT_TRUE(
12407 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
12408 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
12409 ASSERT_FALSE((bool)Style7);
12410 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000012411}
12412
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012413TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
12414 // Column limit is 20.
12415 std::string Code = "Type *a =\n"
12416 " new Type();\n"
12417 "g(iiiii, 0, jjjjj,\n"
12418 " 0, kkkkk, 0, mm);\n"
12419 "int bad = format ;";
12420 std::string Expected = "auto a = new Type();\n"
12421 "g(iiiii, nullptr,\n"
12422 " jjjjj, nullptr,\n"
12423 " kkkkk, nullptr,\n"
12424 " mm);\n"
12425 "int bad = format ;";
12426 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000012427 tooling::Replacements Replaces = toReplacements(
12428 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
12429 "auto "),
12430 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
12431 "nullptr"),
12432 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
12433 "nullptr"),
12434 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
12435 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012436
12437 format::FormatStyle Style = format::getLLVMStyle();
12438 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000012439 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
12440 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
12441 << llvm::toString(FormattedReplaces.takeError()) << "\n";
12442 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12443 EXPECT_TRUE(static_cast<bool>(Result));
12444 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012445}
12446
Eric Liubaf58c22016-05-18 13:43:48 +000012447TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
12448 std::string Code = "#include \"a.h\"\n"
12449 "#include \"c.h\"\n"
12450 "\n"
12451 "int main() {\n"
12452 " return 0;\n"
12453 "}";
12454 std::string Expected = "#include \"a.h\"\n"
12455 "#include \"b.h\"\n"
12456 "#include \"c.h\"\n"
12457 "\n"
12458 "int main() {\n"
12459 " return 0;\n"
12460 "}";
12461 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000012462 tooling::Replacements Replaces = toReplacements(
12463 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
12464 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000012465
12466 format::FormatStyle Style = format::getLLVMStyle();
12467 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000012468 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
12469 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
12470 << llvm::toString(FormattedReplaces.takeError()) << "\n";
12471 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12472 EXPECT_TRUE(static_cast<bool>(Result));
12473 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000012474}
12475
Krasimir Georgievac16a202017-06-23 11:46:03 +000012476TEST_F(FormatTest, FormatSortsUsingDeclarations) {
12477 EXPECT_EQ("using std::cin;\n"
12478 "using std::cout;",
12479 format("using std::cout;\n"
12480 "using std::cin;", getGoogleStyle()));
12481}
12482
Nico Weberdc065182017-04-05 18:10:42 +000012483TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
12484 format::FormatStyle Style = format::getLLVMStyle();
12485 Style.Standard = FormatStyle::LS_Cpp03;
12486 // cpp03 recognize this string as identifier u8 and literal character 'a'
12487 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
12488}
12489
12490TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
12491 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
12492 // all modes, including C++11, C++14 and C++17
12493 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
12494}
12495
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000012496TEST_F(FormatTest, DoNotFormatLikelyXml) {
12497 EXPECT_EQ("<!-- ;> -->",
12498 format("<!-- ;> -->", getGoogleStyle()));
12499 EXPECT_EQ(" <!-- >; -->",
12500 format(" <!-- >; -->", getGoogleStyle()));
12501}
12502
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012503TEST_F(FormatTest, StructuredBindings) {
12504 // Structured bindings is a C++17 feature.
12505 // all modes, including C++11, C++14 and C++17
12506 verifyFormat("auto [a, b] = f();");
12507 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
12508 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();"));
12509 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();"));
12510 EXPECT_EQ("auto const volatile [a, b] = f();",
12511 format("auto const volatile[a, b] = f();"));
12512 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012513 EXPECT_EQ("auto &[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012514 format("auto &[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012515 EXPECT_EQ("auto &&[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012516 format("auto &&[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012517 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();"));
12518 EXPECT_EQ("auto const volatile &&[a, b] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012519 format("auto const volatile &&[a, b] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012520 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();"));
12521 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();"));
12522 EXPECT_EQ("const auto volatile &&[a, b] = f();",
12523 format("const auto volatile &&[a, b] = f();"));
12524 EXPECT_EQ("volatile const auto &&[a, b] = f();",
12525 format("volatile const auto &&[a, b] = f();"));
12526 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();"));
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012527
Manuel Klimeke411aa82017-09-20 09:29:37 +000012528 // Make sure we don't mistake structured bindings for lambdas.
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012529 FormatStyle PointerMiddle = getLLVMStyle();
12530 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
12531 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
12532 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
12533 verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
12534 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
12535 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
12536 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
12537 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
12538 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
12539 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
12540 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
12541 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
12542 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
12543
12544 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
12545 format("for (const auto && [a, b] : some_range) {\n}"));
12546 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
12547 format("for (const auto & [a, b] : some_range) {\n}"));
12548 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
12549 format("for (const auto[a, b] : some_range) {\n}"));
12550 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);"));
12551 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);"));
12552 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);"));
12553 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);"));
12554 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);"));
12555 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};"));
12556 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};"));
12557 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};"));
Manuel Klimeke411aa82017-09-20 09:29:37 +000012558
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012559 format::FormatStyle Spaces = format::getLLVMStyle();
12560 Spaces.SpacesInSquareBrackets = true;
12561 verifyFormat("auto [ a, b ] = f();", Spaces);
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012562 verifyFormat("auto &&[ a, b ] = f();", Spaces);
12563 verifyFormat("auto &[ a, b ] = f();", Spaces);
12564 verifyFormat("auto const &&[ a, b ] = f();", Spaces);
12565 verifyFormat("auto const &[ a, b ] = f();", Spaces);
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012566}
12567
Ben Hamilton6e066352018-02-27 15:56:40 +000012568TEST_F(FormatTest, FileAndCode) {
12569 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
12570 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
12571 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
12572 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
12573 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
Ben Hamiltonb1a79192018-04-12 15:11:53 +000012574 EXPECT_EQ(
12575 FormatStyle::LK_ObjC,
12576 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
12577 EXPECT_EQ(FormatStyle::LK_ObjC,
12578 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
12579 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
Ben Hamilton6e066352018-02-27 15:56:40 +000012580 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
12581 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
Ben Hamilton19c782d2018-03-22 03:25:22 +000012582 EXPECT_EQ(FormatStyle::LK_ObjC,
12583 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
12584 EXPECT_EQ(
12585 FormatStyle::LK_ObjC,
12586 guessLanguage("foo.h",
12587 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
Ben Hamilton9dc78162018-04-03 14:07:11 +000012588 EXPECT_EQ(
12589 FormatStyle::LK_Cpp,
12590 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
Ben Hamilton3b345c32018-02-21 15:54:31 +000012591}
12592
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012593TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
12594 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
12595 EXPECT_EQ(FormatStyle::LK_ObjC,
12596 guessLanguage("foo.h", "array[[calculator getIndex]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012597 EXPECT_EQ(FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012598 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012599 EXPECT_EQ(
12600 FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012601 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
12602 EXPECT_EQ(FormatStyle::LK_ObjC,
12603 guessLanguage("foo.h", "[[noreturn foo] bar];"));
12604 EXPECT_EQ(FormatStyle::LK_Cpp,
12605 guessLanguage("foo.h", "[[clang::fallthrough]];"));
12606 EXPECT_EQ(FormatStyle::LK_ObjC,
12607 guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
12608 EXPECT_EQ(FormatStyle::LK_Cpp,
12609 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
12610 EXPECT_EQ(FormatStyle::LK_Cpp,
12611 guessLanguage("foo.h", "[[using clang: fallthrough]];"));
12612 EXPECT_EQ(FormatStyle::LK_ObjC,
12613 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
12614 EXPECT_EQ(FormatStyle::LK_Cpp,
12615 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
12616 EXPECT_EQ(
12617 FormatStyle::LK_Cpp,
12618 guessLanguage("foo.h",
12619 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
12620 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012621}
12622
Ben Hamilton788a2222018-03-12 15:42:40 +000012623TEST_F(FormatTest, GuessLanguageWithCaret) {
12624 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
12625 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
12626 EXPECT_EQ(FormatStyle::LK_ObjC,
12627 guessLanguage("foo.h", "int(^)(char, float);"));
12628 EXPECT_EQ(FormatStyle::LK_ObjC,
12629 guessLanguage("foo.h", "int(^foo)(char, float);"));
12630 EXPECT_EQ(FormatStyle::LK_ObjC,
12631 guessLanguage("foo.h", "int(^foo[10])(char, float);"));
12632 EXPECT_EQ(FormatStyle::LK_ObjC,
12633 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
12634 EXPECT_EQ(
12635 FormatStyle::LK_ObjC,
12636 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
12637}
12638
Ben Hamilton6432afe2018-03-22 17:37:19 +000012639TEST_F(FormatTest, GuessLanguageWithChildLines) {
12640 EXPECT_EQ(FormatStyle::LK_Cpp,
12641 guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
12642 EXPECT_EQ(FormatStyle::LK_ObjC,
12643 guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
Ben Hamiltonea7a27b2018-03-27 15:01:21 +000012644 EXPECT_EQ(
12645 FormatStyle::LK_Cpp,
12646 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
12647 EXPECT_EQ(
12648 FormatStyle::LK_ObjC,
12649 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
Ben Hamilton6432afe2018-03-22 17:37:19 +000012650}
12651
Daniel Jasperd246a5a2015-06-15 15:25:11 +000012652} // end namespace
12653} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000012654} // end namespace clang