blob: db2e226a30efa804ee1de6daec203216d727021e [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));
Daniel Jasperb87899b2014-09-10 13:11:45 +00001244}
1245
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001246TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +00001247 verifyFormat("void f() {\n"
1248 " some_code();\n"
1249 "test_label:\n"
1250 " some_other_code();\n"
1251 " {\n"
1252 " some_more_code();\n"
1253 " another_label:\n"
1254 " some_more_code();\n"
1255 " }\n"
1256 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +00001257 verifyFormat("{\n"
1258 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00001259 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +00001260 " some_other_code();\n"
1261 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +00001262 verifyFormat("{\n"
1263 " some_code();\n"
1264 "test_label:;\n"
1265 " int i = 0;\n"
1266 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00001267}
1268
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001269//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001270// Tests for classes, namespaces, etc.
1271//===----------------------------------------------------------------------===//
1272
1273TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001274 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001275}
1276
1277TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1278 verifyFormat("class A {\n"
1279 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001280 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001281 "protected:\n"
1282 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001283 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001284 "};");
Sam McCall6f3778c2018-09-05 07:44:02 +00001285 verifyFormat("export class A {\n"
1286 "public:\n"
1287 "public: // comment\n"
1288 "protected:\n"
1289 "private:\n"
1290 " void f() {}\n"
1291 "};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001292 verifyGoogleFormat("class A {\n"
1293 " public:\n"
1294 " protected:\n"
1295 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001296 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001297 "};");
Sam McCall6f3778c2018-09-05 07:44:02 +00001298 verifyGoogleFormat("export class A {\n"
1299 " public:\n"
1300 " protected:\n"
1301 " private:\n"
1302 " void f() {}\n"
1303 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001304 verifyFormat("class A {\n"
1305 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001306 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001307 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001308 " void f2() {}\n"
1309 "protected slots:\n"
1310 " void f3() {}\n"
1311 "protected Q_SLOTS:\n"
1312 " void f4() {}\n"
1313 "private slots:\n"
1314 " void f5() {}\n"
1315 "private Q_SLOTS:\n"
1316 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001317 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001318 " void g1();\n"
1319 "Q_SIGNALS:\n"
1320 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001321 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001322
1323 // Don't interpret 'signals' the wrong way.
1324 verifyFormat("signals.set();");
1325 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001326 verifyFormat("{\n"
1327 " signals.set(); // This needs indentation.\n"
1328 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001329 verifyFormat("void f() {\n"
1330 "label:\n"
1331 " signals.baz();\n"
1332 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001333}
1334
Alexander Kornienkofd433362013-03-27 17:08:02 +00001335TEST_F(FormatTest, SeparatesLogicalBlocks) {
1336 EXPECT_EQ("class A {\n"
1337 "public:\n"
1338 " void f();\n"
1339 "\n"
1340 "private:\n"
1341 " void g() {}\n"
1342 " // test\n"
1343 "protected:\n"
1344 " int h;\n"
1345 "};",
1346 format("class A {\n"
1347 "public:\n"
1348 "void f();\n"
1349 "private:\n"
1350 "void g() {}\n"
1351 "// test\n"
1352 "protected:\n"
1353 "int h;\n"
1354 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001355 EXPECT_EQ("class A {\n"
1356 "protected:\n"
1357 "public:\n"
1358 " void f();\n"
1359 "};",
1360 format("class A {\n"
1361 "protected:\n"
1362 "\n"
1363 "public:\n"
1364 "\n"
1365 " void f();\n"
1366 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00001367
1368 // Even ensure proper spacing inside macros.
1369 EXPECT_EQ("#define B \\\n"
1370 " class A { \\\n"
1371 " protected: \\\n"
1372 " public: \\\n"
1373 " void f(); \\\n"
1374 " };",
1375 format("#define B \\\n"
1376 " class A { \\\n"
1377 " protected: \\\n"
1378 " \\\n"
1379 " public: \\\n"
1380 " \\\n"
1381 " void f(); \\\n"
1382 " };",
1383 getGoogleStyle()));
1384 // But don't remove empty lines after macros ending in access specifiers.
1385 EXPECT_EQ("#define A private:\n"
1386 "\n"
1387 "int i;",
1388 format("#define A private:\n"
1389 "\n"
1390 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00001391}
1392
Daniel Jasper83193602013-04-05 17:22:09 +00001393TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001394 verifyFormat("class A : public B {};");
1395 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001396
1397 verifyFormat(
1398 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001399 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001400 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1401 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001402 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001403 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001404 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001405 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1406 " public C,\n"
1407 " public D,\n"
1408 " public E,\n"
1409 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001410 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001411
1412 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001413 " ReallyReallyLongClassName {\n"
1414 " int i;\n"
1415 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001416 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001417 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1418 " aaaaaaaaaaaaaaaa> {};");
1419 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1420 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1421 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001422 verifyFormat("template <class R, class C>\n"
1423 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1424 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001425 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001426}
1427
Francois Ferrand6bb103f2018-06-11 14:41:26 +00001428TEST_F(FormatTest, BreakInheritanceStyle) {
1429 FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle();
1430 StyleWithInheritanceBreakBeforeComma.BreakInheritanceList =
1431 FormatStyle::BILS_BeforeComma;
1432 verifyFormat("class MyClass : public X {};",
1433 StyleWithInheritanceBreakBeforeComma);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001434 verifyFormat("class MyClass\n"
1435 " : public X\n"
1436 " , public Y {};",
Francois Ferrand6bb103f2018-06-11 14:41:26 +00001437 StyleWithInheritanceBreakBeforeComma);
1438 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n"
1439 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n"
1440 " , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1441 StyleWithInheritanceBreakBeforeComma);
1442 verifyFormat("struct aaaaaaaaaaaaa\n"
1443 " : public aaaaaaaaaaaaaaaaaaa< // break\n"
1444 " aaaaaaaaaaaaaaaa> {};",
1445 StyleWithInheritanceBreakBeforeComma);
1446
1447 FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle();
1448 StyleWithInheritanceBreakAfterColon.BreakInheritanceList =
1449 FormatStyle::BILS_AfterColon;
1450 verifyFormat("class MyClass : public X {};",
1451 StyleWithInheritanceBreakAfterColon);
1452 verifyFormat("class MyClass : public X, public Y {};",
1453 StyleWithInheritanceBreakAfterColon);
1454 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n"
1455 " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1456 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1457 StyleWithInheritanceBreakAfterColon);
1458 verifyFormat("struct aaaaaaaaaaaaa :\n"
1459 " public aaaaaaaaaaaaaaaaaaa< // break\n"
1460 " aaaaaaaaaaaaaaaa> {};",
1461 StyleWithInheritanceBreakAfterColon);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001462}
1463
Manuel Klimek28cacc72013-01-07 18:10:23 +00001464TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001465 verifyFormat("class A {\n} a, b;");
1466 verifyFormat("struct A {\n} a, b;");
1467 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001468}
1469
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001470TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001471 verifyFormat("enum {\n"
1472 " Zero,\n"
1473 " One = 1,\n"
1474 " Two = One + 1,\n"
1475 " Three = (One + Two),\n"
1476 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1477 " Five = (One, Two, Three, Four, 5)\n"
1478 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001479 verifyGoogleFormat("enum {\n"
1480 " Zero,\n"
1481 " One = 1,\n"
1482 " Two = One + 1,\n"
1483 " Three = (One + Two),\n"
1484 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1485 " Five = (One, Two, Three, Four, 5)\n"
1486 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001487 verifyFormat("enum Enum {};");
1488 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001489 verifyFormat("enum X E {} d;");
1490 verifyFormat("enum __attribute__((...)) E {} d;");
1491 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001492 verifyFormat("enum {\n"
1493 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001494 "};",
1495 getLLVMStyleWithColumns(30));
1496
1497 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001498 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001499
1500 EXPECT_EQ("enum KeepEmptyLines {\n"
1501 " ONE,\n"
1502 "\n"
1503 " TWO,\n"
1504 "\n"
1505 " THREE\n"
1506 "}",
1507 format("enum KeepEmptyLines {\n"
1508 " ONE,\n"
1509 "\n"
1510 " TWO,\n"
1511 "\n"
1512 "\n"
1513 " THREE\n"
1514 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001515 verifyFormat("enum E { // comment\n"
1516 " ONE,\n"
1517 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001518 "};\n"
1519 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001520 // Not enums.
1521 verifyFormat("enum X f() {\n"
1522 " a();\n"
1523 " return 42;\n"
1524 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001525 verifyFormat("enum X Type::f() {\n"
1526 " a();\n"
1527 " return 42;\n"
1528 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001529 verifyFormat("enum ::X f() {\n"
1530 " a();\n"
1531 " return 42;\n"
1532 "}");
1533 verifyFormat("enum ns::X f() {\n"
1534 " a();\n"
1535 " return 42;\n"
1536 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001537}
1538
Daniel Jasperb7150872013-08-30 10:10:19 +00001539TEST_F(FormatTest, FormatsEnumsWithErrors) {
1540 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001541 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001542 " Two = 1;\n"
1543 "};");
1544 verifyFormat("namespace n {\n"
1545 "enum Type {\n"
1546 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001547 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001548 " int i;\n"
1549 "}\n"
1550 "void g() {}");
1551}
1552
Daniel Jasper2b41a822013-08-20 12:42:50 +00001553TEST_F(FormatTest, FormatsEnumStruct) {
1554 verifyFormat("enum struct {\n"
1555 " Zero,\n"
1556 " One = 1,\n"
1557 " Two = One + 1,\n"
1558 " Three = (One + Two),\n"
1559 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1560 " Five = (One, Two, Three, Four, 5)\n"
1561 "};");
1562 verifyFormat("enum struct Enum {};");
1563 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001564 verifyFormat("enum struct X E {} d;");
1565 verifyFormat("enum struct __attribute__((...)) E {} d;");
1566 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001567 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1568}
1569
1570TEST_F(FormatTest, FormatsEnumClass) {
1571 verifyFormat("enum class {\n"
1572 " Zero,\n"
1573 " One = 1,\n"
1574 " Two = One + 1,\n"
1575 " Three = (One + Two),\n"
1576 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1577 " Five = (One, Two, Three, Four, 5)\n"
1578 "};");
1579 verifyFormat("enum class Enum {};");
1580 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001581 verifyFormat("enum class X E {} d;");
1582 verifyFormat("enum class __attribute__((...)) E {} d;");
1583 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001584 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1585}
1586
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001587TEST_F(FormatTest, FormatsEnumTypes) {
1588 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001589 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001590 " B\n"
1591 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001592 verifyFormat("enum X : int { A, B };");
1593 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001594}
1595
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001596TEST_F(FormatTest, FormatsTypedefEnum) {
1597 FormatStyle Style = getLLVMStyle();
1598 Style.ColumnLimit = 40;
1599 verifyFormat("typedef enum {} EmptyEnum;");
1600 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1601 verifyFormat("typedef enum {\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001602 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001603 " ONE = 1,\n"
1604 " TWO = 2,\n"
1605 " THREE = 3\n"
1606 "} LongEnum;",
1607 Style);
1608 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1609 Style.BraceWrapping.AfterEnum = true;
1610 verifyFormat("typedef enum {} EmptyEnum;");
1611 verifyFormat("typedef enum { A, B, C } ShortEnum;");
1612 verifyFormat("typedef enum\n"
1613 "{\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +00001614 " ZERO = 0,\n"
Krasimir Georgiev81341d72017-08-29 13:32:30 +00001615 " ONE = 1,\n"
1616 " TWO = 2,\n"
1617 " THREE = 3\n"
1618 "} LongEnum;",
1619 Style);
1620}
1621
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001622TEST_F(FormatTest, FormatsNSEnums) {
1623 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1624 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1625 " // Information about someDecentlyLongValue.\n"
1626 " someDecentlyLongValue,\n"
1627 " // Information about anotherDecentlyLongValue.\n"
1628 " anotherDecentlyLongValue,\n"
1629 " // Information about aThirdDecentlyLongValue.\n"
1630 " aThirdDecentlyLongValue\n"
1631 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001632 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1633 " a = 1,\n"
1634 " b = 2,\n"
1635 " c = 3,\n"
1636 "};");
1637 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1638 " a = 1,\n"
1639 " b = 2,\n"
1640 " c = 3,\n"
1641 "};");
1642 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1643 " a = 1,\n"
1644 " b = 2,\n"
1645 " c = 3,\n"
1646 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001647}
1648
Nico Weber7769a902013-01-14 05:49:49 +00001649TEST_F(FormatTest, FormatsBitfields) {
1650 verifyFormat("struct Bitfields {\n"
1651 " unsigned sClass : 8;\n"
1652 " unsigned ValueKind : 2;\n"
1653 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001654 verifyFormat("struct A {\n"
1655 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1656 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1657 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001658 verifyFormat("struct MyStruct {\n"
1659 " uchar data;\n"
1660 " uchar : 8;\n"
1661 " uchar : 8;\n"
1662 " uchar other;\n"
1663 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001664}
1665
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001666TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001667 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1668 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1669
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001670 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001671 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001672 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001673 "}",
1674 LLVMWithNoNamespaceFix);
Sam McCall6f3778c2018-09-05 07:44:02 +00001675 verifyFormat("/* something */ namespace some_namespace {\n"
1676 "class A {};\n"
1677 "void f() { f(); }\n"
1678 "}",
1679 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001680 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001681 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001682 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001683 "}",
1684 LLVMWithNoNamespaceFix);
Sam McCall6f3778c2018-09-05 07:44:02 +00001685 verifyFormat("/* something */ namespace {\n"
1686 "class A {};\n"
1687 "void f() { f(); }\n"
1688 "}",
1689 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001690 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001691 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001692 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001693 "}",
1694 LLVMWithNoNamespaceFix);
Sam McCall6f3778c2018-09-05 07:44:02 +00001695 verifyFormat("/* something */ inline namespace X {\n"
1696 "class A {};\n"
1697 "void f() { f(); }\n"
1698 "}",
1699 LLVMWithNoNamespaceFix);
1700 verifyFormat("export namespace X {\n"
1701 "class A {};\n"
1702 "void f() { f(); }\n"
1703 "}",
1704 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001705 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001706 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001707 "void f() { f(); }",
1708 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001709
1710 // This code is more common than we thought; if we
1711 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001712 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001713 verifyFormat("namespace {};",
1714 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001715 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001716 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001717 "};",
1718 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001719
1720 verifyFormat("namespace {\n"
1721 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001722 "} // namespace",
1723 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001724 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1725 "#define HEADER_GUARD\n"
1726 "namespace my_namespace {\n"
1727 "int i;\n"
1728 "} // my_namespace\n"
1729 "#endif // HEADER_GUARD",
1730 format("#ifndef HEADER_GUARD\n"
1731 " #define HEADER_GUARD\n"
1732 " namespace my_namespace {\n"
1733 "int i;\n"
1734 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001735 "#endif // HEADER_GUARD",
1736 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001737
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001738 EXPECT_EQ("namespace A::B {\n"
1739 "class C {};\n"
1740 "}",
1741 format("namespace A::B {\n"
1742 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001743 "}",
1744 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001745
Daniel Jasper65ee3472013-07-31 23:16:02 +00001746 FormatStyle Style = getLLVMStyle();
1747 Style.NamespaceIndentation = FormatStyle::NI_All;
1748 EXPECT_EQ("namespace out {\n"
1749 " int i;\n"
1750 " namespace in {\n"
1751 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001752 " } // namespace in\n"
1753 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001754 format("namespace out {\n"
1755 "int i;\n"
1756 "namespace in {\n"
1757 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001758 "} // namespace in\n"
1759 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001760 Style));
1761
1762 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1763 EXPECT_EQ("namespace out {\n"
1764 "int i;\n"
1765 "namespace in {\n"
1766 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001767 "} // namespace in\n"
1768 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001769 format("namespace out {\n"
1770 "int i;\n"
1771 "namespace in {\n"
1772 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001773 "} // namespace in\n"
1774 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001775 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001776}
1777
Francois Ferrande56a8292017-06-14 12:29:47 +00001778TEST_F(FormatTest, FormatsCompactNamespaces) {
1779 FormatStyle Style = getLLVMStyle();
1780 Style.CompactNamespaces = true;
1781
1782 verifyFormat("namespace A { namespace B {\n"
1783 "}} // namespace A::B",
1784 Style);
1785
1786 EXPECT_EQ("namespace out { namespace in {\n"
1787 "}} // namespace out::in",
1788 format("namespace out {\n"
1789 "namespace in {\n"
1790 "} // namespace in\n"
1791 "} // namespace out",
1792 Style));
1793
1794 // Only namespaces which have both consecutive opening and end get compacted
1795 EXPECT_EQ("namespace out {\n"
1796 "namespace in1 {\n"
1797 "} // namespace in1\n"
1798 "namespace in2 {\n"
1799 "} // namespace in2\n"
1800 "} // namespace out",
1801 format("namespace out {\n"
1802 "namespace in1 {\n"
1803 "} // namespace in1\n"
1804 "namespace in2 {\n"
1805 "} // namespace in2\n"
1806 "} // namespace out",
1807 Style));
1808
1809 EXPECT_EQ("namespace out {\n"
1810 "int i;\n"
1811 "namespace in {\n"
1812 "int j;\n"
1813 "} // namespace in\n"
1814 "int k;\n"
1815 "} // namespace out",
1816 format("namespace out { int i;\n"
1817 "namespace in { int j; } // namespace in\n"
1818 "int k; } // namespace out",
1819 Style));
1820
1821 EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1822 "}}} // namespace A::B::C\n",
1823 format("namespace A { namespace B {\n"
1824 "namespace C {\n"
1825 "}} // namespace B::C\n"
1826 "} // namespace A\n",
1827 Style));
1828
1829 Style.ColumnLimit = 40;
1830 EXPECT_EQ("namespace aaaaaaaaaa {\n"
1831 "namespace bbbbbbbbbb {\n"
1832 "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1833 format("namespace aaaaaaaaaa {\n"
1834 "namespace bbbbbbbbbb {\n"
1835 "} // namespace bbbbbbbbbb\n"
1836 "} // namespace aaaaaaaaaa",
1837 Style));
1838
1839 EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1840 "namespace cccccc {\n"
1841 "}}} // namespace aaaaaa::bbbbbb::cccccc",
1842 format("namespace aaaaaa {\n"
1843 "namespace bbbbbb {\n"
1844 "namespace cccccc {\n"
1845 "} // namespace cccccc\n"
1846 "} // namespace bbbbbb\n"
1847 "} // namespace aaaaaa",
1848 Style));
1849 Style.ColumnLimit = 80;
1850
1851 // Extra semicolon after 'inner' closing brace prevents merging
1852 EXPECT_EQ("namespace out { namespace in {\n"
1853 "}; } // namespace out::in",
1854 format("namespace out {\n"
1855 "namespace in {\n"
1856 "}; // namespace in\n"
1857 "} // namespace out",
1858 Style));
1859
1860 // Extra semicolon after 'outer' closing brace is conserved
1861 EXPECT_EQ("namespace out { namespace in {\n"
1862 "}}; // namespace out::in",
1863 format("namespace out {\n"
1864 "namespace in {\n"
1865 "} // namespace in\n"
1866 "}; // namespace out",
1867 Style));
1868
1869 Style.NamespaceIndentation = FormatStyle::NI_All;
1870 EXPECT_EQ("namespace out { namespace in {\n"
1871 " int i;\n"
1872 "}} // namespace out::in",
1873 format("namespace out {\n"
1874 "namespace in {\n"
1875 "int i;\n"
1876 "} // namespace in\n"
1877 "} // namespace out",
1878 Style));
1879 EXPECT_EQ("namespace out { namespace mid {\n"
1880 " namespace in {\n"
1881 " int j;\n"
1882 " } // namespace in\n"
1883 " int k;\n"
1884 "}} // namespace out::mid",
1885 format("namespace out { namespace mid {\n"
1886 "namespace in { int j; } // namespace in\n"
1887 "int k; }} // namespace out::mid",
1888 Style));
1889
1890 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1891 EXPECT_EQ("namespace out { namespace in {\n"
1892 " int i;\n"
1893 "}} // namespace out::in",
1894 format("namespace out {\n"
1895 "namespace in {\n"
1896 "int i;\n"
1897 "} // namespace in\n"
1898 "} // namespace out",
1899 Style));
1900 EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1901 " int i;\n"
1902 "}}} // namespace out::mid::in",
1903 format("namespace out {\n"
1904 "namespace mid {\n"
1905 "namespace in {\n"
1906 "int i;\n"
1907 "} // namespace in\n"
1908 "} // namespace mid\n"
1909 "} // namespace out",
1910 Style));
1911}
1912
Krasimir Georgievd6ce9372017-09-15 11:23:50 +00001913TEST_F(FormatTest, FormatsExternC) {
1914 verifyFormat("extern \"C\" {\nint a;");
1915 verifyFormat("extern \"C\" {}");
1916 verifyFormat("extern \"C\" {\n"
1917 "int foo();\n"
1918 "}");
1919 verifyFormat("extern \"C\" int foo() {}");
1920 verifyFormat("extern \"C\" int foo();");
1921 verifyFormat("extern \"C\" int foo() {\n"
1922 " int i = 42;\n"
1923 " return i;\n"
1924 "}");
1925
1926 FormatStyle Style = getLLVMStyle();
1927 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1928 Style.BraceWrapping.AfterFunction = true;
1929 verifyFormat("extern \"C\" int foo() {}", Style);
1930 verifyFormat("extern \"C\" int foo();", Style);
1931 verifyFormat("extern \"C\" int foo()\n"
1932 "{\n"
1933 " int i = 42;\n"
1934 " return i;\n"
1935 "}",
1936 Style);
1937
1938 Style.BraceWrapping.AfterExternBlock = true;
1939 Style.BraceWrapping.SplitEmptyRecord = false;
1940 verifyFormat("extern \"C\"\n"
1941 "{}",
1942 Style);
1943 verifyFormat("extern \"C\"\n"
1944 "{\n"
1945 " int foo();\n"
1946 "}",
1947 Style);
1948}
Manuel Klimekae610d12013-01-21 14:32:05 +00001949
Daniel Jasper40aacf42013-03-14 13:45:21 +00001950TEST_F(FormatTest, FormatsInlineASM) {
1951 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001952 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001953 verifyFormat(
1954 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1955 " \"cpuid\\n\\t\"\n"
1956 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001957 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001958 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001959 EXPECT_EQ(
1960 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001961 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001962 " mov edx,[that] // vtable in edx\n"
1963 " mov eax,methodIndex\n"
1964 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001965 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001966 "}",
1967 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1968 " __asm {\n"
1969 " mov edx,[that] // vtable in edx\n"
1970 " mov eax,methodIndex\n"
1971 " call [edx][eax*4] // stdcall\n"
1972 " }\n"
1973 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001974 EXPECT_EQ("_asm {\n"
1975 " xor eax, eax;\n"
1976 " cpuid;\n"
1977 "}",
1978 format("_asm {\n"
1979 " xor eax, eax;\n"
1980 " cpuid;\n"
1981 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001982 verifyFormat("void function() {\n"
1983 " // comment\n"
1984 " asm(\"\");\n"
1985 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001986 EXPECT_EQ("__asm {\n"
1987 "}\n"
1988 "int i;",
1989 format("__asm {\n"
1990 "}\n"
1991 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001992}
1993
Nico Weberd5650bd2013-01-07 16:36:17 +00001994TEST_F(FormatTest, FormatTryCatch) {
1995 verifyFormat("try {\n"
1996 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001997 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001998 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001999 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002000 " exit(42);\n"
2001 "}");
2002
2003 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00002004 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002005 " return 5;\n"
2006 "}");
2007 verifyFormat("class A {\n"
2008 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002009 " A() try : a(0) {\n"
2010 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002011 " throw;\n"
2012 " }\n"
2013 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00002014
2015 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002016 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00002017}
2018
Nico Weberfac23712015-02-04 15:26:27 +00002019TEST_F(FormatTest, FormatSEHTryCatch) {
2020 verifyFormat("__try {\n"
2021 " int a = b * c;\n"
2022 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2023 " // Do nothing.\n"
2024 "}");
2025
2026 verifyFormat("__try {\n"
2027 " int a = b * c;\n"
2028 "} __finally {\n"
2029 " // Do nothing.\n"
2030 "}");
2031
2032 verifyFormat("DEBUG({\n"
2033 " __try {\n"
2034 " } __finally {\n"
2035 " }\n"
2036 "});\n");
2037}
2038
Daniel Jasper04a71a42014-05-08 11:58:24 +00002039TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2040 verifyFormat("try {\n"
2041 " f();\n"
2042 "} catch {\n"
2043 " g();\n"
2044 "}");
2045 verifyFormat("try {\n"
2046 " f();\n"
2047 "} catch (A a) MACRO(x) {\n"
2048 " g();\n"
2049 "} catch (B b) MACRO(x) {\n"
2050 " g();\n"
2051 "}");
2052}
2053
2054TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2055 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00002056 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2057 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00002058 Style.BreakBeforeBraces = BraceStyle;
2059 verifyFormat("try {\n"
2060 " // something\n"
2061 "} catch (...) {\n"
2062 " // something\n"
2063 "}",
2064 Style);
2065 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00002066 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2067 verifyFormat("try {\n"
2068 " // something\n"
2069 "}\n"
2070 "catch (...) {\n"
2071 " // something\n"
2072 "}",
2073 Style);
Nico Weberfac23712015-02-04 15:26:27 +00002074 verifyFormat("__try {\n"
2075 " // something\n"
2076 "}\n"
2077 "__finally {\n"
2078 " // something\n"
2079 "}",
2080 Style);
Nico Weber33381f52015-02-07 01:57:32 +00002081 verifyFormat("@try {\n"
2082 " // something\n"
2083 "}\n"
2084 "@finally {\n"
2085 " // something\n"
2086 "}",
2087 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002088 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2089 verifyFormat("try\n"
2090 "{\n"
2091 " // something\n"
2092 "}\n"
2093 "catch (...)\n"
2094 "{\n"
2095 " // something\n"
2096 "}",
2097 Style);
2098 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2099 verifyFormat("try\n"
2100 " {\n"
2101 " // something\n"
2102 " }\n"
2103 "catch (...)\n"
2104 " {\n"
2105 " // something\n"
2106 " }",
2107 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00002108 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2109 Style.BraceWrapping.BeforeCatch = true;
2110 verifyFormat("try {\n"
2111 " // something\n"
2112 "}\n"
2113 "catch (...) {\n"
2114 " // something\n"
2115 "}",
2116 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002117}
2118
Daniel Jaspere25509f2012-12-17 11:29:41 +00002119TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002120 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00002121
Daniel Jaspera44991332015-04-29 13:06:49 +00002122 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2123 " 100000000, "
2124 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00002125
Daniel Jasper473c62c2013-05-17 09:35:01 +00002126 // Here, everything other than the "}" would fit on a line.
2127 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002128 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002129 EXPECT_EQ("S s = {a,\n"
2130 "\n"
2131 " b};",
2132 format("S s = {\n"
2133 " a,\n"
2134 "\n"
2135 " b\n"
2136 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00002137
2138 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2139 // line. However, the formatting looks a bit off and this probably doesn't
2140 // happen often in practice.
2141 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002142 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00002143 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00002144}
2145
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002146TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002147 verifyFormat("const struct A a = {.a = 1, .b = 2};");
2148 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2149 " .bbbbbbbbbb = 2,\n"
2150 " .cccccccccc = 3,\n"
2151 " .dddddddddd = 4,\n"
2152 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002153 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002154 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2155 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2156 " .ccccccccccccccccccccccccccc = 3,\n"
2157 " .ddddddddddddddddddddddddddd = 4,\n"
2158 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002159
2160 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00002161
2162 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
2163 verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
2164 " [2] = bbbbbbbbbb,\n"
2165 " [3] = cccccccccc,\n"
2166 " [4] = dddddddddd,\n"
2167 " [5] = eeeeeeeeee};");
2168 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2169 " [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2170 " [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2171 " [3] = cccccccccccccccccccccccccccccccccccccc,\n"
2172 " [4] = dddddddddddddddddddddddddddddddddddddd,\n"
2173 " [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002174}
2175
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002176TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002177 verifyFormat("static A x = {{{}}};\n");
2178 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2179 " {init1, init2, init3, init4}}};",
2180 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00002181
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002182 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002183 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2184 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2185 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2186 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00002187 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002188 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2189 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2190 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00002191 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2192 " {rect.fRight - rect.fLeft, rect.fBottom - "
2193 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002194
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002195 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00002196 "SomeArrayOfSomeType a = {\n"
2197 " {{1, 2, 3},\n"
2198 " {1, 2, 3},\n"
2199 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
2200 " 333333333333333333333333333333},\n"
2201 " {1, 2, 3},\n"
2202 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00002203 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00002204 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002205 " {{1, 2, 3}},\n"
2206 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002207 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2208 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002209 " {{1, 2, 3}},\n"
2210 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002211
Daniel Jaspera44991332015-04-29 13:06:49 +00002212 verifyFormat("struct {\n"
2213 " unsigned bit;\n"
2214 " const char *const name;\n"
2215 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2216 " {kOsWin, \"Windows\"},\n"
2217 " {kOsLinux, \"Linux\"},\n"
2218 " {kOsCrOS, \"Chrome OS\"}};");
2219 verifyFormat("struct {\n"
2220 " unsigned bit;\n"
2221 " const char *const name;\n"
2222 "} kBitsToOs[] = {\n"
2223 " {kOsMac, \"Mac\"},\n"
2224 " {kOsWin, \"Windows\"},\n"
2225 " {kOsLinux, \"Linux\"},\n"
2226 " {kOsCrOS, \"Chrome OS\"},\n"
2227 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002228}
2229
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002230TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2231 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2232 " \\\n"
2233 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2234}
2235
Daniel Jasperda16db32013-01-07 10:48:50 +00002236TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002237 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2238 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00002239
2240 // Do break defaulted and deleted functions.
2241 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2242 " default;",
2243 getLLVMStyleWithColumns(40));
2244 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2245 " delete;",
2246 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002247}
2248
2249TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2250 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2251 getLLVMStyleWithColumns(40));
2252 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2253 getLLVMStyleWithColumns(40));
2254 EXPECT_EQ("#define Q \\\n"
2255 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
2256 " \"aaaaaaaa.cpp\"",
2257 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2258 getLLVMStyleWithColumns(40)));
2259}
2260
2261TEST_F(FormatTest, UnderstandsLinePPDirective) {
2262 EXPECT_EQ("# 123 \"A string literal\"",
2263 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00002264}
2265
Manuel Klimek591b5802013-01-31 15:58:48 +00002266TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00002267 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00002268 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002269}
2270
2271TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2272 EXPECT_EQ("#line 42 \"test\"\n",
2273 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002274 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
2275 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002276}
2277
2278TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2279 EXPECT_EQ("#line 42 \"test\"",
2280 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002281 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002282}
2283
Daniel Jasper877615c2013-10-11 19:45:02 +00002284TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2285 verifyFormat("#define A \\x20");
2286 verifyFormat("#define A \\ x20");
2287 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
2288 verifyFormat("#define A ''");
2289 verifyFormat("#define A ''qqq");
2290 verifyFormat("#define A `qqq");
2291 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00002292 EXPECT_EQ("const char *c = STRINGIFY(\n"
2293 "\\na : b);",
2294 format("const char * c = STRINGIFY(\n"
2295 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00002296
2297 verifyFormat("a\r\\");
2298 verifyFormat("a\v\\");
2299 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00002300}
2301
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002302TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002303 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2304 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002305 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002306 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00002307 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00002308
2309 verifyFormat("#define A A\n#define A A");
2310 verifyFormat("#define A(X) A\n#define A A");
2311
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002312 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2313 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002314}
2315
2316TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002317 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002318 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002319 "#define A( \\\n"
2320 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002321 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002322 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002323 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002324 " #include \"a.h\"\n"
2325 "#define A(A,\\\n"
2326 " B)\n"
2327 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002328 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002329 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002330}
2331
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002332TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002333
2334TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2335 EXPECT_EQ("#define A \\\n"
2336 " c; \\\n"
2337 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002338 "f;",
2339 format("#define A c; e;\n"
2340 "f;",
2341 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002342}
2343
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002344TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002345
Manuel Klimek1abf7892013-01-04 23:34:14 +00002346TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002347 EXPECT_EQ("int x,\n"
2348 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002349 " y;",
2350 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002351}
2352
Manuel Klimek09e07972013-01-05 21:34:55 +00002353TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002354 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002355 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002356 verifyFormat("#define A \\\n"
2357 " { \\\n"
2358 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002359 " }",
2360 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002361
2362 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002363 " void function##X()",
2364 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002365
2366 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002367 " void a##b##c()",
2368 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002369
Daniel Jasper39825ea2013-01-14 15:40:57 +00002370 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002371}
2372
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002373TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002374 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2375 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002376}
2377
Manuel Klimek0c137952013-02-11 12:33:24 +00002378TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2379 EXPECT_EQ("#define A b;", format("#define A \\\n"
2380 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002381 " b;",
2382 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002383 EXPECT_EQ("#define A \\\n"
2384 " \\\n"
2385 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002386 " b;",
2387 format("#define A \\\n"
2388 " \\\n"
2389 " a; \\\n"
2390 " b;",
2391 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002392 EXPECT_EQ("#define A \\\n"
2393 " a; \\\n"
2394 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002395 " b;",
2396 format("#define A \\\n"
2397 " a; \\\n"
2398 " \\\n"
2399 " b;",
2400 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002401}
2402
Daniel Jasper00475962013-02-19 17:14:38 +00002403TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002404 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002405 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002406 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002407 " case 2\n",
2408 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002409 verifyFormat("#define MACRO(a) \\\n"
2410 " if (a) \\\n"
2411 " f(); \\\n"
2412 " else \\\n"
2413 " g()",
2414 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002415 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002416 verifyIncompleteFormat("#define STR(x) #x\n"
2417 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002418 verifyFormat("#pragma omp threadprivate( \\\n"
2419 " y)), // expected-warning",
2420 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002421 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002422 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002423 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002424 "#define b \\\n"
2425 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002426 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002427 "a",
2428 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002429 verifyFormat("#define A \\\n"
2430 " { \\\n"
2431 " {\n"
2432 "#define B \\\n"
2433 " } \\\n"
2434 " }",
2435 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002436 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002437 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002438 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002439 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002440}
2441
Daniel Jasper40e19212013-05-29 13:16:10 +00002442TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2443 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2444 EXPECT_EQ("class A : public QObject {\n"
2445 " Q_OBJECT\n"
2446 "\n"
2447 " A() {}\n"
2448 "};",
2449 format("class A : public QObject {\n"
2450 " Q_OBJECT\n"
2451 "\n"
2452 " A() {\n}\n"
2453 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002454 EXPECT_EQ("MACRO\n"
2455 "/*static*/ int i;",
2456 format("MACRO\n"
2457 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002458 EXPECT_EQ("SOME_MACRO\n"
2459 "namespace {\n"
2460 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002461 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00002462 format("SOME_MACRO\n"
2463 " namespace {\n"
2464 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00002465 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002466 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002467 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2468 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002469 // Only if everything is upper case.
2470 EXPECT_EQ("class A : public QObject {\n"
2471 " Q_Object A() {}\n"
2472 "};",
2473 format("class A : public QObject {\n"
2474 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002475 " A() {\n}\n"
2476 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002477
2478 // Only if the next line can actually start an unwrapped line.
2479 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2480 format("SOME_WEIRD_LOG_MACRO\n"
2481 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002482
2483 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002484 "(n, buffers))\n",
2485 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002486}
2487
Alexander Kornienkode644272013-04-08 22:16:06 +00002488TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2489 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2490 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2491 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002492 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002493 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2494 "int *createScopDetectionPass() { return 0; }",
2495 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2496 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2497 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2498 " class X {};\n"
2499 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2500 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002501 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2502 // braces, so that inner block is indented one level more.
2503 EXPECT_EQ("int q() {\n"
2504 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2505 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2506 " IPC_END_MESSAGE_MAP()\n"
2507 "}",
2508 format("int q() {\n"
2509 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2510 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2511 " IPC_END_MESSAGE_MAP()\n"
2512 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002513
Daniel Jasper352dae12014-01-03 11:50:46 +00002514 // Same inside macros.
2515 EXPECT_EQ("#define LIST(L) \\\n"
2516 " L(A) \\\n"
2517 " L(B) \\\n"
2518 " L(C)",
2519 format("#define LIST(L) \\\n"
2520 " L(A) \\\n"
2521 " L(B) \\\n"
2522 " L(C)",
2523 getGoogleStyle()));
2524
Daniel Jasper545c6522013-09-17 09:26:07 +00002525 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002526 EXPECT_EQ("int q() {\n"
2527 " f(x);\n"
2528 " f(x) {}\n"
2529 " f(x)->g();\n"
2530 " f(x)->*g();\n"
2531 " f(x).g();\n"
2532 " f(x) = x;\n"
2533 " f(x) += x;\n"
2534 " f(x) -= x;\n"
2535 " f(x) *= x;\n"
2536 " f(x) /= x;\n"
2537 " f(x) %= x;\n"
2538 " f(x) &= x;\n"
2539 " f(x) |= x;\n"
2540 " f(x) ^= x;\n"
2541 " f(x) >>= x;\n"
2542 " f(x) <<= x;\n"
2543 " f(x)[y].z();\n"
2544 " LOG(INFO) << x;\n"
2545 " ifstream(x) >> x;\n"
2546 "}\n",
2547 format("int q() {\n"
2548 " f(x)\n;\n"
2549 " f(x)\n {}\n"
2550 " f(x)\n->g();\n"
2551 " f(x)\n->*g();\n"
2552 " f(x)\n.g();\n"
2553 " f(x)\n = x;\n"
2554 " f(x)\n += x;\n"
2555 " f(x)\n -= x;\n"
2556 " f(x)\n *= x;\n"
2557 " f(x)\n /= x;\n"
2558 " f(x)\n %= x;\n"
2559 " f(x)\n &= x;\n"
2560 " f(x)\n |= x;\n"
2561 " f(x)\n ^= x;\n"
2562 " f(x)\n >>= x;\n"
2563 " f(x)\n <<= x;\n"
2564 " f(x)\n[y].z();\n"
2565 " LOG(INFO)\n << x;\n"
2566 " ifstream(x)\n >> x;\n"
2567 "}\n"));
2568 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002569 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002570 " if (1) {\n"
2571 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002572 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002573 " while (1) {\n"
2574 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002575 " F(x)\n"
2576 " G(x);\n"
2577 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002578 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002579 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002580 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002581 " }\n"
2582 "}\n",
2583 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002584 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002585 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002586 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002587 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002588 "F(x)\n"
2589 "G(x);\n"
2590 "F(x)\n"
2591 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002592 "}\n"));
2593 EXPECT_EQ("class A {\n"
2594 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002595 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002596 " A(X x)\n" // FIXME: function-level try blocks are broken.
2597 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002598 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002599 " }\n"
2600 "};",
2601 format("class A {\n"
2602 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002603 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002604 " A(X x)\n"
2605 " try : t(0) {} catch (...) {}\n"
2606 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002607 EXPECT_EQ("class SomeClass {\n"
2608 "public:\n"
2609 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2610 "};",
2611 format("class SomeClass {\n"
2612 "public:\n"
2613 " SomeClass()\n"
2614 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2615 "};"));
2616 EXPECT_EQ("class SomeClass {\n"
2617 "public:\n"
2618 " SomeClass()\n"
2619 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2620 "};",
2621 format("class SomeClass {\n"
2622 "public:\n"
2623 " SomeClass()\n"
2624 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2625 "};",
2626 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002627
2628 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002629}
2630
Manuel Klimek4fe43002013-05-22 12:51:29 +00002631TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2632 verifyFormat("#define A \\\n"
2633 " f({ \\\n"
2634 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002635 " });",
2636 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00002637}
2638
Krasimir Georgievad47c902017-08-30 14:34:57 +00002639TEST_F(FormatTest, IndentPreprocessorDirectives) {
2640 FormatStyle Style = getLLVMStyle();
2641 Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2642 Style.ColumnLimit = 40;
2643 verifyFormat("#ifdef _WIN32\n"
2644 "#define A 0\n"
2645 "#ifdef VAR2\n"
2646 "#define B 1\n"
2647 "#include <someheader.h>\n"
2648 "#define MACRO \\\n"
2649 " some_very_long_func_aaaaaaaaaa();\n"
2650 "#endif\n"
2651 "#else\n"
2652 "#define A 1\n"
2653 "#endif",
2654 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002655 Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2656 verifyFormat("#ifdef _WIN32\n"
2657 "# define A 0\n"
2658 "# ifdef VAR2\n"
2659 "# define B 1\n"
2660 "# include <someheader.h>\n"
2661 "# define MACRO \\\n"
2662 " some_very_long_func_aaaaaaaaaa();\n"
2663 "# endif\n"
2664 "#else\n"
2665 "# define A 1\n"
2666 "#endif",
2667 Style);
2668 verifyFormat("#if A\n"
2669 "# define MACRO \\\n"
2670 " void a(int x) { \\\n"
2671 " b(); \\\n"
2672 " c(); \\\n"
2673 " d(); \\\n"
2674 " e(); \\\n"
2675 " f(); \\\n"
2676 " }\n"
2677 "#endif",
2678 Style);
2679 // Comments before include guard.
2680 verifyFormat("// file comment\n"
2681 "// file comment\n"
2682 "#ifndef HEADER_H\n"
2683 "#define HEADER_H\n"
2684 "code();\n"
2685 "#endif",
2686 Style);
2687 // Test with include guards.
Krasimir Georgievad47c902017-08-30 14:34:57 +00002688 verifyFormat("#ifndef HEADER_H\n"
2689 "#define HEADER_H\n"
2690 "code();\n"
2691 "#endif",
2692 Style);
2693 // Include guards must have a #define with the same variable immediately
2694 // after #ifndef.
2695 verifyFormat("#ifndef NOT_GUARD\n"
2696 "# define FOO\n"
2697 "code();\n"
2698 "#endif",
2699 Style);
2700
2701 // Include guards must cover the entire file.
2702 verifyFormat("code();\n"
2703 "code();\n"
2704 "#ifndef NOT_GUARD\n"
2705 "# define NOT_GUARD\n"
2706 "code();\n"
2707 "#endif",
2708 Style);
2709 verifyFormat("#ifndef NOT_GUARD\n"
2710 "# define NOT_GUARD\n"
2711 "code();\n"
2712 "#endif\n"
2713 "code();",
2714 Style);
2715 // Test with trailing blank lines.
2716 verifyFormat("#ifndef HEADER_H\n"
2717 "#define HEADER_H\n"
2718 "code();\n"
2719 "#endif\n",
2720 Style);
2721 // Include guards don't have #else.
2722 verifyFormat("#ifndef NOT_GUARD\n"
2723 "# define NOT_GUARD\n"
2724 "code();\n"
2725 "#else\n"
2726 "#endif",
2727 Style);
2728 verifyFormat("#ifndef NOT_GUARD\n"
2729 "# define NOT_GUARD\n"
2730 "code();\n"
2731 "#elif FOO\n"
2732 "#endif",
2733 Style);
Mark Zeren1c3afaf2018-02-05 15:59:00 +00002734 // Non-identifier #define after potential include guard.
2735 verifyFormat("#ifndef FOO\n"
2736 "# define 1\n"
2737 "#endif\n",
2738 Style);
2739 // #if closes past last non-preprocessor line.
2740 verifyFormat("#ifndef FOO\n"
2741 "#define FOO\n"
2742 "#if 1\n"
2743 "int i;\n"
2744 "# define A 0\n"
2745 "#endif\n"
2746 "#endif\n",
2747 Style);
Krasimir Georgievad47c902017-08-30 14:34:57 +00002748 // FIXME: This doesn't handle the case where there's code between the
2749 // #ifndef and #define but all other conditions hold. This is because when
2750 // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2751 // previous code line yet, so we can't detect it.
2752 EXPECT_EQ("#ifndef NOT_GUARD\n"
2753 "code();\n"
2754 "#define NOT_GUARD\n"
2755 "code();\n"
2756 "#endif",
2757 format("#ifndef NOT_GUARD\n"
2758 "code();\n"
2759 "# define NOT_GUARD\n"
2760 "code();\n"
2761 "#endif",
2762 Style));
2763 // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2764 // be outside an include guard. Examples are #pragma once and
2765 // #pragma GCC diagnostic, or anything else that does not change the meaning
2766 // of the file if it's included multiple times.
2767 EXPECT_EQ("#ifdef WIN32\n"
2768 "# pragma once\n"
2769 "#endif\n"
2770 "#ifndef HEADER_H\n"
2771 "# define HEADER_H\n"
2772 "code();\n"
2773 "#endif",
2774 format("#ifdef WIN32\n"
2775 "# pragma once\n"
2776 "#endif\n"
2777 "#ifndef HEADER_H\n"
2778 "#define HEADER_H\n"
2779 "code();\n"
2780 "#endif",
2781 Style));
2782 // FIXME: This does not detect when there is a single non-preprocessor line
2783 // in front of an include-guard-like structure where other conditions hold
2784 // because ScopedLineState hides the line.
2785 EXPECT_EQ("code();\n"
2786 "#ifndef HEADER_H\n"
2787 "#define HEADER_H\n"
2788 "code();\n"
2789 "#endif",
2790 format("code();\n"
2791 "#ifndef HEADER_H\n"
2792 "# define HEADER_H\n"
2793 "code();\n"
2794 "#endif",
2795 Style));
Mark Zerend2b2ac62018-01-31 20:05:50 +00002796 // Keep comments aligned with #, otherwise indent comments normally. These
2797 // tests cannot use verifyFormat because messUp manipulates leading
2798 // whitespace.
2799 {
2800 const char *Expected = ""
2801 "void f() {\n"
2802 "#if 1\n"
2803 "// Preprocessor aligned.\n"
2804 "# define A 0\n"
2805 " // Code. Separated by blank line.\n"
2806 "\n"
2807 "# define B 0\n"
2808 " // Code. Not aligned with #\n"
2809 "# define C 0\n"
2810 "#endif";
2811 const char *ToFormat = ""
2812 "void f() {\n"
2813 "#if 1\n"
2814 "// Preprocessor aligned.\n"
2815 "# define A 0\n"
2816 "// Code. Separated by blank line.\n"
2817 "\n"
2818 "# define B 0\n"
2819 " // Code. Not aligned with #\n"
2820 "# define C 0\n"
2821 "#endif";
2822 EXPECT_EQ(Expected, format(ToFormat, Style));
2823 EXPECT_EQ(Expected, format(Expected, Style));
2824 }
2825 // Keep block quotes aligned.
2826 {
2827 const char *Expected = ""
2828 "void f() {\n"
2829 "#if 1\n"
2830 "/* Preprocessor aligned. */\n"
2831 "# define A 0\n"
2832 " /* Code. Separated by blank line. */\n"
2833 "\n"
2834 "# define B 0\n"
2835 " /* Code. Not aligned with # */\n"
2836 "# define C 0\n"
2837 "#endif";
2838 const char *ToFormat = ""
2839 "void f() {\n"
2840 "#if 1\n"
2841 "/* Preprocessor aligned. */\n"
2842 "# define A 0\n"
2843 "/* Code. Separated by blank line. */\n"
2844 "\n"
2845 "# define B 0\n"
2846 " /* Code. Not aligned with # */\n"
2847 "# define C 0\n"
2848 "#endif";
2849 EXPECT_EQ(Expected, format(ToFormat, Style));
2850 EXPECT_EQ(Expected, format(Expected, Style));
2851 }
2852 // Keep comments aligned with un-indented directives.
2853 {
2854 const char *Expected = ""
2855 "void f() {\n"
2856 "// Preprocessor aligned.\n"
2857 "#define A 0\n"
2858 " // Code. Separated by blank line.\n"
2859 "\n"
2860 "#define B 0\n"
2861 " // Code. Not aligned with #\n"
2862 "#define C 0\n";
2863 const char *ToFormat = ""
2864 "void f() {\n"
2865 "// Preprocessor aligned.\n"
2866 "#define A 0\n"
2867 "// Code. Separated by blank line.\n"
2868 "\n"
2869 "#define B 0\n"
2870 " // Code. Not aligned with #\n"
2871 "#define C 0\n";
2872 EXPECT_EQ(Expected, format(ToFormat, Style));
2873 EXPECT_EQ(Expected, format(Expected, Style));
2874 }
Krasimir Georgievad47c902017-08-30 14:34:57 +00002875 // Test with tabs.
2876 Style.UseTab = FormatStyle::UT_Always;
2877 Style.IndentWidth = 8;
2878 Style.TabWidth = 8;
2879 verifyFormat("#ifdef _WIN32\n"
2880 "#\tdefine A 0\n"
2881 "#\tifdef VAR2\n"
2882 "#\t\tdefine B 1\n"
2883 "#\t\tinclude <someheader.h>\n"
2884 "#\t\tdefine MACRO \\\n"
2885 "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
2886 "#\tendif\n"
2887 "#else\n"
2888 "#\tdefine A 1\n"
2889 "#endif",
2890 Style);
Daniel Jasper4df130f2017-09-04 13:33:52 +00002891
2892 // Regression test: Multiline-macro inside include guards.
2893 verifyFormat("#ifndef HEADER_H\n"
2894 "#define HEADER_H\n"
2895 "#define A() \\\n"
2896 " int i; \\\n"
2897 " int j;\n"
2898 "#endif // HEADER_H",
2899 getLLVMStyleWithColumns(20));
Manuel Klimekef2cfb12013-01-05 22:14:16 +00002900}
2901
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002902TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002903 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00002904}
2905
Manuel Klimek1058d982013-01-06 20:07:31 +00002906TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2907 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
2908 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2909 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2910 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2911}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002912
Daniel Jaspere2408e32015-05-06 11:16:43 +00002913TEST_F(FormatTest, EscapedNewlines) {
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002914 FormatStyle Narrow = getLLVMStyleWithColumns(11);
2915 EXPECT_EQ("#define A \\\n int i; \\\n int j;",
2916 format("#define A \\\nint i;\\\n int j;", Narrow));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002917 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002918 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002919 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002920 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002921
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002922 FormatStyle AlignLeft = getLLVMStyle();
2923 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
2924 EXPECT_EQ("#define MACRO(x) \\\n"
2925 "private: \\\n"
2926 " int x(int a);\n",
2927 format("#define MACRO(x) \\\n"
2928 "private: \\\n"
2929 " int x(int a);\n",
2930 AlignLeft));
2931
2932 // CRLF line endings
2933 EXPECT_EQ("#define A \\\r\n int i; \\\r\n int j;",
2934 format("#define A \\\r\nint i;\\\r\n int j;", Narrow));
2935 EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
2936 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
2937 EXPECT_EQ("/* \\ \\ \\\r\n */", format("\\\r\n/* \\ \\ \\\r\n */"));
2938 EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
2939 EXPECT_EQ("#define MACRO(x) \\\r\n"
2940 "private: \\\r\n"
2941 " int x(int a);\r\n",
2942 format("#define MACRO(x) \\\r\n"
2943 "private: \\\r\n"
2944 " int x(int a);\r\n",
2945 AlignLeft));
2946
Jacob Bandes-Storchd6a7e982017-08-10 00:15:31 +00002947 FormatStyle DontAlign = getLLVMStyle();
2948 DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
2949 DontAlign.MaxEmptyLinesToKeep = 3;
2950 // FIXME: can't use verifyFormat here because the newline before
2951 // "public:" is not inserted the first time it's reformatted
2952 EXPECT_EQ("#define A \\\n"
2953 " class Foo { \\\n"
2954 " void bar(); \\\n"
2955 "\\\n"
2956 "\\\n"
2957 "\\\n"
2958 " public: \\\n"
2959 " void baz(); \\\n"
2960 " };",
2961 format("#define A \\\n"
2962 " class Foo { \\\n"
2963 " void bar(); \\\n"
2964 "\\\n"
2965 "\\\n"
2966 "\\\n"
2967 " public: \\\n"
2968 " void baz(); \\\n"
Krasimir Georgiev7f64fa82017-10-30 14:41:34 +00002969 " };",
2970 DontAlign));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002971}
2972
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002973TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2974 verifyFormat("#define A \\\n"
2975 " int v( \\\n"
2976 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002977 " int i;",
2978 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002979}
2980
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002981TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002982 EXPECT_EQ(
2983 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2984 " \\\n"
2985 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2986 "\n"
2987 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2988 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2989 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2990 "\\\n"
2991 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2992 " \n"
2993 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2994 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002995}
2996
Manuel Klimek52b15152013-01-09 15:25:02 +00002997TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2998 EXPECT_EQ("int\n"
2999 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003000 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003001 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003002 verifyFormat("functionCallTo(\n"
3003 " someOtherFunction(\n"
3004 " withSomeParameters, whichInSequence,\n"
3005 " areLongerThanALine(andAnotherCall,\n"
3006 "#define A B\n"
3007 " withMoreParamters,\n"
3008 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003009 " andMoreParameters),\n"
3010 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003011 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003012 verifyFormat("Foo::Foo()\n"
3013 "#ifdef BAR\n"
3014 " : baz(0)\n"
3015 "#endif\n"
3016 "{\n"
3017 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003018 verifyFormat("void f() {\n"
3019 " if (true)\n"
3020 "#ifdef A\n"
3021 " f(42);\n"
3022 " x();\n"
3023 "#else\n"
3024 " g();\n"
3025 " x();\n"
3026 "#endif\n"
3027 "}");
3028 verifyFormat("void f(param1, param2,\n"
3029 " param3,\n"
3030 "#ifdef A\n"
3031 " param4(param5,\n"
3032 "#ifdef A1\n"
3033 " param6,\n"
3034 "#ifdef A2\n"
3035 " param7),\n"
3036 "#else\n"
3037 " param8),\n"
3038 " param9,\n"
3039 "#endif\n"
3040 " param10,\n"
3041 "#endif\n"
3042 " param11)\n"
3043 "#else\n"
3044 " param12)\n"
3045 "#endif\n"
3046 "{\n"
3047 " x();\n"
3048 "}",
3049 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003050 verifyFormat("#if 1\n"
3051 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003052 verifyFormat("#if 1\n"
3053 "#endif\n"
3054 "#if 1\n"
3055 "#else\n"
3056 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003057 verifyFormat("DEBUG({\n"
3058 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3059 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3060 "});\n"
3061 "#if a\n"
3062 "#else\n"
3063 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003064
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003065 verifyIncompleteFormat("void f(\n"
3066 "#if A\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00003067 ");\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003068 "#else\n"
3069 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003070}
3071
Manuel Klimek14bd9172014-01-29 08:49:02 +00003072TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3073 verifyFormat("#endif\n"
3074 "#if B");
3075}
3076
Manuel Klimek88033d72013-10-21 08:11:15 +00003077TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3078 FormatStyle SingleLine = getLLVMStyle();
3079 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003080 verifyFormat("#if 0\n"
3081 "#elif 1\n"
3082 "#endif\n"
3083 "void foo() {\n"
3084 " if (test) foo2();\n"
3085 "}",
3086 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003087}
3088
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003089TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003090 verifyFormat("functionCall({ int i; });");
3091 verifyFormat("functionCall({\n"
3092 " int i;\n"
3093 " int j;\n"
3094 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003095 verifyFormat("functionCall(\n"
3096 " {\n"
3097 " int i;\n"
3098 " int j;\n"
3099 " },\n"
3100 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003101 verifyFormat("functionA(functionB({\n"
3102 " int i;\n"
3103 " int j;\n"
3104 " }),\n"
3105 " aaaa, bbbb, cccc);");
3106 verifyFormat("functionCall(\n"
3107 " {\n"
3108 " int i;\n"
3109 " int j;\n"
3110 " },\n"
3111 " aaaa, bbbb, // comment\n"
3112 " cccc);");
3113 verifyFormat("functionA(functionB({\n"
3114 " int i;\n"
3115 " int j;\n"
3116 " }),\n"
3117 " aaaa, bbbb, // comment\n"
3118 " cccc);");
3119 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3120 verifyFormat("functionCall(aaaa, bbbb, {\n"
3121 " int i;\n"
3122 " int j;\n"
3123 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003124 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003125 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003126 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003127 " int i; // break\n"
3128 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003129 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3130 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003131 verifyFormat("DEBUG({\n"
3132 " if (a)\n"
3133 " f();\n"
3134 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003135}
3136
3137TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003138 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003139 "int i;",
3140 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003141}
3142
3143TEST_F(FormatTest, LayoutNestedBlocks) {
3144 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3145 " struct s {\n"
3146 " int i;\n"
3147 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003148 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003149 " for (int i = 0; i < 10; ++i)\n"
3150 " return;\n"
3151 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003152 verifyFormat("call(parameter, {\n"
3153 " something();\n"
3154 " // Comment using all columns.\n"
3155 " somethingelse();\n"
3156 "});",
3157 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003158 verifyFormat("DEBUG( //\n"
3159 " { f(); }, a);");
3160 verifyFormat("DEBUG( //\n"
3161 " {\n"
3162 " f(); //\n"
3163 " },\n"
3164 " a);");
3165
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003166 EXPECT_EQ("call(parameter, {\n"
3167 " something();\n"
3168 " // Comment too\n"
3169 " // looooooooooong.\n"
3170 " somethingElse();\n"
3171 "});",
3172 format("call(parameter, {\n"
3173 " something();\n"
3174 " // Comment too looooooooooong.\n"
3175 " somethingElse();\n"
3176 "});",
3177 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003178 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003179 EXPECT_EQ("DEBUG({ // comment\n"
3180 " int i;\n"
3181 "});",
3182 format("DEBUG({ // comment\n"
3183 "int i;\n"
3184 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003185 EXPECT_EQ("DEBUG({\n"
3186 " int i;\n"
3187 "\n"
3188 " // comment\n"
3189 " int j;\n"
3190 "});",
3191 format("DEBUG({\n"
3192 " int i;\n"
3193 "\n"
3194 " // comment\n"
3195 " int j;\n"
3196 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003197
3198 verifyFormat("DEBUG({\n"
3199 " if (a)\n"
3200 " return;\n"
3201 "});");
3202 verifyGoogleFormat("DEBUG({\n"
3203 " if (a) return;\n"
3204 "});");
3205 FormatStyle Style = getGoogleStyle();
3206 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003207 verifyFormat("Debug(aaaaa,\n"
3208 " {\n"
3209 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3210 " },\n"
3211 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003212 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003213
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003214 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3215
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003216 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003217}
3218
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003219TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3220 EXPECT_EQ("#define MACRO() \\\n"
3221 " Debug(aaa, /* force line break */ \\\n"
3222 " { \\\n"
3223 " int i; \\\n"
3224 " int j; \\\n"
3225 " })",
3226 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3227 " { int i; int j; })",
3228 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003229
3230 EXPECT_EQ("#define A \\\n"
3231 " [] { \\\n"
3232 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3233 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3234 " }",
3235 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3236 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3237 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003238}
3239
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003240TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3241 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003242 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003243 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003244}
3245
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003246TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3247 FormatStyle Style = getLLVMStyle();
3248 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3249 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3250 verifyFormat("FOO_BEGIN\n"
3251 " FOO_ENTRY\n"
3252 "FOO_END", Style);
3253 verifyFormat("FOO_BEGIN\n"
3254 " NESTED_FOO_BEGIN\n"
3255 " NESTED_FOO_ENTRY\n"
3256 " NESTED_FOO_END\n"
3257 "FOO_END", Style);
3258 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3259 " int x;\n"
3260 " x = 1;\n"
3261 "FOO_END(Baz)", Style);
3262}
3263
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003264//===----------------------------------------------------------------------===//
3265// Line break tests.
3266//===----------------------------------------------------------------------===//
3267
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003268TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003269 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003270 "void f() {\n"
3271 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3272 " parameter, parameter, parameter)),\n"
3273 " SecondLongCall(parameter));\n"
3274 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003275 verifyFormat(
3276 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3277 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3278 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3279 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3280 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003281 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3282 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3283 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3284 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003285 verifyFormat(
3286 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3287 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3288 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3289 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003290 verifyFormat("int a = bbbb && ccc &&\n"
3291 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003292 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003293 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003294}
3295
Daniel Jasperd69fc772013-05-08 14:12:04 +00003296TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3297 verifyFormat(
3298 "bool aaaaaaa =\n"
3299 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3300 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003301 verifyFormat(
3302 "bool aaaaaaa =\n"
3303 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3304 " bbbbbbbb();");
3305
Daniel Jasperd69fc772013-05-08 14:12:04 +00003306 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3307 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3308 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003309 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3310 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3311 " ccccccccc == ddddddddddd;");
3312 verifyFormat(
3313 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3314 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3315 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003316
3317 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3318 " aaaaaa) &&\n"
3319 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003320 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3321 " aaaaaa) >>\n"
3322 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003323 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003324 " SourceMgr.getSpellingColumnNumber(\n"
3325 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3326 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003327
Daniel Jasper68d888c2013-06-03 08:42:05 +00003328 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3329 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3330 " cccccc) {\n}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00003331 verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3332 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3333 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003334 verifyFormat("b = a &&\n"
3335 " // Comment\n"
3336 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003337
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003338 // If the LHS of a comparison is not a binary expression itself, the
3339 // additional linebreak confuses many people.
3340 verifyFormat(
3341 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3342 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3343 "}");
3344 verifyFormat(
3345 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3346 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3347 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003348 verifyFormat(
3349 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3350 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3351 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003352 verifyFormat(
3353 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3354 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3355 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003356 // Even explicit parentheses stress the precedence enough to make the
3357 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003358 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3359 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3360 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003361 // This cases is borderline, but with the indentation it is still readable.
3362 verifyFormat(
3363 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3364 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3365 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3366 "}",
3367 getLLVMStyleWithColumns(75));
3368
3369 // If the LHS is a binary expression, we should still use the additional break
3370 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003371 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3372 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3373 " 5) {\n"
3374 "}");
Richard Smithc70f1d62017-12-14 15:16:18 +00003375 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3376 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3377 " 5) {\n"
3378 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003379
Daniel Jasper571f1af2013-05-14 20:39:56 +00003380 FormatStyle OnePerLine = getLLVMStyle();
3381 OnePerLine.BinPackParameters = false;
3382 verifyFormat(
3383 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3384 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3385 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3386 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003387
3388 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3389 " .aaa(aaaaaaaaaaaaa) *\n"
3390 " aaaaaaa +\n"
3391 " aaaaaaa;",
3392 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003393}
3394
Daniel Jasper6bee6822013-04-08 20:33:42 +00003395TEST_F(FormatTest, ExpressionIndentation) {
3396 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3397 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3398 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3399 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3400 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3401 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3402 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3404 " ccccccccccccccccccccccccccccccccccccccccc;");
3405 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3406 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3407 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3408 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3409 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3410 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3411 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3412 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3413 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3414 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3415 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3416 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003417 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003418 "} else if (aaaaa && bbbbb > // break\n"
3419 " ccccc) {\n"
3420 "}");
3421 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003422 "} else if (aaaaa &&\n"
3423 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003424 " ccccc &&\n"
3425 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003426 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003427
3428 // Presence of a trailing comment used to change indentation of b.
3429 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3430 " b;\n"
3431 "return aaaaaaaaaaaaaaaaaaa +\n"
3432 " b; //",
3433 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003434}
3435
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003436TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3437 // Not sure what the best system is here. Like this, the LHS can be found
3438 // immediately above an operator (everything with the same or a higher
3439 // indent). The RHS is aligned right of the operator and so compasses
3440 // everything until something with the same indent as the operator is found.
3441 // FIXME: Is this a good system?
3442 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003443 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003444 verifyFormat(
3445 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003446 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3447 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3448 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3449 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3450 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003451 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003452 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3453 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003454 Style);
3455 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003456 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3457 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003458 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3459 Style);
3460 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003461 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3462 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003463 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3464 Style);
3465 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3466 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003467 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3468 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003469 Style);
3470 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003471 "} else if (aaaaa\n"
3472 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003473 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003474 "}",
3475 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003476 verifyFormat("return (a)\n"
3477 " // comment\n"
3478 " + b;",
3479 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003480 verifyFormat(
3481 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3482 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3483 " + cc;",
3484 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003485
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003486 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3487 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3488 Style);
3489
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003490 // Forced by comments.
3491 verifyFormat(
3492 "unsigned ContentSize =\n"
3493 " sizeof(int16_t) // DWARF ARange version number\n"
3494 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3495 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3496 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003497
3498 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3499 " == boost::fusion::at_c<1>(iiii).second;",
3500 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003501
3502 Style.ColumnLimit = 60;
3503 verifyFormat("zzzzzzzzzz\n"
3504 " = bbbbbbbbbbbbbbbbb\n"
3505 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3506 Style);
Jonas Toth4636deb2018-08-24 17:14:31 +00003507
3508 Style.ColumnLimit = 80;
3509 Style.IndentWidth = 4;
3510 Style.TabWidth = 4;
3511 Style.UseTab = FormatStyle::UT_Always;
3512 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3513 Style.AlignOperands = false;
3514 EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n"
3515 "\t&& (someOtherLongishConditionPart1\n"
3516 "\t\t|| someOtherEvenLongerNestedConditionPart2);",
3517 format("return someVeryVeryLongConditionThatBarelyFitsOnALine && (someOtherLongishConditionPart1 || someOtherEvenLongerNestedConditionPart2);",
3518 Style));
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003519}
3520
Daniel Jasperb1270392017-02-01 23:27:37 +00003521TEST_F(FormatTest, EnforcedOperatorWraps) {
3522 // Here we'd like to wrap after the || operators, but a comment is forcing an
3523 // earlier wrap.
3524 verifyFormat("bool x = aaaaa //\n"
3525 " || bbbbb\n"
3526 " //\n"
3527 " || cccc;");
3528}
3529
Daniel Jasper3219e432014-12-02 13:24:51 +00003530TEST_F(FormatTest, NoOperandAlignment) {
3531 FormatStyle Style = getLLVMStyle();
3532 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00003533 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3534 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3535 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3536 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003537 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003538 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3539 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3540 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3541 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3542 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3543 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3544 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3545 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3546 " > ccccccccccccccccccccccccccccccccccccccccc;",
3547 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003548
3549 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3550 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3551 " + cc;",
3552 Style);
3553 verifyFormat("int a = aa\n"
3554 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003555 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00003556 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003557
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003558 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003559 verifyFormat("return (a > b\n"
3560 " // comment1\n"
3561 " // comment2\n"
3562 " || c);",
3563 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003564}
3565
Daniel Jasperac043c92014-09-15 11:11:00 +00003566TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3567 FormatStyle Style = getLLVMStyle();
3568 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3569 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3570 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003571 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3572 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003573}
3574
Daniel Jasper988e7e42017-05-08 15:07:52 +00003575TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3576 FormatStyle Style = getLLVMStyle();
3577 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3578 Style.BinPackArguments = false;
3579 Style.ColumnLimit = 40;
3580 verifyFormat("void test() {\n"
3581 " someFunction(\n"
3582 " this + argument + is + quite\n"
3583 " + long + so + it + gets + wrapped\n"
3584 " + but + remains + bin - packed);\n"
3585 "}",
3586 Style);
3587 verifyFormat("void test() {\n"
3588 " someFunction(arg1,\n"
3589 " this + argument + is\n"
3590 " + quite + long + so\n"
3591 " + it + gets + wrapped\n"
3592 " + but + remains + bin\n"
3593 " - packed,\n"
3594 " arg3);\n"
3595 "}",
3596 Style);
3597 verifyFormat("void test() {\n"
3598 " someFunction(\n"
3599 " arg1,\n"
3600 " this + argument + has\n"
3601 " + anotherFunc(nested,\n"
3602 " calls + whose\n"
3603 " + arguments\n"
3604 " + are + also\n"
3605 " + wrapped,\n"
3606 " in + addition)\n"
3607 " + to + being + bin - packed,\n"
3608 " arg3);\n"
3609 "}",
3610 Style);
3611
3612 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3613 verifyFormat("void test() {\n"
3614 " someFunction(\n"
3615 " arg1,\n"
3616 " this + argument + has +\n"
3617 " anotherFunc(nested,\n"
3618 " calls + whose +\n"
3619 " arguments +\n"
3620 " are + also +\n"
3621 " wrapped,\n"
3622 " in + addition) +\n"
3623 " to + being + bin - packed,\n"
3624 " arg3);\n"
3625 "}",
3626 Style);
3627}
3628
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003629TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003630 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003631 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3632 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003633 verifyFormat("Constructor()\n"
3634 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003635 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003636 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003637 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003638 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003639
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003640 verifyFormat("template <typename T>\n"
3641 "Constructor() : Initializer(FitsOnTheLine) {}",
3642 getLLVMStyleWithColumns(45));
3643
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003644 verifyFormat(
3645 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003646 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003647
3648 verifyFormat(
3649 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003650 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003651 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003652 verifyFormat(
3653 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003654 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003655 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003656 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3657 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3658 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003659
3660 verifyFormat("Constructor()\n"
3661 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3662 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3663 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003664 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003665
Daniel Jasper65585ed2013-01-28 13:31:35 +00003666 verifyFormat("Constructor()\n"
3667 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003668 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003669
Daniel Jasper62e68172013-02-25 15:59:54 +00003670 verifyFormat("Constructor(int Parameter = 0)\n"
3671 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3672 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003673 verifyFormat("Constructor()\n"
3674 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3675 "}",
3676 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003677 verifyFormat("Constructor()\n"
3678 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3679 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003680
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003681 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003682 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003683 verifyFormat("Constructor()\n"
3684 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3685 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3686 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003687
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003688 FormatStyle OnePerLine = getLLVMStyle();
3689 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003690 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003691 verifyFormat("SomeClass::Constructor()\n"
3692 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3693 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003694 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003695 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003696 verifyFormat("SomeClass::Constructor()\n"
3697 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3698 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003699 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003700 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003701 verifyFormat("MyClass::MyClass(int var)\n"
3702 " : some_var_(var), // 4 space indent\n"
3703 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003704 "}",
3705 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003706 verifyFormat("Constructor()\n"
3707 " : aaaaa(aaaaaa),\n"
3708 " aaaaa(aaaaaa),\n"
3709 " aaaaa(aaaaaa),\n"
3710 " aaaaa(aaaaaa),\n"
3711 " aaaaa(aaaaaa) {}",
3712 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003713 verifyFormat("Constructor()\n"
3714 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3715 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3716 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003717 OnePerLine.BinPackParameters = false;
3718 verifyFormat(
3719 "Constructor()\n"
3720 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3721 " aaaaaaaaaaa().aaa(),\n"
3722 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3723 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003724 OnePerLine.ColumnLimit = 60;
3725 verifyFormat("Constructor()\n"
3726 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3727 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3728 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003729
3730 EXPECT_EQ("Constructor()\n"
3731 " : // Comment forcing unwanted break.\n"
3732 " aaaa(aaaa) {}",
3733 format("Constructor() :\n"
3734 " // Comment forcing unwanted break.\n"
3735 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003736}
3737
Francois Ferranda6b6d512017-05-24 11:36:58 +00003738TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3739 FormatStyle Style = getLLVMStyle();
3740 Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3741
3742 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3743 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3744 getStyleWithColumns(Style, 45));
3745 verifyFormat("Constructor() :\n"
3746 " Initializer(FitsOnTheLine) {}",
3747 getStyleWithColumns(Style, 44));
3748 verifyFormat("Constructor() :\n"
3749 " Initializer(FitsOnTheLine) {}",
3750 getStyleWithColumns(Style, 43));
3751
3752 verifyFormat("template <typename T>\n"
3753 "Constructor() : Initializer(FitsOnTheLine) {}",
3754 getStyleWithColumns(Style, 50));
3755
3756 verifyFormat(
3757 "SomeClass::Constructor() :\n"
3758 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3759 Style);
3760
3761 verifyFormat(
3762 "SomeClass::Constructor() :\n"
3763 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3764 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3765 Style);
3766 verifyFormat(
3767 "SomeClass::Constructor() :\n"
3768 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3769 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3770 Style);
3771 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3772 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3773 " aaaaaaaaaa(aaaaaa) {}",
3774 Style);
3775
3776 verifyFormat("Constructor() :\n"
3777 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3778 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3779 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3780 " aaaaaaaaaaaaaaaaaaaaaaa() {}",
3781 Style);
3782
3783 verifyFormat("Constructor() :\n"
3784 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3785 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3786 Style);
3787
3788 verifyFormat("Constructor(int Parameter = 0) :\n"
3789 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3790 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3791 Style);
3792 verifyFormat("Constructor() :\n"
3793 " aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3794 "}",
3795 getStyleWithColumns(Style, 60));
3796 verifyFormat("Constructor() :\n"
3797 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3798 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3799 Style);
3800
3801 // Here a line could be saved by splitting the second initializer onto two
3802 // lines, but that is not desirable.
3803 verifyFormat("Constructor() :\n"
3804 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3805 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3806 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3807 Style);
3808
3809 FormatStyle OnePerLine = Style;
3810 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3811 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3812 verifyFormat("SomeClass::Constructor() :\n"
3813 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3814 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3815 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3816 OnePerLine);
3817 verifyFormat("SomeClass::Constructor() :\n"
3818 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3819 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3820 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3821 OnePerLine);
3822 verifyFormat("MyClass::MyClass(int var) :\n"
3823 " some_var_(var), // 4 space indent\n"
3824 " some_other_var_(var + 1) { // lined up\n"
3825 "}",
3826 OnePerLine);
3827 verifyFormat("Constructor() :\n"
3828 " aaaaa(aaaaaa),\n"
3829 " aaaaa(aaaaaa),\n"
3830 " aaaaa(aaaaaa),\n"
3831 " aaaaa(aaaaaa),\n"
3832 " aaaaa(aaaaaa) {}",
3833 OnePerLine);
3834 verifyFormat("Constructor() :\n"
3835 " aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3836 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3837 OnePerLine);
3838 OnePerLine.BinPackParameters = false;
3839 verifyFormat(
3840 "Constructor() :\n"
3841 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3842 " aaaaaaaaaaa().aaa(),\n"
3843 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3844 OnePerLine);
3845 OnePerLine.ColumnLimit = 60;
3846 verifyFormat("Constructor() :\n"
3847 " aaaaaaaaaaaaaaaaaaaa(a),\n"
3848 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3849 OnePerLine);
3850
3851 EXPECT_EQ("Constructor() :\n"
3852 " // Comment forcing unwanted break.\n"
3853 " aaaa(aaaa) {}",
3854 format("Constructor() :\n"
3855 " // Comment forcing unwanted break.\n"
3856 " aaaa(aaaa) {}",
3857 Style));
3858
3859 Style.ColumnLimit = 0;
3860 verifyFormat("SomeClass::Constructor() :\n"
3861 " a(a) {}",
3862 Style);
3863 verifyFormat("SomeClass::Constructor() noexcept :\n"
3864 " a(a) {}",
3865 Style);
3866 verifyFormat("SomeClass::Constructor() :\n"
3867 " a(a), b(b), c(c) {}",
3868 Style);
3869 verifyFormat("SomeClass::Constructor() :\n"
3870 " a(a) {\n"
3871 " foo();\n"
3872 " bar();\n"
3873 "}",
3874 Style);
3875
3876 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3877 verifyFormat("SomeClass::Constructor() :\n"
3878 " a(a), b(b), c(c) {\n"
3879 "}",
3880 Style);
3881 verifyFormat("SomeClass::Constructor() :\n"
3882 " a(a) {\n"
3883 "}",
3884 Style);
3885
3886 Style.ColumnLimit = 80;
3887 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3888 Style.ConstructorInitializerIndentWidth = 2;
3889 verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3890 Style);
3891 verifyFormat("SomeClass::Constructor() :\n"
3892 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3893 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3894 Style);
Francois Ferrand6bb103f2018-06-11 14:41:26 +00003895
3896 // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as well
3897 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
3898 verifyFormat("class SomeClass\n"
3899 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3900 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
3901 Style);
3902 Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
3903 verifyFormat("class SomeClass\n"
3904 " : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3905 " , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
3906 Style);
3907 Style.BreakInheritanceList = FormatStyle::BILS_AfterColon;
3908 verifyFormat("class SomeClass :\n"
3909 " public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3910 " public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
3911 Style);
Francois Ferranda6b6d512017-05-24 11:36:58 +00003912}
3913
David Blaikieea95dd72017-08-31 18:49:34 +00003914#ifndef EXPENSIVE_CHECKS
3915// Expensive checks enables libstdc++ checking which includes validating the
3916// state of ranges used in std::priority_queue - this blows out the
3917// runtime/scalability of the function and makes this test unacceptably slow.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003918TEST_F(FormatTest, MemoizationTests) {
3919 // This breaks if the memoization lookup does not take \c Indent and
3920 // \c LastSpace into account.
3921 verifyFormat(
3922 "extern CFRunLoopTimerRef\n"
3923 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3924 " CFTimeInterval interval, CFOptionFlags flags,\n"
3925 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003926 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003927
3928 // Deep nesting somewhat works around our memoization.
3929 verifyFormat(
3930 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3931 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3932 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3933 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3934 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3935 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003936 verifyFormat(
3937 "aaaaa(\n"
3938 " aaaaa,\n"
3939 " aaaaa(\n"
3940 " aaaaa,\n"
3941 " aaaaa(\n"
3942 " aaaaa,\n"
3943 " aaaaa(\n"
3944 " aaaaa,\n"
3945 " aaaaa(\n"
3946 " aaaaa,\n"
3947 " aaaaa(\n"
3948 " aaaaa,\n"
3949 " aaaaa(\n"
3950 " aaaaa,\n"
3951 " aaaaa(\n"
3952 " aaaaa,\n"
3953 " aaaaa(\n"
3954 " aaaaa,\n"
3955 " aaaaa(\n"
3956 " aaaaa,\n"
3957 " aaaaa(\n"
3958 " aaaaa,\n"
3959 " aaaaa(\n"
3960 " aaaaa,\n"
3961 " aaaaa))))))))))));",
3962 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003963 verifyFormat(
3964 "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"
3965 " a),\n"
3966 " a),\n"
3967 " a),\n"
3968 " a),\n"
3969 " a),\n"
3970 " a),\n"
3971 " a),\n"
3972 " a),\n"
3973 " a),\n"
3974 " a),\n"
3975 " a),\n"
3976 " a),\n"
3977 " a),\n"
3978 " a),\n"
3979 " a),\n"
3980 " a),\n"
3981 " a)",
3982 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003983
3984 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003985 FormatStyle OnePerLine = getLLVMStyle();
3986 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003987 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003988 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003989 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003990 for (unsigned i = 0, e = 80; i != e; ++i) {
3991 input += " a,\n";
3992 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003993 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003994 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003995}
David Blaikieea95dd72017-08-31 18:49:34 +00003996#endif
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003997
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003998TEST_F(FormatTest, BreaksAsHighAsPossible) {
3999 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004000 "void f() {\n"
4001 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4002 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4003 " f();\n"
4004 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00004005 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004006 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004007}
4008
Daniel Jasper6728fc12013-04-11 14:29:13 +00004009TEST_F(FormatTest, BreaksFunctionDeclarations) {
4010 // Principially, we break function declarations in a certain order:
4011 // 1) break amongst arguments.
4012 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4013 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004014 verifyFormat("template <class TemplateIt>\n"
4015 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4016 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00004017
4018 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00004019 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004020 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004021 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004022 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004023
4024 // 3) break after (.
4025 verifyFormat(
4026 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00004027 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4028 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004029
4030 // 4) break before after nested name specifiers.
4031 verifyFormat(
4032 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004033 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4034 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004035 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004036
4037 // However, there are exceptions, if a sufficient amount of lines can be
4038 // saved.
4039 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4040 // more adjusting.
4041 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4042 " Cccccccccccccc cccccccccc,\n"
4043 " Cccccccccccccc cccccccccc,\n"
4044 " Cccccccccccccc cccccccccc,\n"
4045 " Cccccccccccccc cccccccccc);");
4046 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004047 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004048 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4049 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4050 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004051 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004052 verifyFormat(
4053 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4054 " Cccccccccccccc cccccccccc,\n"
4055 " Cccccccccccccc cccccccccc,\n"
4056 " Cccccccccccccc cccccccccc,\n"
4057 " Cccccccccccccc cccccccccc,\n"
4058 " Cccccccccccccc cccccccccc,\n"
4059 " Cccccccccccccc cccccccccc);");
4060 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4061 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4062 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4063 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4064 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00004065
4066 // Break after multi-line parameters.
4067 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4068 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4069 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4070 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00004071 verifyFormat("void SomeLoooooooooooongFunction(\n"
4072 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4073 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4074 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004075
4076 // Treat overloaded operators like other functions.
4077 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4078 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00004079 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4080 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00004081 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4082 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4083 verifyGoogleFormat(
4084 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4085 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004086 verifyGoogleFormat(
4087 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4088 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00004089 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4090 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4091 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4092 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00004093 verifyGoogleFormat(
4094 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4095 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4096 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00004097 verifyGoogleFormat(
4098 "template <typename T>\n"
4099 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4100 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4101 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00004102
4103 FormatStyle Style = getLLVMStyle();
4104 Style.PointerAlignment = FormatStyle::PAS_Left;
4105 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4106 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4107 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004108 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4109 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4110 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00004111}
4112
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004113TEST_F(FormatTest, TrailingReturnType) {
4114 verifyFormat("auto foo() -> int;\n");
4115 verifyFormat("struct S {\n"
4116 " auto bar() const -> int;\n"
4117 "};");
4118 verifyFormat("template <size_t Order, typename T>\n"
4119 "auto load_img(const std::string &filename)\n"
4120 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00004121 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4122 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00004123 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00004124 verifyFormat("template <typename T>\n"
4125 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4126 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00004127
4128 // Not trailing return types.
4129 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004130}
4131
Daniel Jasper5be31f72013-05-21 09:16:31 +00004132TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004133 // Avoid breaking before trailing 'const' or other trailing annotations, if
4134 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00004135 FormatStyle Style = getGoogleStyle();
4136 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00004137 verifyFormat("void someLongFunction(\n"
4138 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00004139 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00004140 verifyFormat("LoooooongReturnType\n"
4141 "someLoooooooongFunction() const {}",
4142 getLLVMStyleWithColumns(47));
4143 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4144 " const {}",
4145 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004146 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4147 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4148 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4149 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4150 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4151 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00004152 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4153 " aaaaaaaaaaa aaaaa) const override;");
4154 verifyGoogleFormat(
4155 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4156 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004157
Daniel Jasper5550de62014-02-17 07:57:46 +00004158 // Even if the first parameter has to be wrapped.
4159 verifyFormat("void someLongFunction(\n"
4160 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004161 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00004162 verifyFormat("void someLongFunction(\n"
4163 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004164 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00004165 verifyFormat("void someLongFunction(\n"
4166 " int someLongParameter) override {}",
4167 Style);
4168 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004169 " int someLongParameter) OVERRIDE {}",
4170 Style);
4171 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004172 " int someLongParameter) final {}",
4173 Style);
4174 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004175 " int someLongParameter) FINAL {}",
4176 Style);
4177 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004178 " int parameter) const override {}",
4179 Style);
4180
Daniel Jaspere3f907f2014-06-02 09:52:08 +00004181 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4182 verifyFormat("void someLongFunction(\n"
4183 " int someLongParameter) const\n"
4184 "{\n"
4185 "}",
4186 Style);
4187
Daniel Jasper5550de62014-02-17 07:57:46 +00004188 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004189 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4190 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4191 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00004192
4193 // Breaking before function-like trailing annotations is fine to keep them
4194 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004195 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4196 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4197 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4198 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4199 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4200 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004201 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4202 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004203 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004204
4205 verifyFormat(
4206 "void aaaaaaaaaaaaaaaaaa()\n"
4207 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4208 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4209 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4210 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004211 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004212 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004213 " GUARDED_BY(aaaaaaaaaaaa);");
4214 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004215 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004216 " GUARDED_BY(aaaaaaaaaaaa);");
4217 verifyGoogleFormat(
4218 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4219 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004220 verifyGoogleFormat(
4221 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4222 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004223}
4224
Daniel Jasperf090f032015-05-18 09:47:22 +00004225TEST_F(FormatTest, FunctionAnnotations) {
4226 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004227 "int OldFunction(const string &parameter) {}");
4228 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004229 "string OldFunction(const string &parameter) {}");
4230 verifyFormat("template <typename T>\n"
4231 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4232 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004233
4234 // Not function annotations.
4235 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4236 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004237 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4238 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004239 verifyFormat("MACRO(abc).function() // wrap\n"
4240 " << abc;");
4241 verifyFormat("MACRO(abc)->function() // wrap\n"
4242 " << abc;");
4243 verifyFormat("MACRO(abc)::function() // wrap\n"
4244 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004245}
4246
Daniel Jasperf7935112012-12-03 18:12:45 +00004247TEST_F(FormatTest, BreaksDesireably) {
4248 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4249 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004250 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004251 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4252 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4253 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004254
4255 verifyFormat(
4256 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004257 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004258
4259 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4260 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4261 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004262
4263 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004264 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4265 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4266 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004267 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4268 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004269
4270 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4271 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4272
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004273 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004274 "void f() {\n"
4275 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4276 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4277 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004278 verifyFormat(
4279 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4280 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4281 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004282 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4283 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4284 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004285 "aaaaaa(aaa,\n"
4286 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004287 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4288 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004289 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4290 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004292
Daniel Jasper739b85f2015-06-29 10:42:59 +00004293 // Indent consistently independent of call expression and unary operator.
4294 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4295 " dddddddddddddddddddddddddddddd));");
4296 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4297 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004298 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004299 " dddddddddddddddddddddddddddddd));");
4300
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004301 // This test case breaks on an incorrect memoization, i.e. an optimization not
4302 // taking into account the StopAt value.
4303 verifyFormat(
4304 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004305 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4306 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4307 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004308
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004309 verifyFormat("{\n {\n {\n"
4310 " Annotation.SpaceRequiredBefore =\n"
4311 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4312 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4313 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004314
4315 // Break on an outer level if there was a break on an inner level.
4316 EXPECT_EQ("f(g(h(a, // comment\n"
4317 " b, c),\n"
4318 " d, e),\n"
4319 " x, y);",
4320 format("f(g(h(a, // comment\n"
4321 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004322
4323 // Prefer breaking similar line breaks.
4324 verifyFormat(
4325 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4326 " NSTrackingMouseEnteredAndExited |\n"
4327 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004328}
4329
Daniel Jasper18210d72014-10-09 09:52:05 +00004330TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4331 FormatStyle NoBinPacking = getGoogleStyle();
4332 NoBinPacking.BinPackParameters = false;
4333 NoBinPacking.BinPackArguments = true;
4334 verifyFormat("void f() {\n"
4335 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4336 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4337 "}",
4338 NoBinPacking);
4339 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4340 " int aaaaaaaaaaaaaaaaaaaa,\n"
4341 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4342 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004343
Daniel Jasper00693b082016-01-09 15:56:47 +00004344 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4345 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4346 " vector<int> bbbbbbbbbbbbbbb);",
4347 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004348 // FIXME: This behavior difference is probably not wanted. However, currently
4349 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4350 // template arguments from BreakBeforeParameter being set because of the
4351 // one-per-line formatting.
4352 verifyFormat(
4353 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4354 " aaaaaaaaaa> aaaaaaaaaa);",
4355 NoBinPacking);
4356 verifyFormat(
4357 "void fffffffffff(\n"
4358 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4359 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004360}
4361
Daniel Jasper9278eb92013-01-16 14:59:02 +00004362TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004363 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004364 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004365 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004366 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4367 " aaaaaaaaaaaaaaaaaaaa,\n"
4368 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4369 NoBinPacking);
4370 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4371 " aaaaaaaaaaaaa,\n"
4372 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4373 NoBinPacking);
4374 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004375 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4376 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4377 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4378 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004379 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4380 NoBinPacking);
4381 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4382 " .aaaaaaaaaaaaaaaaaa();",
4383 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004384 verifyFormat("void f() {\n"
4385 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4386 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4387 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004388 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004389
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004390 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004391 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4392 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004393 " aaaaaaaaaaaa);",
4394 NoBinPacking);
4395 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004396 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4397 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004398 " test);",
4399 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004400
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004401 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4402 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004403 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4404 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004405 NoBinPacking);
4406 verifyFormat("a(\"a\"\n"
4407 " \"a\",\n"
4408 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004409
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004410 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004411 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004412 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004413 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004414 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004415 verifyFormat(
4416 "void f() {\n"
4417 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4418 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004419 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004420 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004421 verifyFormat(
4422 "template <class SomeType, class SomeOtherType>\n"
4423 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4424 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004425}
4426
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004427TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4428 FormatStyle Style = getLLVMStyleWithColumns(15);
4429 Style.ExperimentalAutoDetectBinPacking = true;
4430 EXPECT_EQ("aaa(aaaa,\n"
4431 " aaaa,\n"
4432 " aaaa);\n"
4433 "aaa(aaaa,\n"
4434 " aaaa,\n"
4435 " aaaa);",
4436 format("aaa(aaaa,\n" // one-per-line
4437 " aaaa,\n"
4438 " aaaa );\n"
4439 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4440 Style));
4441 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4442 " aaaa);\n"
4443 "aaa(aaaa, aaaa,\n"
4444 " aaaa);",
4445 format("aaa(aaaa, aaaa,\n" // bin-packed
4446 " aaaa );\n"
4447 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4448 Style));
4449}
4450
Daniel Jasper04468962013-01-18 10:56:38 +00004451TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004452 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4453 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4454 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4455 " .StartsWith(\".init\", ORDER_INIT)\n"
4456 " .StartsWith(\".fini\", ORDER_FINI)\n"
4457 " .StartsWith(\".hash\", ORDER_HASH)\n"
4458 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004459
Daniel Jaspereb50c672013-02-15 20:33:06 +00004460 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004461 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004462 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004463 "aaaaaaa->aaaaaaa\n"
4464 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4465 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004466 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004467 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004468 "aaaaaaa->aaaaaaa\n"
4469 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4470 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4471 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004472 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004473 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004474 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004475 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4476 " aaaaaa->aaaaaaaaaaaa()\n"
4477 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004478 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004479 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004480 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004481 "void f() {\n"
4482 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004483 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004484 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004485 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004486 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004487 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004488 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004489 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004490 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004491 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004492 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004493 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004494
4495 verifyFormat(
4496 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4497 verifyFormat("aaaaaaaaaaaaaaa()\n"
4498 " .aaaaaaaaaaaaaaa()\n"
4499 " .aaaaaaaaaaaaaaa()\n"
4500 " .aaaaaaaaaaaaaaa()\n"
4501 " .aaaaaaaaaaaaaaa();");
4502 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4503 " .aaaaaaaaaaaaaaa()\n"
4504 " .aaaaaaaaaaaaaaa()\n"
4505 " .aaaaaaaaaaaaaaa();");
4506 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4507 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4508 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004509 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4510 " ->aaaaaaaaaaaaaae(0)\n"
4511 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004512
Daniel Jasper775954b2015-04-24 10:08:09 +00004513 // Don't linewrap after very short segments.
4514 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4515 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4516 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4517 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4518 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4519 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4520 verifyFormat("aaa()\n"
4521 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4522 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4523 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4524
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004525 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4526 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4527 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4528 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4529 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004530 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004531
Daniel Jaspera41aa532014-09-19 08:01:25 +00004532 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004533 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4534 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004535
4536 // Prefer not to create "hanging" indents.
4537 verifyFormat(
4538 "return !soooooooooooooome_map\n"
4539 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4540 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004541 verifyFormat(
4542 "return aaaaaaaaaaaaaaaa\n"
4543 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4544 " .aaaa(aaaaaaaaaaaaaa);");
4545 // No hanging indent here.
4546 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4547 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4548 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4549 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004550 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4551 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4552 getLLVMStyleWithColumns(60));
4553 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4554 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4555 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4556 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004557 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4558 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4559 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Ilya Biryukov370eff82018-09-17 07:46:20 +00004560
4561 // Dont break if only closing statements before member call
4562 verifyFormat("test() {\n"
4563 " ([]() -> {\n"
4564 " int b = 32;\n"
4565 " return 3;\n"
4566 " }).foo();\n"
4567 "}");
4568 verifyFormat("test() {\n"
4569 " (\n"
4570 " []() -> {\n"
4571 " int b = 32;\n"
4572 " return 3;\n"
4573 " },\n"
4574 " foo, bar)\n"
4575 " .foo();\n"
4576 "}");
4577 verifyFormat("test() {\n"
4578 " ([]() -> {\n"
4579 " int b = 32;\n"
4580 " return 3;\n"
4581 " })\n"
4582 " .foo()\n"
4583 " .bar();\n"
4584 "}");
4585 verifyFormat("test() {\n"
4586 " ([]() -> {\n"
4587 " int b = 32;\n"
4588 " return 3;\n"
4589 " })\n"
4590 " .foo(\"aaaaaaaaaaaaaaaaa\"\n"
4591 " \"bbbb\");\n"
4592 "}",
4593 getLLVMStyleWithColumns(30));
Daniel Jasper04468962013-01-18 10:56:38 +00004594}
4595
Daniel Jasperde5c2072012-12-24 00:13:23 +00004596TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4597 verifyFormat(
4598 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004599 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004600 verifyFormat(
4601 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4602 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4603
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004604 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004605 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004606 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4607 " ccccccccccccccccccccccccc) {\n}");
4608
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004609 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004610 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004611 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4612 " ccccccccccccccccccccccccc) {\n}");
4613
Daniel Jasperde5c2072012-12-24 00:13:23 +00004614 verifyFormat(
4615 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004616 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004617 verifyFormat(
4618 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4619 " ccccccccccccccccccccccccc) {\n}");
4620
Daniel Jasper400adc62013-02-08 15:28:42 +00004621 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4622 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4623 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4624 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004625 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4626 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4627 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4628 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4629
Daniel Jasper400adc62013-02-08 15:28:42 +00004630 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4631 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4632 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004633 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4634 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4635 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004636}
4637
Daniel Jasper43b65482013-01-23 12:27:43 +00004638TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004639 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004640 "unsigned Cost =\n"
4641 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4642 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004643 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004644 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4645 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004646
4647 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004648 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4649 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004650 verifyFormat("unsigned OriginalStartColumn =\n"
4651 " SourceMgr.getSpellingColumnNumber(\n"
4652 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4653 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004654}
4655
Francois Ferrand9976efa2017-05-22 08:28:17 +00004656TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4657 FormatStyle Style = getLLVMStyle();
4658 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4659 " bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4660 Style);
4661
4662 Style.PenaltyBreakAssignment = 20;
4663 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4664 " cccccccccccccccccccccccccc;",
4665 Style);
4666}
4667
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004668TEST_F(FormatTest, AlignsAfterAssignments) {
4669 verifyFormat(
4670 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004671 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004672 verifyFormat(
4673 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004674 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004675 verifyFormat(
4676 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004677 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004678 verifyFormat(
4679 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004680 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004681 verifyFormat(
4682 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4683 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4684 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004685}
4686
4687TEST_F(FormatTest, AlignsAfterReturn) {
4688 verifyFormat(
4689 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4690 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4691 verifyFormat(
4692 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4693 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004694 verifyFormat(
4695 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004696 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004697 verifyFormat(
4698 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004699 " aaaaaaaaaaaaaaaaaaaaaa());");
4700 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4701 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4702 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4703 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4704 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004705 verifyFormat("return\n"
4706 " // true if code is one of a or b.\n"
4707 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004708}
4709
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004710TEST_F(FormatTest, AlignsAfterOpenBracket) {
4711 verifyFormat(
4712 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4713 " aaaaaaaaa aaaaaaa) {}");
4714 verifyFormat(
4715 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4716 " aaaaaaaaaaa aaaaaaaaa);");
4717 verifyFormat(
4718 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4719 " aaaaaaaaaaaaaaaaaaaaa));");
4720 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004721 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004722 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4723 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4724 Style);
4725 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4726 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4727 Style);
4728 verifyFormat("SomeLongVariableName->someFunction(\n"
4729 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4730 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004731 verifyFormat(
4732 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4733 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4734 Style);
4735 verifyFormat(
4736 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4737 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4738 Style);
4739 verifyFormat(
4740 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4741 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4742 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004743
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004744 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4745 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4746 " b));",
4747 Style);
4748
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004749 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4750 Style.BinPackArguments = false;
4751 Style.BinPackParameters = false;
4752 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4753 " aaaaaaaaaaa aaaaaaaa,\n"
4754 " aaaaaaaaa aaaaaaa,\n"
4755 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4756 Style);
4757 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4758 " aaaaaaaaaaa aaaaaaaaa,\n"
4759 " aaaaaaaaaaa aaaaaaaaa,\n"
4760 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4761 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004762 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4763 " aaaaaaaaaaaaaaa,\n"
4764 " aaaaaaaaaaaaaaaaaaaaa,\n"
4765 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004766 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004767 verifyFormat(
4768 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4769 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4770 Style);
4771 verifyFormat(
4772 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4773 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4774 Style);
4775 verifyFormat(
4776 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4777 " aaaaaaaaaaaaaaaaaaaaa(\n"
4778 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4779 " aaaaaaaaaaaaaaaa);",
4780 Style);
4781 verifyFormat(
4782 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4783 " aaaaaaaaaaaaaaaaaaaaa(\n"
4784 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4785 " aaaaaaaaaaaaaaaa);",
4786 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004787}
4788
Daniel Jasper3219e432014-12-02 13:24:51 +00004789TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4790 FormatStyle Style = getLLVMStyleWithColumns(40);
4791 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4792 " bbbbbbbbbbbbbbbbbbbbbb);",
4793 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004794 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004795 Style.AlignOperands = false;
4796 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4797 " bbbbbbbbbbbbbbbbbbbbbb);",
4798 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004799 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004800 Style.AlignOperands = true;
4801 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4802 " bbbbbbbbbbbbbbbbbbbbbb);",
4803 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004804 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004805 Style.AlignOperands = false;
4806 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4807 " bbbbbbbbbbbbbbbbbbbbbb);",
4808 Style);
4809}
4810
Daniel Jasper399d24b2013-01-09 07:06:56 +00004811TEST_F(FormatTest, BreaksConditionalExpressions) {
4812 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004813 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4814 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4815 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4816 verifyFormat(
4817 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004818 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4819 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004820 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004821 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4822 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4823 verifyFormat(
4824 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004825 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4826 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004827 verifyFormat(
4828 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4829 " : aaaaaaaaaaaaa);");
4830 verifyFormat(
4831 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004832 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004833 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4834 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004835 verifyFormat(
4836 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4837 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4838 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004839 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4840 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4841 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4842 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4843 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4844 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4845 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4846 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4847 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4848 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4849 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4850 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004851 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4852 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4853 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4854 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4855 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004856 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4857 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4858 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004859 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4860 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4861 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4862 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004863 verifyFormat(
4864 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4865 " ? aaaaaaaaaaaaaaa\n"
4866 " : aaaaaaaaaaaaaaa;");
4867 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004868 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004869 " ? b\n"
4870 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004871 verifyFormat("return aaaa == bbbb\n"
4872 " // comment\n"
4873 " ? aaaa\n"
4874 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004875 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004876 " format(TheLine.First,\n"
4877 " IndentForLevel[TheLine.Level] >= 0\n"
4878 " ? IndentForLevel[TheLine.Level]\n"
4879 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004880 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004881 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004882 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4883 " ? aaaaaaaaaaaaaaa\n"
4884 " : bbbbbbbbbbbbbbb //\n"
4885 " ? ccccccccccccccc\n"
4886 " : ddddddddddddddd;");
4887 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4888 " ? aaaaaaaaaaaaaaa\n"
4889 " : (bbbbbbbbbbbbbbb //\n"
4890 " ? ccccccccccccccc\n"
4891 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004892 verifyFormat(
4893 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4894 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4895 " aaaaaaaaaaaaaaaaaaaaa +\n"
4896 " aaaaaaaaaaaaaaaaaaaaa\n"
4897 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004898 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004899 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4900 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4901 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004902
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004903 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004904 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004905 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004906 "void f() {\n"
4907 " g(aaa,\n"
4908 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4909 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4910 " ? aaaaaaaaaaaaaaa\n"
4911 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004912 "}",
4913 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004914 verifyFormat(
4915 "void f() {\n"
4916 " g(aaa,\n"
4917 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4918 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4919 " ?: aaaaaaaaaaaaaaa);\n"
4920 "}",
4921 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004922
4923 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4924 " // comment.\n"
4925 " ccccccccccccccccccccccccccccccccccccccc\n"
4926 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4927 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004928
4929 // Assignments in conditional expressions. Apparently not uncommon :-(.
4930 verifyFormat("return a != b\n"
4931 " // comment\n"
4932 " ? a = b\n"
4933 " : a = b;");
4934 verifyFormat("return a != b\n"
4935 " // comment\n"
4936 " ? a = a != b\n"
4937 " // comment\n"
4938 " ? a = b\n"
4939 " : a\n"
4940 " : a;\n");
4941 verifyFormat("return a != b\n"
4942 " // comment\n"
4943 " ? a\n"
4944 " : a = a != b\n"
4945 " // comment\n"
4946 " ? a = b\n"
4947 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004948}
4949
Daniel Jasper165b29e2013-11-08 00:57:11 +00004950TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4951 FormatStyle Style = getLLVMStyle();
4952 Style.BreakBeforeTernaryOperators = false;
4953 Style.ColumnLimit = 70;
4954 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004955 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4956 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4957 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4958 Style);
4959 verifyFormat(
4960 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004961 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4962 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004963 Style);
4964 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004965 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4966 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4967 Style);
4968 verifyFormat(
4969 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004970 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4971 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004972 Style);
4973 verifyFormat(
4974 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4975 " aaaaaaaaaaaaa);",
4976 Style);
4977 verifyFormat(
4978 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4979 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4980 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4981 " aaaaaaaaaaaaa);",
4982 Style);
4983 verifyFormat(
4984 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4985 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4986 " aaaaaaaaaaaaa);",
4987 Style);
4988 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4989 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4990 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4991 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4992 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4993 Style);
4994 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4995 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4996 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4997 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4998 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4999 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5000 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5001 Style);
5002 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5003 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5004 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5005 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5006 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5007 Style);
5008 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5009 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5010 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5011 Style);
5012 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00005013 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00005014 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5015 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5016 Style);
5017 verifyFormat(
5018 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5019 " aaaaaaaaaaaaaaa :\n"
5020 " aaaaaaaaaaaaaaa;",
5021 Style);
5022 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5023 " aaaaaaaaa ?\n"
5024 " b :\n"
5025 " c);",
5026 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00005027 verifyFormat("unsigned Indent =\n"
5028 " format(TheLine.First,\n"
5029 " IndentForLevel[TheLine.Level] >= 0 ?\n"
5030 " IndentForLevel[TheLine.Level] :\n"
5031 " TheLine * 2,\n"
5032 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
5033 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005034 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5035 " aaaaaaaaaaaaaaa :\n"
5036 " bbbbbbbbbbbbbbb ? //\n"
5037 " ccccccccccccccc :\n"
5038 " ddddddddddddddd;",
5039 Style);
5040 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5041 " aaaaaaaaaaaaaaa :\n"
5042 " (bbbbbbbbbbbbbbb ? //\n"
5043 " ccccccccccccccc :\n"
5044 " ddddddddddddddd);",
5045 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00005046 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5047 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5048 " ccccccccccccccccccccccccccc;",
5049 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00005050 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5051 " aaaaa :\n"
5052 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
5053 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005054}
5055
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005056TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5057 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5058 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5059 verifyFormat("bool a = true, b = false;");
5060
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005061 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005062 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005063 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00005064 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005065 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00005066 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005067 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00005068 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00005069 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5070 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5071 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5072 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5073 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5074 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005075
Daniel Jasperbea1ab42015-03-01 18:55:26 +00005076 FormatStyle Style = getGoogleStyle();
5077 Style.PointerAlignment = FormatStyle::PAS_Left;
5078 Style.DerivePointerAlignment = false;
5079 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5080 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5081 " *b = bbbbbbbbbbbbbbbbbbb;",
5082 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00005083 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5084 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5085 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00005086 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00005087 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005088}
5089
Nico Weber4a5030c2013-01-12 01:28:06 +00005090TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5091 verifyFormat("arr[foo ? bar : baz];");
5092 verifyFormat("f()[foo ? bar : baz];");
5093 verifyFormat("(a + b)[foo ? bar : baz];");
5094 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5095}
5096
Daniel Jasperf7935112012-12-03 18:12:45 +00005097TEST_F(FormatTest, AlignsStringLiterals) {
5098 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5099 " \"short literal\");");
5100 verifyFormat(
5101 "looooooooooooooooooooooooongFunction(\n"
5102 " \"short literal\"\n"
5103 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005104 verifyFormat("someFunction(\"Always break between multi-line\"\n"
5105 " \" string literals\",\n"
5106 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005107 EXPECT_EQ("fun + \"1243\" /* comment */\n"
5108 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005109 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00005110 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005111 getLLVMStyleWithColumns(28)));
5112 EXPECT_EQ(
5113 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5114 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5115 " \"aaaaaaaaaaaaaaaa\";",
5116 format("aaaaaa ="
5117 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5118 "aaaaaaaaaaaaaaaaaaaaa\" "
5119 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005120 verifyFormat("a = a + \"a\"\n"
5121 " \"a\"\n"
5122 " \"a\";");
5123 verifyFormat("f(\"a\", \"b\"\n"
5124 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005125
5126 verifyFormat(
5127 "#define LL_FORMAT \"ll\"\n"
5128 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5129 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00005130
5131 verifyFormat("#define A(X) \\\n"
5132 " \"aaaaa\" #X \"bbbbbb\" \\\n"
5133 " \"ccccc\"",
5134 getLLVMStyleWithColumns(23));
5135 verifyFormat("#define A \"def\"\n"
5136 "f(\"abc\" A \"ghi\"\n"
5137 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005138
5139 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005140 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005141 verifyFormat("#define A(X) \\\n"
5142 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5143 " L\"ccccc\"",
5144 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00005145
5146 verifyFormat("f(@\"a\"\n"
5147 " @\"b\");");
5148 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00005149 " @\"b\"\n"
5150 " @\"c\";");
5151 verifyFormat("NSString s = @\"a\"\n"
5152 " \"b\"\n"
5153 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00005154}
5155
Zachary Turner448592e2015-12-18 22:20:15 +00005156TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005157 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005158 // No declarations or definitions should be moved to own line.
5159 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5160 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005161 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005162 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005163 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005164 "int f() { return 1; }\n"
5165 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005166 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00005167
5168 // All declarations and definitions should have the return type moved to its
5169 // own
5170 // line.
5171 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5172 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005173 " int\n"
5174 " f() {\n"
5175 " return 1;\n"
5176 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005177 " int\n"
5178 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005179 "};\n"
5180 "int\n"
5181 "f() {\n"
5182 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005183 "}\n"
5184 "int\n"
5185 "g();\n",
5186 Style);
5187
5188 // Top-level definitions, and no kinds of declarations should have the
5189 // return type moved to its own line.
5190 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5191 verifyFormat("class B {\n"
5192 " int f() { return 1; }\n"
5193 " int g();\n"
5194 "};\n"
5195 "int\n"
5196 "f() {\n"
5197 " return 1;\n"
5198 "}\n"
5199 "int g();\n",
5200 Style);
5201
5202 // Top-level definitions and declarations should have the return type moved
5203 // to its own line.
5204 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5205 verifyFormat("class C {\n"
5206 " int f() { return 1; }\n"
5207 " int g();\n"
5208 "};\n"
5209 "int\n"
5210 "f() {\n"
5211 " return 1;\n"
5212 "}\n"
5213 "int\n"
5214 "g();\n",
5215 Style);
5216
5217 // All definitions should have the return type moved to its own line, but no
5218 // kinds of declarations.
5219 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5220 verifyFormat("class D {\n"
5221 " int\n"
5222 " f() {\n"
5223 " return 1;\n"
5224 " }\n"
5225 " int g();\n"
5226 "};\n"
5227 "int\n"
5228 "f() {\n"
5229 " return 1;\n"
5230 "}\n"
5231 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005232 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005233 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005234 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005235 " return \"\";\n"
5236 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005237 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005238 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005239 verifyFormat("template <class T>\n"
5240 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005241 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005242 " return NULL;\n"
5243 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005244 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005245 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005246 verifyFormat("class C {\n"
5247 " int\n"
5248 " operator+() {\n"
5249 " return 1;\n"
5250 " }\n"
5251 " int\n"
5252 " operator()() {\n"
5253 " return 1;\n"
5254 " }\n"
5255 "};\n",
5256 Style);
5257 verifyFormat("void\n"
5258 "A::operator()() {}\n"
5259 "void\n"
5260 "A::operator>>() {}\n"
5261 "void\n"
5262 "A::operator+() {}\n",
5263 Style);
5264 verifyFormat("void *operator new(std::size_t s);", // No break here.
5265 Style);
5266 verifyFormat("void *\n"
5267 "operator new(std::size_t s) {}",
5268 Style);
5269 verifyFormat("void *\n"
5270 "operator delete[](void *ptr) {}",
5271 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005272 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005273 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005274 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005275 "{\n"
5276 " return \"\";\n"
5277 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005278 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005279 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005280 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005281 "T *\n" // Problem here: no line break
5282 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005283 "{\n"
5284 " return NULL;\n"
5285 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005286 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005287 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005288}
5289
Alexander Kornienko58611712013-07-04 12:02:44 +00005290TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5291 FormatStyle NoBreak = getLLVMStyle();
5292 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5293 FormatStyle Break = getLLVMStyle();
5294 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005295 verifyFormat("aaaa = \"bbbb\"\n"
5296 " \"cccc\";",
5297 NoBreak);
5298 verifyFormat("aaaa =\n"
5299 " \"bbbb\"\n"
5300 " \"cccc\";",
5301 Break);
5302 verifyFormat("aaaa(\"bbbb\"\n"
5303 " \"cccc\");",
5304 NoBreak);
5305 verifyFormat("aaaa(\n"
5306 " \"bbbb\"\n"
5307 " \"cccc\");",
5308 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005309 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5310 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005311 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005312 verifyFormat("aaaa(qqq,\n"
5313 " \"bbbb\"\n"
5314 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005315 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005316 verifyFormat("aaaa(qqq,\n"
5317 " L\"bbbb\"\n"
5318 " L\"cccc\");",
5319 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005320 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5321 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005322 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005323 verifyFormat("string s = someFunction(\n"
5324 " \"abc\"\n"
5325 " \"abc\");",
5326 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005327
Daniel Jasper3251fff2014-06-10 06:27:23 +00005328 // As we break before unary operators, breaking right after them is bad.
5329 verifyFormat("string foo = abc ? \"x\"\n"
5330 " \"blah blah blah blah blah blah\"\n"
5331 " : \"y\";",
5332 Break);
5333
Daniel Jasperc834c702013-07-17 15:38:19 +00005334 // Don't break if there is no column gain.
5335 verifyFormat("f(\"aaaa\"\n"
5336 " \"bbbb\");",
5337 Break);
5338
5339 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005340 EXPECT_EQ("x = \"a\\\n"
5341 "b\\\n"
5342 "c\";",
5343 format("x = \"a\\\n"
5344 "b\\\n"
5345 "c\";",
5346 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005347 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005348 " \"a\\\n"
5349 "b\\\n"
5350 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005351 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005352 "b\\\n"
5353 "c\";",
5354 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005355
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00005356 EXPECT_EQ("NSString *const kString =\n"
5357 " @\"aaaa\"\n"
5358 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005359 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005360 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005361 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005362
5363 Break.ColumnLimit = 0;
5364 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005365}
5366
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005367TEST_F(FormatTest, AlignsPipes) {
5368 verifyFormat(
5369 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5370 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5371 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5372 verifyFormat(
5373 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5374 " << aaaaaaaaaaaaaaaaaaaa;");
5375 verifyFormat(
5376 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5377 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5378 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005379 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5380 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5381 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005382 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5383 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5384 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5385 verifyFormat(
5386 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5387 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5388 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005389 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5390 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5391 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5392 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005393 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5394 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005395 verifyFormat(
5396 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5397 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00005398 verifyFormat(
5399 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5400 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005401
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005402 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5403 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005404 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5405 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5406 " aaaaaaaaaaaaaaaaaaaaa)\n"
5407 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005408 verifyFormat("LOG_IF(aaa == //\n"
5409 " bbb)\n"
5410 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005411
Daniel Jasper467ddb12013-08-12 12:58:05 +00005412 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005413 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5414 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005415 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5416 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5417 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005418 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5419 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005420 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5421 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5422 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5423 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5424 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5425 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5426 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005427
Daniel Jasperc238c872013-04-02 14:33:13 +00005428 verifyFormat(
5429 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5430 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005431
5432 // Incomplete string literal.
5433 EXPECT_EQ("llvm::errs() << \"\n"
5434 " << a;",
5435 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005436
5437 verifyFormat("void f() {\n"
5438 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5439 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5440 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005441
5442 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005443 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5444 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5445 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005446
5447 // Handle '\n'.
5448 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5449 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5450 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5451 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5452 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5453 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5454 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005455}
5456
Daniel Jasper7209bb92016-12-13 11:16:42 +00005457TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5458 verifyFormat("return out << \"somepacket = {\\n\"\n"
5459 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5460 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5461 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5462 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5463 " << \"}\";");
5464
5465 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5466 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5467 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5468 verifyFormat(
5469 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5470 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5471 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5472 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5473 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5474 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5475 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5476 verifyFormat(
5477 "void f() {\n"
5478 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5479 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5480 "}");
5481
5482 // Breaking before the first "<<" is generally not desirable.
5483 verifyFormat(
5484 "llvm::errs()\n"
5485 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5486 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5487 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5488 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5489 getLLVMStyleWithColumns(70));
5490 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5491 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5492 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5493 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5494 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5495 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5496 getLLVMStyleWithColumns(70));
5497
5498 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5499 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5500 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5501 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5502 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5503 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005504 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5505 " (aaaa + aaaa);",
5506 getLLVMStyleWithColumns(40));
5507 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5508 " (aaaaaaa + aaaaa));",
5509 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005510 verifyFormat(
5511 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5512 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5513 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005514}
5515
Daniel Jasperf7935112012-12-03 18:12:45 +00005516TEST_F(FormatTest, UnderstandsEquals) {
5517 verifyFormat(
5518 "aaaaaaaaaaaaaaaaa =\n"
5519 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5520 verifyFormat(
5521 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005522 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005523 verifyFormat(
5524 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005525 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005526 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005527 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5528 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005529
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005530 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5531 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005532}
5533
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005534TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005535 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5536 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005537
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005538 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5539 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005540
5541 verifyFormat(
5542 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5543 " Parameter2);");
5544
5545 verifyFormat(
5546 "ShortObject->shortFunction(\n"
5547 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5548 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5549
5550 verifyFormat("loooooooooooooongFunction(\n"
5551 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5552
5553 verifyFormat(
5554 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5555 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5556
Daniel Jasper687af3b2013-02-14 14:26:07 +00005557 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5558 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005559 verifyFormat("void f() {\n"
5560 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5561 " .Times(2)\n"
5562 " .WillRepeatedly(Return(SomeValue));\n"
5563 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005564 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5565 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005566 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005567 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5568 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005569 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005570 verifyFormat("void f() {\n"
5571 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5572 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5573 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005574 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5575 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5576 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5577 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5578 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005579 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5580 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5581 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5582 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5583 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005584
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005585 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005586 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005587 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005588 verifyFormat(
5589 "aaaaaaaaaaa->aaaaaaaaa(\n"
5590 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5591 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005592
5593 verifyFormat(
5594 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5595 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005596 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5597 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5598 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5599 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005600
Daniel Jasper9b334242013-03-15 14:57:30 +00005601 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005602 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5603 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005604
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005605 FormatStyle NoBinPacking = getLLVMStyle();
5606 NoBinPacking.BinPackParameters = false;
5607 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5608 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5609 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5610 " aaaaaaaaaaaaaaaaaaa,\n"
5611 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5612 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005613
5614 // If there is a subsequent call, change to hanging indentation.
5615 verifyFormat(
5616 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5617 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5618 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5619 verifyFormat(
5620 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5621 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005622 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5623 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5624 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5625 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5626 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5627 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005628}
5629
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005630TEST_F(FormatTest, WrapsTemplateDeclarations) {
5631 verifyFormat("template <typename T>\n"
5632 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005633 verifyFormat("template <typename T>\n"
5634 "// T should be one of {A, B}.\n"
5635 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005636 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005637 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005638 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005639 verifyFormat("template <typename T>\n"
5640 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5641 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005642 verifyFormat(
5643 "template <typename T>\n"
5644 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5645 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005646 verifyFormat(
5647 "template <typename T>\n"
5648 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5649 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5650 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005651 verifyFormat("template <typename T>\n"
5652 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005653 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005654 verifyFormat(
5655 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5656 " typename T4 = char>\n"
5657 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005658 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5659 " template <typename> class cccccccccccccccccccccc,\n"
5660 " typename ddddddddddddd>\n"
5661 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005662 verifyFormat(
5663 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5664 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005665
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005666 verifyFormat("void f() {\n"
5667 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5668 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5669 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005670
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005671 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005672 verifyFormat("template <typename T> void f();");
5673 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005674 verifyFormat(
5675 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5676 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5677 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5678 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5679 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5680 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5681 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5682 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005683 EXPECT_EQ("static_cast<A< //\n"
5684 " B> *>(\n"
5685 "\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00005686 ");",
Daniel Jasperfcfac102014-07-15 09:00:34 +00005687 format("static_cast<A<//\n"
5688 " B>*>(\n"
5689 "\n"
5690 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005691 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5692 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005693
5694 FormatStyle AlwaysBreak = getLLVMStyle();
Francois Ferrand58e6fe52018-05-16 08:25:03 +00005695 AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005696 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5697 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5698 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5699 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5700 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5701 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5702 verifyFormat("template <template <typename> class Fooooooo,\n"
5703 " template <typename> class Baaaaaaar>\n"
5704 "struct C {};",
5705 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005706 verifyFormat("template <typename T> // T can be A, B or C.\n"
5707 "struct C {};",
5708 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005709 verifyFormat("template <enum E> class A {\n"
5710 "public:\n"
5711 " E *f();\n"
5712 "};");
Francois Ferrand58e6fe52018-05-16 08:25:03 +00005713
5714 FormatStyle NeverBreak = getLLVMStyle();
5715 NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
5716 verifyFormat("template <typename T> class C {};", NeverBreak);
5717 verifyFormat("template <typename T> void f();", NeverBreak);
5718 verifyFormat("template <typename T> void f() {}", NeverBreak);
5719 verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
5720 NeverBreak);
5721 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5722 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5723 " ccccccccccccccccccccccccccccccccccccccccccccccc);",
5724 NeverBreak);
5725 verifyFormat("template <template <typename> class Fooooooo,\n"
5726 " template <typename> class Baaaaaaar>\n"
5727 "struct C {};",
5728 NeverBreak);
5729 verifyFormat("template <typename T> // T can be A, B or C.\n"
5730 "struct C {};",
5731 NeverBreak);
5732 verifyFormat("template <enum E> class A {\n"
5733 "public:\n"
5734 " E *f();\n"
5735 "};", NeverBreak);
5736 NeverBreak.PenaltyBreakTemplateDeclaration = 100;
5737 verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
5738 NeverBreak);
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005739}
5740
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005741TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
5742 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
5743 Style.ColumnLimit = 60;
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005744 EXPECT_EQ("// Baseline - no comments.\n"
5745 "template <\n"
5746 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
5747 "void f() {}",
5748 format("// Baseline - no comments.\n"
5749 "template <\n"
5750 " typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
5751 "void f() {}",
5752 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005753
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005754 EXPECT_EQ("template <\n"
5755 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5756 "void f() {}",
5757 format("template <\n"
5758 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5759 "void f() {}",
5760 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005761
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005762 EXPECT_EQ(
5763 "template <\n"
5764 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
5765 "void f() {}",
5766 format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
5767 "void f() {}",
5768 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005769
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005770 EXPECT_EQ(
5771 "template <\n"
5772 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5773 " // multiline\n"
5774 "void f() {}",
5775 format("template <\n"
5776 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
5777 " // multiline\n"
5778 "void f() {}",
5779 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005780
Krasimir Georgievba917bf2018-05-23 15:21:33 +00005781 EXPECT_EQ(
5782 "template <typename aaaaaaaaaa<\n"
5783 " bbbbbbbbbbbb>::value> // trailing loooong\n"
5784 "void f() {}",
5785 format(
5786 "template <\n"
5787 " typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
5788 "void f() {}",
5789 Style));
Krasimir Georgiev0fb19de2018-05-23 14:18:19 +00005790}
5791
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00005792TEST_F(FormatTest, WrapsTemplateParameters) {
5793 FormatStyle Style = getLLVMStyle();
5794 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5795 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5796 verifyFormat(
5797 "template <typename... a> struct q {};\n"
5798 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5799 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5800 " y;",
5801 Style);
5802 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5803 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5804 verifyFormat(
5805 "template <typename... a> struct r {};\n"
5806 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5807 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5808 " y;",
5809 Style);
5810 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5811 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5812 verifyFormat(
5813 "template <typename... a> struct s {};\n"
5814 "extern s<\n"
5815 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5816 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5817 " y;",
5818 Style);
5819 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5820 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5821 verifyFormat(
5822 "template <typename... a> struct t {};\n"
5823 "extern t<\n"
5824 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5825 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5826 " y;",
5827 Style);
5828}
5829
Daniel Jasper45797022013-01-25 10:57:27 +00005830TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5831 verifyFormat(
5832 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5833 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5834 verifyFormat(
5835 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5836 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5837 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5838
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005839 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005840 verifyFormat(
5841 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5842 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005843 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005844
Daniel Jasper45797022013-01-25 10:57:27 +00005845 verifyFormat(
5846 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005847 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005848
5849 // Breaking at nested name specifiers is generally not desirable.
5850 verifyFormat(
5851 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5852 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005853
5854 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005855 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5856 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5857 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005858 " aaaaaaaaaaaaaaaaaaaaa);",
5859 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005860
5861 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5862 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5863 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005864}
5865
Daniel Jasperf7935112012-12-03 18:12:45 +00005866TEST_F(FormatTest, UnderstandsTemplateParameters) {
5867 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005868 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005869 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5870 verifyFormat("bool x = a < 1 || 2 > a;");
5871 verifyFormat("bool x = 5 < f<int>();");
5872 verifyFormat("bool x = f<int>() > 5;");
5873 verifyFormat("bool x = 5 < a<int>::x;");
5874 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5875 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5876
5877 verifyGoogleFormat("A<A<int>> a;");
5878 verifyGoogleFormat("A<A<A<int>>> a;");
5879 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005880 verifyGoogleFormat("A<A<int> > a;");
5881 verifyGoogleFormat("A<A<A<int> > > a;");
5882 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005883 verifyGoogleFormat("A<::A<int>> a;");
5884 verifyGoogleFormat("A<::A> a;");
5885 verifyGoogleFormat("A< ::A> a;");
5886 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005887 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5888 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005889 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5890 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005891 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5892 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005893
Nico Weber7533b4d2014-09-24 17:17:32 +00005894 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5895
Daniel Jasperf7935112012-12-03 18:12:45 +00005896 verifyFormat("test >> a >> b;");
5897 verifyFormat("test << a >> b;");
5898
5899 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005900 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005901 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005902 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5903 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005904 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005905 verifyFormat("f(a.operator()<A>());");
5906 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5907 " .template operator()<A>());",
5908 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005909
5910 // Not template parameters.
5911 verifyFormat("return a < b && c > d;");
5912 verifyFormat("void f() {\n"
5913 " while (a < b && c > d) {\n"
5914 " }\n"
5915 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005916 verifyFormat("template <typename... Types>\n"
5917 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005918
5919 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5920 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5921 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005922 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005923 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005924 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005925}
5926
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005927TEST_F(FormatTest, BitshiftOperatorWidth) {
5928 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5929 " bar */",
5930 format("int a=1<<2; /* foo\n"
5931 " bar */"));
5932
5933 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5934 " bar */",
5935 format("int b =256>>1 ; /* foo\n"
5936 " bar */"));
5937}
5938
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005939TEST_F(FormatTest, UnderstandsBinaryOperators) {
5940 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005941 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005942}
5943
5944TEST_F(FormatTest, UnderstandsPointersToMembers) {
5945 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005946 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005947 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005948 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005949 verifyFormat("void f() {\n"
5950 " (a->*f)();\n"
5951 " a->*x;\n"
5952 " (a.*f)();\n"
5953 " ((*a).*f)();\n"
5954 " a.*x;\n"
5955 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005956 verifyFormat("void f() {\n"
5957 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5958 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5959 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005960 verifyFormat(
5961 "(aaaaaaaaaa->*bbbbbbb)(\n"
5962 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005963 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005964 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005965 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005966}
5967
Daniel Jasper8dd40472012-12-21 09:41:31 +00005968TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005969 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005970 verifyFormat("f(-1, -2, -3);");
5971 verifyFormat("a[-1] = 5;");
5972 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005973 verifyFormat("if (i == -1) {\n}");
5974 verifyFormat("if (i != -1) {\n}");
5975 verifyFormat("if (i > -1) {\n}");
5976 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005977 verifyFormat("++(a->f());");
5978 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005979 verifyFormat("(a->f())++;");
5980 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005981 verifyFormat("if (!(a->f())) {\n}");
Krasimir Georgiev446d6ec2018-03-06 13:56:28 +00005982 verifyFormat("if (!+i) {\n}");
5983 verifyFormat("~&a;");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005984
5985 verifyFormat("a-- > b;");
5986 verifyFormat("b ? -a : c;");
5987 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005988 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005989 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005990 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005991
5992 verifyFormat("return -1;");
5993 verifyFormat("switch (a) {\n"
5994 "case -1:\n"
5995 " break;\n"
5996 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005997 verifyFormat("#define X -1");
5998 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005999
Chandler Carruthf8b72662014-03-02 12:37:31 +00006000 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6001 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00006002
6003 verifyFormat("int a = /* confusing comment */ -1;");
6004 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6005 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006006}
6007
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006008TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00006009 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006010 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00006011 "}");
6012 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00006013 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00006014 verifyFormat("*aaa = aaaaaaa( // break\n"
6015 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00006016}
6017
Daniel Jasper8863ada2013-08-26 08:10:17 +00006018TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00006019 verifyFormat("bool operator<();");
6020 verifyFormat("bool operator>();");
6021 verifyFormat("bool operator=();");
6022 verifyFormat("bool operator==();");
6023 verifyFormat("bool operator!=();");
6024 verifyFormat("int operator+();");
6025 verifyFormat("int operator++();");
Daniel Jasperbbf5f4e2017-11-06 12:11:51 +00006026 verifyFormat("int operator++(int) volatile noexcept;");
Daniel Jasper804a2762016-01-09 15:56:40 +00006027 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006028 verifyFormat("bool operator();");
6029 verifyFormat("bool operator()();");
6030 verifyFormat("bool operator[]();");
6031 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006032 verifyFormat("operator int();");
6033 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006034 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006035 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006036 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006037 verifyFormat("void *operator new(std::size_t size);");
6038 verifyFormat("void *operator new[](std::size_t size);");
6039 verifyFormat("void operator delete(void *ptr);");
6040 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00006041 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6042 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00006043 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00006044 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006045
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006046 verifyFormat(
6047 "ostream &operator<<(ostream &OutputStream,\n"
6048 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00006049 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6050 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6051 " return left.group < right.group;\n"
6052 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00006053 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00006054 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006055
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006056 verifyGoogleFormat("operator void*();");
6057 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00006058 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00006059
6060 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00006061 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6062 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006063}
6064
Daniel Jasper1c220482015-02-25 10:30:06 +00006065TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00006066 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6067 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6068 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6069 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6070 verifyFormat("Deleted &operator=(const Deleted &) &;");
6071 verifyFormat("Deleted &operator=(const Deleted &) &&;");
6072 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6073 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6074 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6075 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6076 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00006077 verifyFormat("void Fn(T const &) const &;");
6078 verifyFormat("void Fn(T const volatile &&) const volatile &&;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00006079 verifyFormat("template <typename T>\n"
6080 "void F(T) && = delete;",
6081 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00006082
Daniel Jasperaf642c62015-08-25 13:40:51 +00006083 FormatStyle AlignLeft = getLLVMStyle();
6084 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00006085 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00006086 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6087 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6088 AlignLeft);
6089 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6090 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006091 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6092 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6093 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6094 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Jacob Bandes-Storch58933c52017-08-10 01:30:22 +00006095 verifyFormat("void Fn(T const&) const&;", AlignLeft);
6096 verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00006097
6098 FormatStyle Spaces = getLLVMStyle();
6099 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006100 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6101 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6102 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6103 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006104
6105 Spaces.SpacesInCStyleCastParentheses = false;
6106 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006107 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6108 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6109 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6110 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006111}
6112
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006113TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00006114 verifyFormat("void f() {\n"
6115 " A *a = new A;\n"
6116 " A *a = new (placement) A;\n"
6117 " delete a;\n"
6118 " delete (A *)a;\n"
6119 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00006120 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6121 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00006122 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6123 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6124 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00006125 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006126}
6127
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006128TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006129 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006130 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006131 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006132 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006133 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006134 verifyIndependentOfContext("int a = b * 10;");
6135 verifyIndependentOfContext("int a = 10 * b;");
6136 verifyIndependentOfContext("int a = b * c;");
6137 verifyIndependentOfContext("int a += b * c;");
6138 verifyIndependentOfContext("int a -= b * c;");
6139 verifyIndependentOfContext("int a *= b * c;");
6140 verifyIndependentOfContext("int a /= b * c;");
6141 verifyIndependentOfContext("int a = *b;");
6142 verifyIndependentOfContext("int a = *b * c;");
6143 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00006144 verifyIndependentOfContext("int a = b * (10);");
6145 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006146 verifyIndependentOfContext("return 10 * b;");
6147 verifyIndependentOfContext("return *b * *c;");
6148 verifyIndependentOfContext("return a & ~b;");
6149 verifyIndependentOfContext("f(b ? *c : *d);");
6150 verifyIndependentOfContext("int a = b ? *c : *d;");
6151 verifyIndependentOfContext("*b = a;");
6152 verifyIndependentOfContext("a * ~b;");
6153 verifyIndependentOfContext("a * !b;");
6154 verifyIndependentOfContext("a * +b;");
6155 verifyIndependentOfContext("a * -b;");
6156 verifyIndependentOfContext("a * ++b;");
6157 verifyIndependentOfContext("a * --b;");
6158 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00006159 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006160 verifyIndependentOfContext("f() * b;");
6161 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006162 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006163 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00006164 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006165 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00006166 verifyIndependentOfContext("return sizeof(int **);");
6167 verifyIndependentOfContext("return sizeof(int ******);");
6168 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00006169 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006170 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00006171 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00006172 verifyGoogleFormat("return sizeof(int**);");
6173 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6174 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006175 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00006176 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00006177 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00006178 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00006179 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00006180 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00006181 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00006182 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00006183 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00006184 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00006185 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00006186 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00006187 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00006188 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00006189 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00006190 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00006191 verifyFormat("void f(const MyOverride &override);");
6192 verifyFormat("void f(const MyFinal &final);");
6193 verifyIndependentOfContext("bool a = f() && override.f();");
6194 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00006195
Daniel Jasper5b49f472013-01-23 12:10:53 +00006196 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00006197
Daniel Jasper5b49f472013-01-23 12:10:53 +00006198 verifyIndependentOfContext("A<int *> a;");
6199 verifyIndependentOfContext("A<int **> a;");
6200 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00006201 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006202 verifyIndependentOfContext(
6203 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006204 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00006205 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00006206 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00006207 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00006208 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00006209
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00006210 verifyFormat(
6211 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6212 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6213
Daniel Jasper1f5d6372016-06-13 14:45:12 +00006214 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00006215 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00006216 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006217 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00006218 verifyGoogleFormat("A<int*> a;");
6219 verifyGoogleFormat("A<int**> a;");
6220 verifyGoogleFormat("A<int*, int*> a;");
6221 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006222 verifyGoogleFormat("f(b ? *c : *d);");
6223 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00006224 verifyGoogleFormat("Type* t = **x;");
6225 verifyGoogleFormat("Type* t = *++*x;");
6226 verifyGoogleFormat("*++*x;");
6227 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6228 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006229 verifyGoogleFormat(
6230 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00006231 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00006232 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6233 verifyGoogleFormat("template <typename T>\n"
6234 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00006235
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006236 FormatStyle Left = getLLVMStyle();
6237 Left.PointerAlignment = FormatStyle::PAS_Left;
6238 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00006239 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00006240 verifyFormat("return *this += 1;", Left);
Manuel Klimek06b575c2017-07-17 15:27:53 +00006241 verifyFormat("throw *x;", Left);
Krasimir Georgiev9b5a89b2017-08-14 11:06:07 +00006242 verifyFormat("delete *x;", Left);
6243 verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
6244 verifyFormat("[](const decltype(*a)* ptr) {}", Left);
6245 verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006246
Daniel Jasper5b49f472013-01-23 12:10:53 +00006247 verifyIndependentOfContext("a = *(x + y);");
6248 verifyIndependentOfContext("a = &(x + y);");
6249 verifyIndependentOfContext("*(x + y).call();");
6250 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006251 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00006252
Daniel Jasper5b49f472013-01-23 12:10:53 +00006253 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00006254 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00006255 "int *MyValues = {\n"
6256 " *A, // Operator detection might be confused by the '{'\n"
6257 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00006258 "};");
Nico Weber80a82762013-01-17 17:17:19 +00006259
Daniel Jasper5b49f472013-01-23 12:10:53 +00006260 verifyIndependentOfContext("if (int *a = &b)");
6261 verifyIndependentOfContext("if (int &a = *b)");
6262 verifyIndependentOfContext("if (a & b[i])");
6263 verifyIndependentOfContext("if (a::b::c::d & b[i])");
6264 verifyIndependentOfContext("if (*b[i])");
6265 verifyIndependentOfContext("if (int *a = (&b))");
6266 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00006267 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00006268 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00006269 verifyFormat("void f() {\n"
6270 " for (const int &v : Values) {\n"
6271 " }\n"
6272 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006273 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6274 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00006275 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00006276
Daniel Jaspera98da3d2013-11-07 19:56:07 +00006277 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006278 verifyFormat("#define MACRO \\\n"
6279 " int *i = a * b; \\\n"
6280 " void f(a *b);",
6281 getLLVMStyleWithColumns(19));
6282
Daniel Jasper97b89482013-03-13 07:49:51 +00006283 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006284 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006285 verifyIndependentOfContext("T **t = new T *;");
6286 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00006287 verifyGoogleFormat("A = new SomeType*[Length]();");
6288 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006289 verifyGoogleFormat("T** t = new T*;");
6290 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006291
Daniel Jaspera65e8872014-03-25 10:52:45 +00006292 verifyFormat("STATIC_ASSERT((a & b) == 0);");
6293 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006294 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006295 "typename t::if<x && y>::type f() {}");
6296 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006297 verifyFormat("vector<int *> v;");
6298 verifyFormat("vector<int *const> v;");
6299 verifyFormat("vector<int *const **const *> v;");
6300 verifyFormat("vector<int *volatile> v;");
6301 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006302 verifyFormat("foo<b && false>();");
6303 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00006304 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00006305 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006306 "template <class T, class = typename std::enable_if<\n"
6307 " std::is_integral<T>::value &&\n"
6308 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
6309 "void F();",
6310 getLLVMStyleWithColumns(70));
6311 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006312 "template <class T,\n"
6313 " class = typename std::enable_if<\n"
6314 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006315 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
6316 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006317 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006318 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006319 verifyFormat(
6320 "template <class T,\n"
6321 " class = typename ::std::enable_if<\n"
6322 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6323 "void F();",
6324 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006325
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006326 verifyIndependentOfContext("MACRO(int *i);");
6327 verifyIndependentOfContext("MACRO(auto *a);");
6328 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00006329 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006330 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006331 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006332 // FIXME: Is there a way to make this work?
6333 // verifyIndependentOfContext("MACRO(A *a);");
6334
Daniel Jasper32ccb032014-06-23 07:36:18 +00006335 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006336 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006337
Daniel Jasper866468a2014-04-14 13:15:29 +00006338 EXPECT_EQ("#define OP(x) \\\n"
6339 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6340 " return s << a.DebugString(); \\\n"
6341 " }",
6342 format("#define OP(x) \\\n"
6343 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6344 " return s << a.DebugString(); \\\n"
6345 " }",
6346 getLLVMStyleWithColumns(50)));
6347
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006348 // FIXME: We cannot handle this case yet; we might be able to figure out that
6349 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006350 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006351
6352 FormatStyle PointerMiddle = getLLVMStyle();
6353 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6354 verifyFormat("delete *x;", PointerMiddle);
6355 verifyFormat("int * x;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006356 verifyFormat("int *[] x;", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006357 verifyFormat("template <int * y> f() {}", PointerMiddle);
6358 verifyFormat("int * f(int * a) {}", PointerMiddle);
6359 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6360 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6361 verifyFormat("A<int *> a;", PointerMiddle);
6362 verifyFormat("A<int **> a;", PointerMiddle);
6363 verifyFormat("A<int *, int *> a;", PointerMiddle);
Ben Hamilton9dc78162018-04-03 14:07:11 +00006364 verifyFormat("A<int *[]> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006365 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6366 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006367 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006368
6369 // Member function reference qualifiers aren't binary operators.
6370 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006371 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006372 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006373 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006374 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006375 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006376}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006377
Daniel Jasperee6d6502013-07-17 20:25:02 +00006378TEST_F(FormatTest, UnderstandsAttributes) {
6379 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006380 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6381 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006382 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006383 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006384 verifyFormat("__attribute__((nodebug)) void\n"
6385 "foo() {}\n",
6386 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006387}
6388
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006389TEST_F(FormatTest, UnderstandsSquareAttributes) {
6390 verifyFormat("SomeType s [[unused]] (InitValue);");
6391 verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
6392 verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
6393 verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
6394 verifyFormat("void f() [[deprecated(\"so sorry\")]];");
6395 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6396 " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Manuel Klimekd0f3fe52018-04-11 14:51:54 +00006397
6398 // Make sure we do not mistake attributes for array subscripts.
6399 verifyFormat("int a() {}\n"
6400 "[[unused]] int b() {}\n");
6401
6402 // On the other hand, we still need to correctly find array subscripts.
6403 verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
6404
6405 // Make sure we do not parse attributes as lambda introducers.
6406 FormatStyle MultiLineFunctions = getLLVMStyle();
6407 MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6408 verifyFormat("[[unused]] int b() {\n"
6409 " return 42;\n"
6410 "}\n",
6411 MultiLineFunctions);
Ben Hamiltonb060ad82018-03-12 15:42:38 +00006412}
6413
Daniel Jasper10cd5812013-05-06 06:35:44 +00006414TEST_F(FormatTest, UnderstandsEllipsis) {
6415 verifyFormat("int printf(const char *fmt, ...);");
6416 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006417 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6418
6419 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006420 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006421 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006422}
6423
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006424TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006425 EXPECT_EQ("int *a;\n"
6426 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006427 "int *a;",
6428 format("int *a;\n"
6429 "int* a;\n"
6430 "int *a;",
6431 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006432 EXPECT_EQ("int* a;\n"
6433 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006434 "int* a;",
6435 format("int* a;\n"
6436 "int* a;\n"
6437 "int *a;",
6438 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006439 EXPECT_EQ("int *a;\n"
6440 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006441 "int *a;",
6442 format("int *a;\n"
6443 "int * a;\n"
6444 "int * a;",
6445 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006446 EXPECT_EQ("auto x = [] {\n"
6447 " int *a;\n"
6448 " int *a;\n"
6449 " int *a;\n"
6450 "};",
6451 format("auto x=[]{int *a;\n"
6452 "int * a;\n"
6453 "int * a;};",
6454 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006455}
6456
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006457TEST_F(FormatTest, UnderstandsRvalueReferences) {
6458 verifyFormat("int f(int &&a) {}");
6459 verifyFormat("int f(int a, char &&b) {}");
6460 verifyFormat("void f() { int &&a = b; }");
6461 verifyGoogleFormat("int f(int a, char&& b) {}");
6462 verifyGoogleFormat("void f() { int&& a = b; }");
6463
Daniel Jasper1eff9082013-05-27 16:36:33 +00006464 verifyIndependentOfContext("A<int &&> a;");
6465 verifyIndependentOfContext("A<int &&, int &&> a;");
6466 verifyGoogleFormat("A<int&&> a;");
6467 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006468
6469 // Not rvalue references:
6470 verifyFormat("template <bool B, bool C> class A {\n"
6471 " static_assert(B && C, \"Something is wrong\");\n"
6472 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006473 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6474 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006475 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006476}
6477
Manuel Klimekc1237a82013-01-23 14:08:21 +00006478TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6479 verifyFormat("void f() {\n"
6480 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006481 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006482 "}",
6483 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006484}
6485
Daniel Jasperef906a92013-01-13 08:01:36 +00006486TEST_F(FormatTest, FormatsCasts) {
6487 verifyFormat("Type *A = static_cast<Type *>(P);");
6488 verifyFormat("Type *A = (Type *)P;");
6489 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6490 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006491 verifyFormat("int a = (int)2.0f;");
6492 verifyFormat("x[(int32)y];");
6493 verifyFormat("x = (int32)y;");
6494 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6495 verifyFormat("int a = (int)*b;");
6496 verifyFormat("int a = (int)2.0f;");
6497 verifyFormat("int a = (int)~0;");
6498 verifyFormat("int a = (int)++a;");
6499 verifyFormat("int a = (int)sizeof(int);");
6500 verifyFormat("int a = (int)+2;");
6501 verifyFormat("my_int a = (my_int)2.0f;");
6502 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006503 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006504 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006505 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006506 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006507 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006508
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006509 verifyFormat("void f() { my_int a = (my_int)*b; }");
6510 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6511 verifyFormat("my_int a = (my_int)~0;");
6512 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006513 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006514 verifyFormat("my_int a = (my_int)1;");
6515 verifyFormat("my_int a = (my_int *)1;");
6516 verifyFormat("my_int a = (const my_int)-1;");
6517 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006518 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006519 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006520 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006521 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006522
6523 // FIXME: single value wrapped with paren will be treated as cast.
6524 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006525
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006526 verifyFormat("{ (void)F; }");
6527
Daniel Jasper998cabc2013-07-18 14:46:07 +00006528 // Don't break after a cast's
6529 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6530 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6531 " bbbbbbbbbbbbbbbbbbbbbb);");
6532
Daniel Jasperef906a92013-01-13 08:01:36 +00006533 // These are not casts.
6534 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006535 verifyFormat("f(foo)->b;");
6536 verifyFormat("f(foo).b;");
6537 verifyFormat("f(foo)(b);");
6538 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006539 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006540 verifyFormat("(*funptr)(foo)[4];");
6541 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006542 verifyFormat("void f(int *);");
6543 verifyFormat("void f(int *) = 0;");
6544 verifyFormat("void f(SmallVector<int>) {}");
6545 verifyFormat("void f(SmallVector<int>);");
6546 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006547 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006548 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006549 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006550 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6551 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006552 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006553
Daniel Jasperba0bda92013-02-23 08:07:18 +00006554 // These are not casts, but at some point were confused with casts.
6555 verifyFormat("virtual void foo(int *) override;");
6556 verifyFormat("virtual void foo(char &) const;");
6557 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006558 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006559 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006560 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006561 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006562
6563 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6564 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006565 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006566 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006567 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6568 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6569 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006570}
6571
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006572TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006573 verifyFormat("A<bool()> a;");
6574 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006575 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006576 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006577 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006578 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006579 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006580 verifyFormat("template <class CallbackClass>\n"
6581 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006582
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006583 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6584 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006585 verifyGoogleFormat(
6586 "template <class CallbackClass>\n"
6587 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006588
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006589 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006590 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006591 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006592 verifyFormat("some_var = function(*some_pointer_var)[0];");
6593 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006594 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006595 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jaspercab46172017-04-24 14:28:49 +00006596 verifyFormat("std::function<\n"
6597 " LooooooooooongTemplatedType<\n"
6598 " SomeType>*(\n"
6599 " LooooooooooooooooongType type)>\n"
6600 " function;",
6601 getGoogleStyleWithColumns(40));
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006602}
6603
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006604TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6605 verifyFormat("A (*foo_)[6];");
6606 verifyFormat("vector<int> (*foo_)[6];");
6607}
6608
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006609TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6610 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6611 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6612 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6613 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006614 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6615 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006616
6617 // Different ways of ()-initializiation.
6618 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6619 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6620 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6621 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6622 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6623 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006624 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6625 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00006626
6627 // Lambdas should not confuse the variable declaration heuristic.
6628 verifyFormat("LooooooooooooooooongType\n"
6629 " variable(nullptr, [](A *a) {});",
6630 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006631}
6632
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006633TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006634 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006635 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006636 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006637 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006638 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006639 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006640 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6641 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006642 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6643 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006644 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6645 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006646 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6647 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006648 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6649 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006650 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6651 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6652 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6653 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006654 FormatStyle Indented = getLLVMStyle();
6655 Indented.IndentWrappedFunctionNames = true;
6656 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6657 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6658 Indented);
6659 verifyFormat(
6660 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6661 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6662 Indented);
6663 verifyFormat(
6664 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6665 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6666 Indented);
6667 verifyFormat(
6668 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6669 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6670 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006671
6672 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006673 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6674 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6675 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006676
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006677 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006678 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006679 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006680 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6681 " SourceLocation L, IdentifierIn *II,\n"
6682 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006683 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006684 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006685 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006686 " const SomeType<string, SomeOtherTemplateParameter>\n"
6687 " &ReallyReallyLongParameterName,\n"
6688 " const SomeType<string, SomeOtherTemplateParameter>\n"
6689 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006690 verifyFormat("template <typename A>\n"
6691 "SomeLoooooooooooooooooooooongType<\n"
6692 " typename some_namespace::SomeOtherType<A>::Type>\n"
6693 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006694
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006695 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006696 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6697 " aaaaaaaaaaaaaaaaaaaaaaa;");
6698 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006699 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6700 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006701 verifyGoogleFormat(
6702 "some_namespace::LongReturnType\n"
6703 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006704 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006705
6706 verifyGoogleFormat("template <typename T>\n"
6707 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006708 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006709 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6710 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006711
6712 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006713 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6714 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006715 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6716 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6717 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6718 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6719 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6720 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6721 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006722
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00006723 verifyFormat("template <typename T> // Templates on own line.\n"
6724 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00006725 "MyFunction(int a);",
6726 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00006727}
6728
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006729TEST_F(FormatTest, FormatsArrays) {
6730 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6731 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006732 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6733 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006734 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6735 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006736 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6737 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6738 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6739 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6740 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6741 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6742 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6743 verifyFormat(
6744 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6745 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6746 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006747 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6748 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006749
6750 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006752 verifyFormat(
6753 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6754 " .aaaaaaa[0]\n"
6755 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006756 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006757
6758 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006759
6760 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6761 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006762}
6763
Daniel Jaspere9de2602012-12-06 09:56:08 +00006764TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6765 verifyFormat("(a)->b();");
6766 verifyFormat("--a;");
6767}
6768
Daniel Jasper8b529712012-12-04 13:02:32 +00006769TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006770 verifyFormat("#include <string>\n"
6771 "#include <a/b/c.h>\n"
6772 "#include \"a/b/string\"\n"
6773 "#include \"string.h\"\n"
6774 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006775 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006776 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006777 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006778 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006779 "#include \"some long include\" // with a comment\n"
Manuel Klimek45ab5592017-11-14 09:19:53 +00006780 "#include \"some very long include path\"\n"
6781 "#include <some/very/long/include/path>\n",
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006782 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006783 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6784 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006785
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006786 verifyFormat("#import <string>");
6787 verifyFormat("#import <a/b/c.h>");
6788 verifyFormat("#import \"a/b/string\"");
6789 verifyFormat("#import \"string.h\"");
6790 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006791 verifyFormat("#if __has_include(<strstream>)\n"
6792 "#include <strstream>\n"
6793 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006794
Daniel Jasper343643b2014-08-13 08:29:18 +00006795 verifyFormat("#define MY_IMPORT <a/b>");
6796
Nico Weber21088802017-02-10 19:36:52 +00006797 verifyFormat("#if __has_include(<a/b>)");
6798 verifyFormat("#if __has_include_next(<a/b>)");
6799 verifyFormat("#define F __has_include(<a/b>)");
6800 verifyFormat("#define F __has_include_next(<a/b>)");
6801
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006802 // Protocol buffer definition or missing "#".
6803 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6804 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006805
6806 FormatStyle Style = getLLVMStyle();
6807 Style.AlwaysBreakBeforeMultilineStrings = true;
6808 Style.ColumnLimit = 0;
6809 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006810
6811 // But 'import' might also be a regular C++ namespace.
6812 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6813 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006814}
6815
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006816//===----------------------------------------------------------------------===//
6817// Error recovery tests.
6818//===----------------------------------------------------------------------===//
6819
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006820TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006821 FormatStyle NoBinPacking = getLLVMStyle();
6822 NoBinPacking.BinPackParameters = false;
6823 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6824 " double *min_x,\n"
6825 " double *max_x,\n"
6826 " double *min_y,\n"
6827 " double *max_y,\n"
6828 " double *min_z,\n"
6829 " double *max_z, ) {}",
6830 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006831}
6832
Daniel Jasper83a54d22013-01-10 09:26:47 +00006833TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006834 verifyFormat("void f() { return; }\n42");
6835 verifyFormat("void f() {\n"
6836 " if (0)\n"
6837 " return;\n"
6838 "}\n"
6839 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006840 verifyFormat("void f() { return }\n42");
6841 verifyFormat("void f() {\n"
6842 " if (0)\n"
6843 " return\n"
6844 "}\n"
6845 "42");
6846}
6847
6848TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6849 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6850 EXPECT_EQ("void f() {\n"
6851 " if (a)\n"
6852 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006853 "}",
6854 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006855 EXPECT_EQ("namespace N {\n"
6856 "void f()\n"
6857 "}",
6858 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006859 EXPECT_EQ("namespace N {\n"
6860 "void f() {}\n"
6861 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006862 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006863 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006864}
6865
Daniel Jasper2df93312013-01-09 10:16:05 +00006866TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6867 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006868 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006869 " b;",
6870 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006871 verifyFormat("function(\n"
6872 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006873 " LoooooooooooongArgument);\n",
6874 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006875}
6876
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006877TEST_F(FormatTest, IncorrectAccessSpecifier) {
6878 verifyFormat("public:");
6879 verifyFormat("class A {\n"
6880 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006881 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006882 "};");
6883 verifyFormat("public\n"
6884 "int qwerty;");
6885 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006886 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006887 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006888 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006889 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006890 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006891}
Daniel Jasperf7935112012-12-03 18:12:45 +00006892
Daniel Jasper291f9362013-03-20 15:58:10 +00006893TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6894 verifyFormat("{");
6895 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006896 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006897}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006898
Krasimir Georgiev067ec702018-05-22 11:44:03 +00006899TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
6900 // Found by oss-fuzz:
6901 // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
6902 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
6903 Style.ColumnLimit = 60;
6904 verifyNoCrash(
6905 "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
6906 "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
6907 "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
6908 Style);
6909}
6910
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006911TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006912 verifyFormat("do {\n}");
6913 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006914 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006915 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006916 "wheeee(fun);");
6917 verifyFormat("do {\n"
6918 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006919 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006920}
6921
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006922TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006923 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006924 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006925 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006926 verifyFormat("while {\n foo;\n foo();\n}");
6927 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006928}
6929
Daniel Jasperc0880a92013-01-04 18:52:56 +00006930TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006931 verifyIncompleteFormat("namespace {\n"
6932 "class Foo { Foo (\n"
6933 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00006934 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006935}
6936
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006937TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006938 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006939 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6940 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006941 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006942
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006943 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006944 " {\n"
6945 " breakme(\n"
6946 " qwe);\n"
6947 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006948 format("{\n"
6949 " {\n"
6950 " breakme(qwe);\n"
6951 "}\n",
6952 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006953}
6954
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006955TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006956 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006957 " avariable,\n"
6958 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006959 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006960}
6961
Manuel Klimek762dd182013-01-21 10:07:49 +00006962TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006963 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006964}
6965
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006966TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006967 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006968 verifyFormat("vector<int> x{\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00006969 " 1,\n"
6970 " 2,\n"
6971 " 3,\n"
6972 " 4,\n"
Daniel Jaspera125d532014-03-21 12:38:57 +00006973 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006974 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6975 verifyFormat("f({1, 2});");
6976 verifyFormat("auto v = Foo{-1};");
6977 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6978 verifyFormat("Class::Class : member{1, 2, 3} {}");
6979 verifyFormat("new vector<int>{1, 2, 3};");
6980 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006981 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006982 verifyFormat("return {arg1, arg2};");
6983 verifyFormat("return {arg1, SomeType{parameter}};");
6984 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6985 verifyFormat("new T{arg1, arg2};");
6986 verifyFormat("f(MyMap[{composite, key}]);");
6987 verifyFormat("class Class {\n"
6988 " T member = {arg1, arg2};\n"
6989 "};");
6990 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Francois Ferrand5f07f442017-06-19 14:41:21 +00006991 verifyFormat("const struct A a = {.a = 1, .b = 2};");
6992 verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006993 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6994 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006995
Daniel Jasper438059e2014-05-22 12:11:13 +00006996 verifyFormat("int foo(int i) { return fo1{}(i); }");
6997 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006998 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006999 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00007000 verifyFormat("Node n{1, Node{1000}, //\n"
7001 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00007002 verifyFormat("Aaaa aaaaaaa{\n"
7003 " {\n"
7004 " aaaa,\n"
7005 " },\n"
7006 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00007007 verifyFormat("class C : public D {\n"
7008 " SomeClass SC{2};\n"
7009 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00007010 verifyFormat("class C : public A {\n"
7011 " class D : public B {\n"
7012 " void f() { int i{2}; }\n"
7013 " };\n"
7014 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00007015 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00007016
Francois Ferrandf92f8062018-05-16 08:03:52 +00007017 // Avoid breaking between equal sign and opening brace
7018 FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
7019 AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
7020 verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
7021 " {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
7022 " {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
7023 " {\"ccccccccccccccccccccc\", 2}};",
7024 AvoidBreakingFirstArgument);
7025
Francois Ferrandd2130f52017-06-30 20:00:02 +00007026 // Binpacking only if there is no trailing comma
7027 verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
7028 " cccccccccc, dddddddddd};",
7029 getLLVMStyleWithColumns(50));
7030 verifyFormat("const Aaaaaa aaaaa = {\n"
7031 " aaaaaaaaaaa,\n"
7032 " bbbbbbbbbbb,\n"
7033 " ccccccccccc,\n"
7034 " ddddddddddd,\n"
7035 "};", getLLVMStyleWithColumns(50));
7036
Daniel Jaspere4ada022016-12-13 10:05:03 +00007037 // Cases where distinguising braced lists and blocks is hard.
7038 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7039 verifyFormat("void f() {\n"
7040 " return; // comment\n"
7041 "}\n"
7042 "SomeType t;");
7043 verifyFormat("void f() {\n"
7044 " if (a) {\n"
7045 " f();\n"
7046 " }\n"
7047 "}\n"
7048 "SomeType t;");
7049
Daniel Jasper08434342015-05-26 07:26:26 +00007050 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007051 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00007052 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007053 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7054 " bbbbb,\n"
7055 " ccccc,\n"
7056 " ddddd,\n"
7057 " eeeee,\n"
7058 " ffffff,\n"
7059 " ggggg,\n"
7060 " hhhhhh,\n"
7061 " iiiiii,\n"
7062 " jjjjjj,\n"
7063 " kkkkkk};",
7064 NoBinPacking);
7065 verifyFormat("const Aaaaaa aaaaa = {\n"
7066 " aaaaa,\n"
7067 " bbbbb,\n"
7068 " ccccc,\n"
7069 " ddddd,\n"
7070 " eeeee,\n"
7071 " ffffff,\n"
7072 " ggggg,\n"
7073 " hhhhhh,\n"
7074 " iiiiii,\n"
7075 " jjjjjj,\n"
7076 " kkkkkk,\n"
7077 "};",
7078 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00007079 verifyFormat(
7080 "const Aaaaaa aaaaa = {\n"
7081 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
7082 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
7083 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7084 "};",
7085 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007086
Chandler Carruthf8b72662014-03-02 12:37:31 +00007087 // FIXME: The alignment of these trailing comments might be bad. Then again,
7088 // this might be utterly useless in real code.
7089 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007090 " : some_value{ //\n"
7091 " aaaaaaa, //\n"
7092 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00007093
Chandler Carruthf8b72662014-03-02 12:37:31 +00007094 // In braced lists, the first comment is always assumed to belong to the
7095 // first element. Thus, it can be moved to the next or previous line as
7096 // appropriate.
7097 EXPECT_EQ("function({// First element:\n"
7098 " 1,\n"
7099 " // Second element:\n"
7100 " 2});",
7101 format("function({\n"
7102 " // First element:\n"
7103 " 1,\n"
7104 " // Second element:\n"
7105 " 2});"));
7106 EXPECT_EQ("std::vector<int> MyNumbers{\n"
7107 " // First element:\n"
7108 " 1,\n"
7109 " // Second element:\n"
7110 " 2};",
7111 format("std::vector<int> MyNumbers{// First element:\n"
7112 " 1,\n"
7113 " // Second element:\n"
7114 " 2};",
7115 getLLVMStyleWithColumns(30)));
Francois Ferrandd2130f52017-06-30 20:00:02 +00007116 // A trailing comma should still lead to an enforced line break and no
7117 // binpacking.
Daniel Jasper64a328e2014-11-11 19:34:57 +00007118 EXPECT_EQ("vector<int> SomeVector = {\n"
7119 " // aaa\n"
Francois Ferrandd2130f52017-06-30 20:00:02 +00007120 " 1,\n"
7121 " 2,\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007122 "};",
7123 format("vector<int> SomeVector = { // aaa\n"
7124 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00007125
Chandler Carruthf8b72662014-03-02 12:37:31 +00007126 FormatStyle ExtraSpaces = getLLVMStyle();
7127 ExtraSpaces.Cpp11BracedListStyle = false;
7128 ExtraSpaces.ColumnLimit = 75;
7129 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7130 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7131 verifyFormat("f({ 1, 2 });", ExtraSpaces);
7132 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7133 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7134 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7135 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7136 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7137 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7138 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7139 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7140 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7141 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7142 verifyFormat("class Class {\n"
7143 " T member = { arg1, arg2 };\n"
7144 "};",
7145 ExtraSpaces);
7146 verifyFormat(
7147 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7148 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7149 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7150 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7151 ExtraSpaces);
7152 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00007153 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007154 ExtraSpaces);
7155 verifyFormat(
7156 "someFunction(OtherParam,\n"
7157 " BracedList{ // comment 1 (Forcing interesting break)\n"
7158 " param1, param2,\n"
7159 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00007160 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007161 ExtraSpaces);
7162 verifyFormat(
7163 "std::this_thread::sleep_for(\n"
7164 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7165 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00007166 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00007167 " aaaaaaa,\n"
7168 " aaaaaaaaaa,\n"
7169 " aaaaa,\n"
7170 " aaaaaaaaaaaaaaa,\n"
7171 " aaa,\n"
7172 " aaaaaaaaaa,\n"
7173 " a,\n"
7174 " aaaaaaaaaaaaaaaaaaaaa,\n"
7175 " aaaaaaaaaaaa,\n"
7176 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7177 " aaaaaaa,\n"
7178 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007179 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Francois Ferrand5f07f442017-06-19 14:41:21 +00007180 verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
7181 verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
Francois Ferrandf92f8062018-05-16 08:03:52 +00007182
7183 // Avoid breaking between initializer/equal sign and opening brace
7184 ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
7185 verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
7186 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7187 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7188 " { \"ccccccccccccccccccccc\", 2 }\n"
7189 "};",
7190 ExtraSpaces);
7191 verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
7192 " { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7193 " { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7194 " { \"ccccccccccccccccccccc\", 2 }\n"
7195 "};",
7196 ExtraSpaces);
Hans Wennborgbfc34062018-06-14 08:01:09 +00007197
7198 FormatStyle SpaceBeforeBrace = getLLVMStyle();
7199 SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
7200 verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
7201 verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
Manuel Klimekab419912013-05-23 09:41:43 +00007202}
7203
Daniel Jasper33b909c2013-10-25 14:29:37 +00007204TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007205 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7206 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7207 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7208 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7209 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7210 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007211 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007212 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00007213 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007214 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7215 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007216 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007217 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7218 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7219 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
7220 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7221 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7222 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7223 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007224 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007225 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7226 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007227 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7228 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7229 " // Separating comment.\n"
7230 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7231 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7232 " // Leading comment\n"
7233 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7234 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007235 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7236 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007237 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00007238 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7239 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007240 getLLVMStyleWithColumns(38));
7241 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007242 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7243 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007244 verifyFormat(
7245 "static unsigned SomeValues[10][3] = {\n"
7246 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
7247 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7248 verifyFormat("static auto fields = new vector<string>{\n"
7249 " \"aaaaaaaaaaaaa\",\n"
7250 " \"aaaaaaaaaaaaa\",\n"
7251 " \"aaaaaaaaaaaa\",\n"
7252 " \"aaaaaaaaaaaaaa\",\n"
7253 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7254 " \"aaaaaaaaaaaa\",\n"
7255 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7256 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00007257 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7258 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7259 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7260 " 3, cccccccccccccccccccccc};",
7261 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00007262
7263 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00007264 verifyFormat("vector<int> x = {\n"
7265 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
7266 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00007267 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00007268 verifyFormat("vector<int> x = {\n"
7269 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00007270 "};",
7271 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00007272 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7273 " 1, 1, 1, 1,\n"
7274 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00007275 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007276
Daniel Jasper60c27072015-05-13 08:16:00 +00007277 // Trailing comment in the first line.
7278 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
7279 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
7280 " 111111111, 222222222, 3333333333, 444444444, //\n"
7281 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00007282 // Trailing comment in the last line.
7283 verifyFormat("int aaaaa[] = {\n"
7284 " 1, 2, 3, // comment\n"
7285 " 4, 5, 6 // comment\n"
7286 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00007287
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007288 // With nested lists, we should either format one item per line or all nested
7289 // lists one on line.
7290 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007291 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7292 " {aaaaaaaaaaaaaaaaaaa},\n"
7293 " {aaaaaaaaaaaaaaaaaaaaa},\n"
7294 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00007295 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00007296 verifyFormat(
7297 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007298 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7299 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7300 " {aaa, aaa},\n"
7301 " {aaa, aaa},\n"
7302 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7303 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7304 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00007305
7306 // No column layout should be used here.
Francois Ferrandd2130f52017-06-30 20:00:02 +00007307 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007308 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00007309
7310 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00007311
Daniel Jaspereb65e912015-12-21 18:31:15 +00007312 // No braced initializer here.
7313 verifyFormat("void f() {\n"
7314 " struct Dummy {};\n"
7315 " f(v);\n"
7316 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00007317
7318 // Long lists should be formatted in columns even if they are nested.
7319 verifyFormat(
7320 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7321 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7322 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7323 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7324 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7325 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00007326
7327 // Allow "single-column" layout even if that violates the column limit. There
7328 // isn't going to be a better way.
7329 verifyFormat("std::vector<int> a = {\n"
7330 " aaaaaaaa,\n"
7331 " aaaaaaaa,\n"
7332 " aaaaaaaa,\n"
7333 " aaaaaaaa,\n"
7334 " aaaaaaaaaa,\n"
7335 " aaaaaaaa,\n"
7336 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7337 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00007338 verifyFormat("vector<int> aaaa = {\n"
7339 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7340 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7341 " aaaaaa.aaaaaaa,\n"
7342 " aaaaaa.aaaaaaa,\n"
7343 " aaaaaa.aaaaaaa,\n"
7344 " aaaaaa.aaaaaaa,\n"
7345 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007346
7347 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00007348 verifyFormat("someFunction(Param, {List1, List2,\n"
7349 " List3});",
7350 getLLVMStyleWithColumns(35));
7351 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007352 " {List1, List2,\n"
7353 " List3});",
7354 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00007355 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7356 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007357}
7358
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007359TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007360 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007361 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007362
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007363 verifyFormat("void f() { return 42; }");
7364 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007365 " return 42;\n"
7366 "}",
7367 DoNotMerge);
7368 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007369 " // Comment\n"
7370 "}");
7371 verifyFormat("{\n"
7372 "#error {\n"
7373 " int a;\n"
7374 "}");
7375 verifyFormat("{\n"
7376 " int a;\n"
7377 "#error {\n"
7378 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007379 verifyFormat("void f() {} // comment");
7380 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007381 verifyFormat("void f() {\n"
7382 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007383 DoNotMerge);
7384 verifyFormat("void f() {\n"
7385 " int a;\n"
7386 "} // comment",
7387 DoNotMerge);
7388 verifyFormat("void f() {\n"
7389 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007390 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007391
7392 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7393 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7394
7395 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7396 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007397 verifyFormat("class C {\n"
7398 " C()\n"
7399 " : iiiiiiii(nullptr),\n"
7400 " kkkkkkk(nullptr),\n"
7401 " mmmmmmm(nullptr),\n"
7402 " nnnnnnn(nullptr) {}\n"
7403 "};",
7404 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007405
7406 FormatStyle NoColumnLimit = getLLVMStyle();
7407 NoColumnLimit.ColumnLimit = 0;
7408 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7409 EXPECT_EQ("class C {\n"
7410 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007411 "};",
7412 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007413 EXPECT_EQ("A()\n"
7414 " : b(0) {\n"
7415 "}",
7416 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7417
7418 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007419 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7420 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007421 EXPECT_EQ("A()\n"
7422 " : b(0) {\n"
7423 "}",
7424 format("A():b(0){}", DoNotMergeNoColumnLimit));
7425 EXPECT_EQ("A()\n"
7426 " : b(0) {\n"
7427 "}",
7428 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007429
7430 verifyFormat("#define A \\\n"
7431 " void f() { \\\n"
7432 " int i; \\\n"
7433 " }",
7434 getLLVMStyleWithColumns(20));
7435 verifyFormat("#define A \\\n"
7436 " void f() { int i; }",
7437 getLLVMStyleWithColumns(21));
7438 verifyFormat("#define A \\\n"
7439 " void f() { \\\n"
7440 " int i; \\\n"
7441 " } \\\n"
7442 " int j;",
7443 getLLVMStyleWithColumns(22));
7444 verifyFormat("#define A \\\n"
7445 " void f() { int i; } \\\n"
7446 " int j;",
7447 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007448}
7449
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007450TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
7451 FormatStyle MergeEmptyOnly = getLLVMStyle();
7452 MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7453 verifyFormat("class C {\n"
7454 " int f() {}\n"
7455 "};",
7456 MergeEmptyOnly);
7457 verifyFormat("class C {\n"
7458 " int f() {\n"
7459 " return 42;\n"
7460 " }\n"
7461 "};",
7462 MergeEmptyOnly);
7463 verifyFormat("int f() {}", MergeEmptyOnly);
7464 verifyFormat("int f() {\n"
7465 " return 42;\n"
7466 "}",
7467 MergeEmptyOnly);
7468
7469 // Also verify behavior when BraceWrapping.AfterFunction = true
7470 MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7471 MergeEmptyOnly.BraceWrapping.AfterFunction = true;
7472 verifyFormat("int f() {}", MergeEmptyOnly);
7473 verifyFormat("class C {\n"
7474 " int f() {}\n"
7475 "};",
7476 MergeEmptyOnly);
7477}
7478
Daniel Jasperd74cf402014-04-08 12:46:38 +00007479TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7480 FormatStyle MergeInlineOnly = getLLVMStyle();
7481 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7482 verifyFormat("class C {\n"
7483 " int f() { return 42; }\n"
7484 "};",
7485 MergeInlineOnly);
7486 verifyFormat("int f() {\n"
7487 " return 42;\n"
7488 "}",
7489 MergeInlineOnly);
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007490
7491 // SFS_Inline implies SFS_Empty
7492 verifyFormat("class C {\n"
7493 " int f() {}\n"
7494 "};",
7495 MergeInlineOnly);
7496 verifyFormat("int f() {}", MergeInlineOnly);
7497
7498 // Also verify behavior when BraceWrapping.AfterFunction = true
7499 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7500 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7501 verifyFormat("class C {\n"
7502 " int f() { return 42; }\n"
7503 "};",
7504 MergeInlineOnly);
7505 verifyFormat("int f()\n"
7506 "{\n"
7507 " return 42;\n"
7508 "}",
7509 MergeInlineOnly);
7510
7511 // SFS_Inline implies SFS_Empty
7512 verifyFormat("int f() {}", MergeInlineOnly);
7513 verifyFormat("class C {\n"
7514 " int f() {}\n"
7515 "};",
7516 MergeInlineOnly);
7517}
7518
Francois Ferrandd3f0e3d2017-06-21 13:56:02 +00007519TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
7520 FormatStyle MergeInlineOnly = getLLVMStyle();
7521 MergeInlineOnly.AllowShortFunctionsOnASingleLine =
7522 FormatStyle::SFS_InlineOnly;
7523 verifyFormat("class C {\n"
7524 " int f() { return 42; }\n"
7525 "};",
7526 MergeInlineOnly);
7527 verifyFormat("int f() {\n"
7528 " return 42;\n"
7529 "}",
7530 MergeInlineOnly);
7531
7532 // SFS_InlineOnly does not imply SFS_Empty
7533 verifyFormat("class C {\n"
7534 " int f() {}\n"
7535 "};",
7536 MergeInlineOnly);
7537 verifyFormat("int f() {\n"
7538 "}",
7539 MergeInlineOnly);
7540
7541 // Also verify behavior when BraceWrapping.AfterFunction = true
7542 MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7543 MergeInlineOnly.BraceWrapping.AfterFunction = true;
7544 verifyFormat("class C {\n"
7545 " int f() { return 42; }\n"
7546 "};",
7547 MergeInlineOnly);
7548 verifyFormat("int f()\n"
7549 "{\n"
7550 " return 42;\n"
7551 "}",
7552 MergeInlineOnly);
7553
7554 // SFS_InlineOnly does not imply SFS_Empty
7555 verifyFormat("int f()\n"
7556 "{\n"
7557 "}",
7558 MergeInlineOnly);
7559 verifyFormat("class C {\n"
7560 " int f() {}\n"
7561 "};",
7562 MergeInlineOnly);
7563}
7564
Francois Ferrandad722562017-06-30 20:25:55 +00007565TEST_F(FormatTest, SplitEmptyFunction) {
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007566 FormatStyle Style = getLLVMStyle();
7567 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7568 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7569 Style.BraceWrapping.AfterFunction = true;
Francois Ferrandad722562017-06-30 20:25:55 +00007570 Style.BraceWrapping.SplitEmptyFunction = false;
Francois Ferrand2a81ca82017-06-13 07:02:43 +00007571 Style.ColumnLimit = 40;
7572
7573 verifyFormat("int f()\n"
7574 "{}",
7575 Style);
7576 verifyFormat("int f()\n"
7577 "{\n"
7578 " return 42;\n"
7579 "}",
7580 Style);
7581 verifyFormat("int f()\n"
7582 "{\n"
7583 " // some comment\n"
7584 "}",
7585 Style);
7586
7587 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7588 verifyFormat("int f() {}", Style);
7589 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7590 "{}",
7591 Style);
7592 verifyFormat("int f()\n"
7593 "{\n"
7594 " return 0;\n"
7595 "}",
7596 Style);
7597
7598 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7599 verifyFormat("class Foo {\n"
7600 " int f() {}\n"
7601 "};\n",
7602 Style);
7603 verifyFormat("class Foo {\n"
7604 " int f() { return 0; }\n"
7605 "};\n",
7606 Style);
7607 verifyFormat("class Foo {\n"
7608 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7609 " {}\n"
7610 "};\n",
7611 Style);
7612 verifyFormat("class Foo {\n"
7613 " int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7614 " {\n"
7615 " return 0;\n"
7616 " }\n"
7617 "};\n",
7618 Style);
7619
7620 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7621 verifyFormat("int f() {}", Style);
7622 verifyFormat("int f() { return 0; }", Style);
7623 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7624 "{}",
7625 Style);
7626 verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7627 "{\n"
7628 " return 0;\n"
7629 "}",
7630 Style);
Daniel Jasperd74cf402014-04-08 12:46:38 +00007631}
Krasimir Georgiev6a1c9d52017-10-02 15:53:37 +00007632TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
7633 FormatStyle Style = getLLVMStyle();
7634 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7635 verifyFormat("#ifdef A\n"
7636 "int f() {}\n"
7637 "#else\n"
7638 "int g() {}\n"
7639 "#endif",
7640 Style);
7641}
Daniel Jasperd74cf402014-04-08 12:46:38 +00007642
Francois Ferrandad722562017-06-30 20:25:55 +00007643TEST_F(FormatTest, SplitEmptyClass) {
7644 FormatStyle Style = getLLVMStyle();
7645 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7646 Style.BraceWrapping.AfterClass = true;
7647 Style.BraceWrapping.SplitEmptyRecord = false;
7648
7649 verifyFormat("class Foo\n"
7650 "{};",
7651 Style);
7652 verifyFormat("/* something */ class Foo\n"
7653 "{};",
7654 Style);
7655 verifyFormat("template <typename X> class Foo\n"
7656 "{};",
7657 Style);
7658 verifyFormat("class Foo\n"
7659 "{\n"
7660 " Foo();\n"
7661 "};",
7662 Style);
7663 verifyFormat("typedef class Foo\n"
7664 "{\n"
7665 "} Foo_t;",
7666 Style);
7667}
7668
7669TEST_F(FormatTest, SplitEmptyStruct) {
7670 FormatStyle Style = getLLVMStyle();
7671 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7672 Style.BraceWrapping.AfterStruct = true;
7673 Style.BraceWrapping.SplitEmptyRecord = false;
7674
7675 verifyFormat("struct Foo\n"
7676 "{};",
7677 Style);
7678 verifyFormat("/* something */ struct Foo\n"
7679 "{};",
7680 Style);
7681 verifyFormat("template <typename X> struct Foo\n"
7682 "{};",
7683 Style);
7684 verifyFormat("struct Foo\n"
7685 "{\n"
7686 " Foo();\n"
7687 "};",
7688 Style);
7689 verifyFormat("typedef struct Foo\n"
7690 "{\n"
7691 "} Foo_t;",
7692 Style);
7693 //typedef struct Bar {} Bar_t;
7694}
7695
7696TEST_F(FormatTest, SplitEmptyUnion) {
7697 FormatStyle Style = getLLVMStyle();
7698 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7699 Style.BraceWrapping.AfterUnion = true;
7700 Style.BraceWrapping.SplitEmptyRecord = false;
7701
7702 verifyFormat("union Foo\n"
7703 "{};",
7704 Style);
7705 verifyFormat("/* something */ union Foo\n"
7706 "{};",
7707 Style);
7708 verifyFormat("union Foo\n"
7709 "{\n"
7710 " A,\n"
7711 "};",
7712 Style);
7713 verifyFormat("typedef union Foo\n"
7714 "{\n"
7715 "} Foo_t;",
7716 Style);
7717}
7718
7719TEST_F(FormatTest, SplitEmptyNamespace) {
7720 FormatStyle Style = getLLVMStyle();
7721 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7722 Style.BraceWrapping.AfterNamespace = true;
7723 Style.BraceWrapping.SplitEmptyNamespace = false;
7724
7725 verifyFormat("namespace Foo\n"
7726 "{};",
7727 Style);
7728 verifyFormat("/* something */ namespace Foo\n"
7729 "{};",
7730 Style);
7731 verifyFormat("inline namespace Foo\n"
7732 "{};",
7733 Style);
Sam McCall6f3778c2018-09-05 07:44:02 +00007734 verifyFormat("/* something */ inline namespace Foo\n"
7735 "{};",
7736 Style);
7737 verifyFormat("export namespace Foo\n"
7738 "{};",
7739 Style);
Francois Ferrandad722562017-06-30 20:25:55 +00007740 verifyFormat("namespace Foo\n"
7741 "{\n"
7742 "void Bar();\n"
7743 "};",
7744 Style);
7745}
7746
7747TEST_F(FormatTest, NeverMergeShortRecords) {
7748 FormatStyle Style = getLLVMStyle();
7749
7750 verifyFormat("class Foo {\n"
7751 " Foo();\n"
7752 "};",
7753 Style);
7754 verifyFormat("typedef class Foo {\n"
7755 " Foo();\n"
7756 "} Foo_t;",
7757 Style);
7758 verifyFormat("struct Foo {\n"
7759 " Foo();\n"
7760 "};",
7761 Style);
7762 verifyFormat("typedef struct Foo {\n"
7763 " Foo();\n"
7764 "} Foo_t;",
7765 Style);
7766 verifyFormat("union Foo {\n"
7767 " A,\n"
7768 "};",
7769 Style);
7770 verifyFormat("typedef union Foo {\n"
7771 " A,\n"
7772 "} Foo_t;",
7773 Style);
7774 verifyFormat("namespace Foo {\n"
7775 "void Bar();\n"
7776 "};",
7777 Style);
7778
7779 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7780 Style.BraceWrapping.AfterClass = true;
7781 Style.BraceWrapping.AfterStruct = true;
7782 Style.BraceWrapping.AfterUnion = true;
7783 Style.BraceWrapping.AfterNamespace = true;
7784 verifyFormat("class Foo\n"
7785 "{\n"
7786 " Foo();\n"
7787 "};",
7788 Style);
7789 verifyFormat("typedef class Foo\n"
7790 "{\n"
7791 " Foo();\n"
7792 "} Foo_t;",
7793 Style);
7794 verifyFormat("struct Foo\n"
7795 "{\n"
7796 " Foo();\n"
7797 "};",
7798 Style);
7799 verifyFormat("typedef struct Foo\n"
7800 "{\n"
7801 " Foo();\n"
7802 "} Foo_t;",
7803 Style);
7804 verifyFormat("union Foo\n"
7805 "{\n"
7806 " A,\n"
7807 "};",
7808 Style);
7809 verifyFormat("typedef union Foo\n"
7810 "{\n"
7811 " A,\n"
7812 "} Foo_t;",
7813 Style);
7814 verifyFormat("namespace Foo\n"
7815 "{\n"
7816 "void Bar();\n"
7817 "};",
7818 Style);
7819}
7820
Manuel Klimeke01bab52013-01-15 13:38:33 +00007821TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7822 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007823 verifyFormat("struct foo a = {bar};\nint n;");
7824 verifyFormat("class foo a = {bar};\nint n;");
7825 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007826
7827 // Elaborate types inside function definitions.
7828 verifyFormat("struct foo f() {}\nint n;");
7829 verifyFormat("class foo f() {}\nint n;");
7830 verifyFormat("union foo f() {}\nint n;");
7831
7832 // Templates.
7833 verifyFormat("template <class X> void f() {}\nint n;");
7834 verifyFormat("template <struct X> void f() {}\nint n;");
7835 verifyFormat("template <union X> void f() {}\nint n;");
7836
7837 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007838 verifyFormat("struct {\n} n;");
7839 verifyFormat(
7840 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007841 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007842 verifyFormat("class MACRO Z {\n} n;");
7843 verifyFormat("class MACRO(X) Z {\n} n;");
7844 verifyFormat("class __attribute__(X) Z {\n} n;");
7845 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007846 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007847 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007848 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7849 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007850
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007851 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007852 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007853
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007854 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007855 verifyFormat(
7856 "template <typename F>\n"
7857 "Matcher(const Matcher<F> &Other,\n"
7858 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7859 " !is_same<F, T>::value>::type * = 0)\n"
7860 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7861
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007862 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007863 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007864 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007865
7866 // FIXME:
7867 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007868 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007869
Manuel Klimeke01bab52013-01-15 13:38:33 +00007870 // Elaborate types where incorrectly parsing the structural element would
7871 // break the indent.
7872 verifyFormat("if (true)\n"
7873 " class X x;\n"
7874 "else\n"
7875 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007876
7877 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007878 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007879}
7880
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007881TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007882 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7883 format("#error Leave all white!!!!! space* alone!\n"));
7884 EXPECT_EQ(
7885 "#warning Leave all white!!!!! space* alone!\n",
7886 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007887 EXPECT_EQ("#error 1", format(" # error 1"));
7888 EXPECT_EQ("#warning 1", format(" # warning 1"));
7889}
7890
Daniel Jasper4431aa92013-04-23 13:54:04 +00007891TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007892 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007893 verifyFormat("#if (AAAA && BBBB)");
7894 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007895 // FIXME: Come up with a better indentation for #elif.
7896 verifyFormat(
7897 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7898 " defined(BBBBBBBB)\n"
7899 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7900 " defined(BBBBBBBB)\n"
7901 "#endif",
7902 getLLVMStyleWithColumns(65));
7903}
7904
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007905TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7906 FormatStyle AllowsMergedIf = getGoogleStyle();
7907 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7908 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7909 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007910 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7911 EXPECT_EQ("if (true) return 42;",
7912 format("if (true)\nreturn 42;", AllowsMergedIf));
7913 FormatStyle ShortMergedIf = AllowsMergedIf;
7914 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007915 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007916 " if (true) return 42;",
7917 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007918 verifyFormat("#define A \\\n"
7919 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007920 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007921 "#define B",
7922 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007923 verifyFormat("#define A \\\n"
7924 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007925 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007926 "g();",
7927 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007928 verifyFormat("{\n"
7929 "#ifdef A\n"
7930 " // Comment\n"
7931 " if (true) continue;\n"
7932 "#endif\n"
7933 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007934 " if (true) continue;\n"
7935 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007936 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007937 ShortMergedIf.ColumnLimit = 33;
7938 verifyFormat("#define A \\\n"
7939 " if constexpr (true) return 42;",
7940 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007941 ShortMergedIf.ColumnLimit = 29;
7942 verifyFormat("#define A \\\n"
7943 " if (aaaaaaaaaa) return 1; \\\n"
7944 " return 2;",
7945 ShortMergedIf);
7946 ShortMergedIf.ColumnLimit = 28;
7947 verifyFormat("#define A \\\n"
7948 " if (aaaaaaaaaa) \\\n"
7949 " return 1; \\\n"
7950 " return 2;",
7951 ShortMergedIf);
Daniel Jasper6a7d5a72017-06-19 07:40:49 +00007952 verifyFormat("#define A \\\n"
7953 " if constexpr (aaaaaaa) \\\n"
7954 " return 1; \\\n"
7955 " return 2;",
7956 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007957}
7958
Manuel Klimekd33516e2013-01-23 10:09:28 +00007959TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007960 verifyFormat("void f(int *a);");
7961 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007962 verifyFormat("class A {\n void f(int *a);\n};");
7963 verifyFormat("class A {\n int *a;\n};");
7964 verifyFormat("namespace a {\n"
7965 "namespace b {\n"
7966 "class A {\n"
7967 " void f() {}\n"
7968 " int *a;\n"
7969 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00007970 "} // namespace b\n"
7971 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007972}
7973
Manuel Klimekd33516e2013-01-23 10:09:28 +00007974TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7975 verifyFormat("while");
7976 verifyFormat("operator");
7977}
7978
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007979TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7980 // This code would be painfully slow to format if we didn't skip it.
7981 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
7982 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7983 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7984 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7985 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7986 "A(1, 1)\n"
7987 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7988 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7989 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7990 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7991 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7992 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7993 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7994 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7995 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7996 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7997 // Deeply nested part is untouched, rest is formatted.
7998 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7999 format(std::string("int i;\n") + Code + "int j;\n",
Krasimir Georgievbcda54b2017-04-21 14:35:20 +00008000 getLLVMStyle(), SC_ExpectIncomplete));
Daniel Jasperfda47cd2016-10-31 13:23:00 +00008001}
8002
Nico Weber7e6a7a12013-01-08 17:56:31 +00008003//===----------------------------------------------------------------------===//
8004// Objective-C tests.
8005//===----------------------------------------------------------------------===//
8006
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008007TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
8008 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
8009 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
8010 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00008011 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008012 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
8013 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
8014 format("-(NSInteger)Method3:(id)anObject;"));
8015 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
8016 format("-(NSInteger)Method4:(id)anObject;"));
8017 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
8018 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
8019 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
8020 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00008021 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8022 "forAllCells:(BOOL)flag;",
8023 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8024 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00008025
8026 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00008027 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
8028 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00008029 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
8030 " inRange:(NSRange)range\n"
8031 " outRange:(NSRange)out_range\n"
8032 " outRange1:(NSRange)out_range1\n"
8033 " outRange2:(NSRange)out_range2\n"
8034 " outRange3:(NSRange)out_range3\n"
8035 " outRange4:(NSRange)out_range4\n"
8036 " outRange5:(NSRange)out_range5\n"
8037 " outRange6:(NSRange)out_range6\n"
8038 " outRange7:(NSRange)out_range7\n"
8039 " outRange8:(NSRange)out_range8\n"
8040 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00008041
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008042 // When the function name has to be wrapped.
8043 FormatStyle Style = getLLVMStyle();
Ben Hamilton416348e2018-04-12 15:11:48 +00008044 // ObjC ignores IndentWrappedFunctionNames when wrapping methods
8045 // and always indents instead.
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008046 Style.IndentWrappedFunctionNames = false;
8047 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
Ben Hamilton416348e2018-04-12 15:11:48 +00008048 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
8049 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008050 "}",
8051 Style);
8052 Style.IndentWrappedFunctionNames = true;
8053 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
Ben Hamilton416348e2018-04-12 15:11:48 +00008054 " veryLooooooooooongName:(NSString)cccccccccccccc\n"
8055 " anotherName:(NSString)dddddddddddddd {\n"
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008056 "}",
8057 Style);
8058
Nico Weberd6f962f2013-01-10 20:18:33 +00008059 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00008060 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00008061 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
8062 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00008063 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00008064
Daniel Jasper37194282013-05-28 08:33:00 +00008065 verifyFormat("- (int (*)())foo:(int (*)())f;");
8066 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00008067
8068 // If there's no return type (very rare in practice!), LLVM and Google style
8069 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00008070 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00008071 verifyFormat("- foo:(int)f;");
8072 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008073}
8074
Nico Weber0588b502013-02-07 00:19:29 +00008075
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008076TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00008077 EXPECT_EQ("\"some text \"\n"
8078 "\"other\";",
8079 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00008080 EXPECT_EQ("\"some text \"\n"
8081 "\"other\";",
8082 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008083 EXPECT_EQ(
8084 "#define A \\\n"
8085 " \"some \" \\\n"
8086 " \"text \" \\\n"
8087 " \"other\";",
8088 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
8089 EXPECT_EQ(
8090 "#define A \\\n"
8091 " \"so \" \\\n"
8092 " \"text \" \\\n"
8093 " \"other\";",
8094 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
8095
8096 EXPECT_EQ("\"some text\"",
8097 format("\"some text\"", getLLVMStyleWithColumns(1)));
8098 EXPECT_EQ("\"some text\"",
8099 format("\"some text\"", getLLVMStyleWithColumns(11)));
8100 EXPECT_EQ("\"some \"\n"
8101 "\"text\"",
8102 format("\"some text\"", getLLVMStyleWithColumns(10)));
8103 EXPECT_EQ("\"some \"\n"
8104 "\"text\"",
8105 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00008106 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008107 "\" tex\"\n"
8108 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008109 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00008110 EXPECT_EQ("\"some\"\n"
8111 "\" tex\"\n"
8112 "\" and\"",
8113 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
8114 EXPECT_EQ("\"some\"\n"
8115 "\"/tex\"\n"
8116 "\"/and\"",
8117 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008118
8119 EXPECT_EQ("variable =\n"
8120 " \"long string \"\n"
8121 " \"literal\";",
8122 format("variable = \"long string literal\";",
8123 getLLVMStyleWithColumns(20)));
8124
8125 EXPECT_EQ("variable = f(\n"
8126 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00008127 " \"literal\",\n"
8128 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00008129 " loooooooooooooooooooong);",
8130 format("variable = f(\"long string literal\", short, "
8131 "loooooooooooooooooooong);",
8132 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008133
Daniel Jaspera44991332015-04-29 13:06:49 +00008134 EXPECT_EQ(
8135 "f(g(\"long string \"\n"
8136 " \"literal\"),\n"
8137 " b);",
8138 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008139 EXPECT_EQ("f(g(\"long string \"\n"
8140 " \"literal\",\n"
8141 " a),\n"
8142 " b);",
8143 format("f(g(\"long string literal\", a), b);",
8144 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008145 EXPECT_EQ(
8146 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00008147 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008148 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8149 EXPECT_EQ("f(\"one two three four five six \"\n"
8150 " \"seven\".split(\n"
8151 " really_looooong_variable));",
8152 format("f(\"one two three four five six seven\"."
8153 "split(really_looooong_variable));",
8154 getLLVMStyleWithColumns(33)));
8155
8156 EXPECT_EQ("f(\"some \"\n"
8157 " \"text\",\n"
8158 " other);",
8159 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008160
8161 // Only break as a last resort.
8162 verifyFormat(
8163 "aaaaaaaaaaaaaaaaaaaa(\n"
8164 " aaaaaaaaaaaaaaaaaaaa,\n"
8165 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008166
Daniel Jaspera44991332015-04-29 13:06:49 +00008167 EXPECT_EQ("\"splitmea\"\n"
8168 "\"trandomp\"\n"
8169 "\"oint\"",
8170 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008171
Daniel Jaspera44991332015-04-29 13:06:49 +00008172 EXPECT_EQ("\"split/\"\n"
8173 "\"pathat/\"\n"
8174 "\"slashes\"",
8175 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008176
Daniel Jaspera44991332015-04-29 13:06:49 +00008177 EXPECT_EQ("\"split/\"\n"
8178 "\"pathat/\"\n"
8179 "\"slashes\"",
8180 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008181 EXPECT_EQ("\"split at \"\n"
8182 "\"spaces/at/\"\n"
8183 "\"slashes.at.any$\"\n"
8184 "\"non-alphanumeric%\"\n"
8185 "\"1111111111characte\"\n"
8186 "\"rs\"",
8187 format("\"split at "
8188 "spaces/at/"
8189 "slashes.at."
8190 "any$non-"
8191 "alphanumeric%"
8192 "1111111111characte"
8193 "rs\"",
8194 getLLVMStyleWithColumns(20)));
8195
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008196 // Verify that splitting the strings understands
8197 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008198 EXPECT_EQ(
8199 "aaaaaaaaaaaa(\n"
8200 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8201 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8202 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8203 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8204 "aaaaaaaaaaaaaaaaaaaaaa\");",
8205 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008206 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8207 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8208 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8209 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8210 "aaaaaaaaaaaaaaaaaaaaaa\";",
8211 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008212 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8213 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8214 format("llvm::outs() << "
8215 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8216 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008217 EXPECT_EQ("ffff(\n"
8218 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8219 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8220 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8221 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8222 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008223
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008224 FormatStyle Style = getLLVMStyleWithColumns(12);
8225 Style.BreakStringLiterals = false;
8226 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8227
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008228 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008229 AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00008230 EXPECT_EQ("#define A \\\n"
8231 " \"some \" \\\n"
8232 " \"text \" \\\n"
8233 " \"other\";",
8234 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008235}
8236
Manuel Klimek93699f42017-11-29 14:29:43 +00008237TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
8238 EXPECT_EQ("C a = \"some more \"\n"
8239 " \"text\";",
8240 format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
8241}
8242
Manuel Klimek9e321992015-07-28 15:50:24 +00008243TEST_F(FormatTest, FullyRemoveEmptyLines) {
8244 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8245 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8246 EXPECT_EQ("int i = a(b());",
8247 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8248}
8249
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008250TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8251 EXPECT_EQ(
8252 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8253 "(\n"
8254 " \"x\t\");",
8255 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8256 "aaaaaaa("
8257 "\"x\t\");"));
8258}
8259
Daniel Jasper174b0122014-01-09 14:18:12 +00008260TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008261 EXPECT_EQ(
8262 "u8\"utf8 string \"\n"
8263 "u8\"literal\";",
8264 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8265 EXPECT_EQ(
8266 "u\"utf16 string \"\n"
8267 "u\"literal\";",
8268 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8269 EXPECT_EQ(
8270 "U\"utf32 string \"\n"
8271 "U\"literal\";",
8272 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8273 EXPECT_EQ("L\"wide string \"\n"
8274 "L\"literal\";",
8275 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008276 EXPECT_EQ("@\"NSString \"\n"
8277 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008278 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +00008279 verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008280
8281 // This input makes clang-format try to split the incomplete unicode escape
8282 // sequence, which used to lead to a crasher.
8283 verifyNoCrash(
8284 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8285 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008286}
8287
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008288TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8289 FormatStyle Style = getGoogleStyleWithColumns(15);
8290 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8291 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8292 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8293 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8294 EXPECT_EQ("u8R\"x(raw literal)x\";",
8295 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008296}
8297
8298TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8299 FormatStyle Style = getLLVMStyleWithColumns(20);
8300 EXPECT_EQ(
8301 "_T(\"aaaaaaaaaaaaaa\")\n"
8302 "_T(\"aaaaaaaaaaaaaa\")\n"
8303 "_T(\"aaaaaaaaaaaa\")",
8304 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00008305 EXPECT_EQ("f(x,\n"
8306 " _T(\"aaaaaaaaaaaa\")\n"
8307 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00008308 " z);",
8309 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8310
8311 // FIXME: Handle embedded spaces in one iteration.
8312 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8313 // "_T(\"aaaaaaaaaaaaa\")\n"
8314 // "_T(\"aaaaaaaaaaaaa\")\n"
8315 // "_T(\"a\")",
8316 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8317 // getLLVMStyleWithColumns(20)));
8318 EXPECT_EQ(
8319 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8320 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008321 EXPECT_EQ("f(\n"
8322 "#if !TEST\n"
8323 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8324 "#endif\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +00008325 ");",
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008326 format("f(\n"
8327 "#if !TEST\n"
8328 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8329 "#endif\n"
8330 ");"));
8331 EXPECT_EQ("f(\n"
8332 "\n"
8333 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8334 format("f(\n"
8335 "\n"
8336 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008337}
8338
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00008339TEST_F(FormatTest, BreaksStringLiteralOperands) {
8340 // In a function call with two operands, the second can be broken with no line
8341 // break before it.
8342 EXPECT_EQ("func(a, \"long long \"\n"
8343 " \"long long\");",
8344 format("func(a, \"long long long long\");",
8345 getLLVMStyleWithColumns(24)));
8346 // In a function call with three operands, the second must be broken with a
8347 // line break before it.
8348 EXPECT_EQ("func(a,\n"
8349 " \"long long long \"\n"
8350 " \"long\",\n"
8351 " c);",
8352 format("func(a, \"long long long long\", c);",
8353 getLLVMStyleWithColumns(24)));
8354 // In a function call with three operands, the third must be broken with a
8355 // line break before it.
8356 EXPECT_EQ("func(a, b,\n"
8357 " \"long long long \"\n"
8358 " \"long\");",
8359 format("func(a, b, \"long long long long\");",
8360 getLLVMStyleWithColumns(24)));
8361 // In a function call with three operands, both the second and the third must
8362 // be broken with a line break before them.
8363 EXPECT_EQ("func(a,\n"
8364 " \"long long long \"\n"
8365 " \"long\",\n"
8366 " \"long long long \"\n"
8367 " \"long\");",
8368 format("func(a, \"long long long long\", \"long long long long\");",
8369 getLLVMStyleWithColumns(24)));
8370 // In a chain of << with two operands, the second can be broken with no line
8371 // break before it.
8372 EXPECT_EQ("a << \"line line \"\n"
8373 " \"line\";",
8374 format("a << \"line line line\";",
8375 getLLVMStyleWithColumns(20)));
8376 // In a chain of << with three operands, the second can be broken with no line
8377 // break before it.
8378 EXPECT_EQ("abcde << \"line \"\n"
8379 " \"line line\"\n"
8380 " << c;",
8381 format("abcde << \"line line line\" << c;",
8382 getLLVMStyleWithColumns(20)));
8383 // In a chain of << with three operands, the third must be broken with a line
8384 // break before it.
8385 EXPECT_EQ("a << b\n"
8386 " << \"line line \"\n"
8387 " \"line\";",
8388 format("a << b << \"line line line\";",
8389 getLLVMStyleWithColumns(20)));
8390 // In a chain of << with three operands, the second can be broken with no line
8391 // break before it and the third must be broken with a line break before it.
8392 EXPECT_EQ("abcd << \"line line \"\n"
8393 " \"line\"\n"
8394 " << \"line line \"\n"
8395 " \"line\";",
8396 format("abcd << \"line line line\" << \"line line line\";",
8397 getLLVMStyleWithColumns(20)));
8398 // In a chain of binary operators with two operands, the second can be broken
8399 // with no line break before it.
8400 EXPECT_EQ("abcd + \"line line \"\n"
8401 " \"line line\";",
8402 format("abcd + \"line line line line\";",
8403 getLLVMStyleWithColumns(20)));
8404 // In a chain of binary operators with three operands, the second must be
8405 // broken with a line break before it.
8406 EXPECT_EQ("abcd +\n"
8407 " \"line line \"\n"
8408 " \"line line\" +\n"
8409 " e;",
8410 format("abcd + \"line line line line\" + e;",
8411 getLLVMStyleWithColumns(20)));
8412 // In a function call with two operands, with AlignAfterOpenBracket enabled,
8413 // the first must be broken with a line break before it.
8414 FormatStyle Style = getLLVMStyleWithColumns(25);
8415 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8416 EXPECT_EQ("someFunction(\n"
8417 " \"long long long \"\n"
8418 " \"long\",\n"
8419 " a);",
8420 format("someFunction(\"long long long long\", a);", Style));
8421}
8422
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008423TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008424 EXPECT_EQ(
8425 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8426 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8427 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8428 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8429 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8430 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8431}
8432
8433TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8434 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008435 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008436 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8437 "multiline raw string literal xxxxxxxxxxxxxx\n"
8438 ")x\",\n"
8439 " a),\n"
8440 " b);",
8441 format("fffffffffff(g(R\"x(\n"
8442 "multiline raw string literal xxxxxxxxxxxxxx\n"
8443 ")x\", a), b);",
8444 getGoogleStyleWithColumns(20)));
8445 EXPECT_EQ("fffffffffff(\n"
8446 " g(R\"x(qqq\n"
8447 "multiline raw string literal xxxxxxxxxxxxxx\n"
8448 ")x\",\n"
8449 " a),\n"
8450 " b);",
8451 format("fffffffffff(g(R\"x(qqq\n"
8452 "multiline raw string literal xxxxxxxxxxxxxx\n"
8453 ")x\", a), b);",
8454 getGoogleStyleWithColumns(20)));
8455
8456 EXPECT_EQ("fffffffffff(R\"x(\n"
8457 "multiline raw string literal xxxxxxxxxxxxxx\n"
8458 ")x\");",
8459 format("fffffffffff(R\"x(\n"
8460 "multiline raw string literal xxxxxxxxxxxxxx\n"
8461 ")x\");",
8462 getGoogleStyleWithColumns(20)));
8463 EXPECT_EQ("fffffffffff(R\"x(\n"
8464 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008465 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008466 format("fffffffffff(R\"x(\n"
8467 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008468 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008469 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008470 EXPECT_EQ("fffffffffff(\n"
8471 " R\"x(\n"
8472 "multiline raw string literal xxxxxxxxxxxxxx\n"
8473 ")x\" +\n"
8474 " bbbbbb);",
8475 format("fffffffffff(\n"
8476 " R\"x(\n"
8477 "multiline raw string literal xxxxxxxxxxxxxx\n"
8478 ")x\" + bbbbbb);",
8479 getGoogleStyleWithColumns(20)));
Daniel Jasperfd327672018-03-22 14:43:54 +00008480 EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
8481 format("fffffffffff(\n"
8482 " R\"(single line raw string)\" + bbbbbb);"));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008483}
8484
Alexander Kornienkobe633902013-06-14 11:46:10 +00008485TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008486 verifyFormat("string a = \"unterminated;");
8487 EXPECT_EQ("function(\"unterminated,\n"
8488 " OtherParameter);",
8489 format("function( \"unterminated,\n"
8490 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008491}
8492
8493TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008494 FormatStyle Style = getLLVMStyle();
8495 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008496 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008497 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008498}
8499
Daniel Jaspera44991332015-04-29 13:06:49 +00008500TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008501
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008502TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8503 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8504 " \"ddeeefff\");",
8505 format("someFunction(\"aaabbbcccdddeeefff\");",
8506 getLLVMStyleWithColumns(25)));
8507 EXPECT_EQ("someFunction1234567890(\n"
8508 " \"aaabbbcccdddeeefff\");",
8509 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8510 getLLVMStyleWithColumns(26)));
8511 EXPECT_EQ("someFunction1234567890(\n"
8512 " \"aaabbbcccdddeeeff\"\n"
8513 " \"f\");",
8514 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8515 getLLVMStyleWithColumns(25)));
8516 EXPECT_EQ("someFunction1234567890(\n"
8517 " \"aaabbbcccdddeeeff\"\n"
8518 " \"f\");",
8519 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8520 getLLVMStyleWithColumns(24)));
Manuel Klimek77866142017-11-17 11:17:15 +00008521 EXPECT_EQ("someFunction(\n"
8522 " \"aaabbbcc ddde \"\n"
8523 " \"efff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008524 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008525 getLLVMStyleWithColumns(25)));
8526 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8527 " \"ddeeefff\");",
8528 format("someFunction(\"aaabbbccc ddeeefff\");",
8529 getLLVMStyleWithColumns(25)));
8530 EXPECT_EQ("someFunction1234567890(\n"
8531 " \"aaabb \"\n"
8532 " \"cccdddeeefff\");",
8533 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8534 getLLVMStyleWithColumns(25)));
8535 EXPECT_EQ("#define A \\\n"
8536 " string s = \\\n"
8537 " \"123456789\" \\\n"
8538 " \"0\"; \\\n"
8539 " int i;",
8540 format("#define A string s = \"1234567890\"; int i;",
8541 getLLVMStyleWithColumns(20)));
Manuel Klimek77866142017-11-17 11:17:15 +00008542 EXPECT_EQ("someFunction(\n"
8543 " \"aaabbbcc \"\n"
8544 " \"dddeeefff\");",
Daniel Jasper2739af32013-08-28 10:03:58 +00008545 format("someFunction(\"aaabbbcc dddeeefff\");",
8546 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008547}
8548
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008549TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008550 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8551 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008552 EXPECT_EQ("\"test\"\n"
8553 "\"\\n\"",
8554 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8555 EXPECT_EQ("\"tes\\\\\"\n"
8556 "\"n\"",
8557 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8558 EXPECT_EQ("\"\\\\\\\\\"\n"
8559 "\"\\n\"",
8560 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008561 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008562 EXPECT_EQ("\"\\uff01\"\n"
8563 "\"test\"",
8564 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8565 EXPECT_EQ("\"\\Uff01ff02\"",
8566 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8567 EXPECT_EQ("\"\\x000000000001\"\n"
8568 "\"next\"",
8569 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8570 EXPECT_EQ("\"\\x000000000001next\"",
8571 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8572 EXPECT_EQ("\"\\x000000000001\"",
8573 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8574 EXPECT_EQ("\"test\"\n"
8575 "\"\\000000\"\n"
8576 "\"000001\"",
8577 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8578 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008579 "\"00000000\"\n"
8580 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008581 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008582}
8583
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008584TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8585 verifyFormat("void f() {\n"
8586 " return g() {}\n"
8587 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008588 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008589 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008590 "}");
8591}
8592
Manuel Klimek421147e2014-01-24 09:25:23 +00008593TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8594 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008595 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008596}
8597
Manuel Klimek13b97d82013-05-13 08:42:42 +00008598TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8599 verifyFormat("class X {\n"
8600 " void f() {\n"
8601 " }\n"
8602 "};",
8603 getLLVMStyleWithColumns(12));
8604}
8605
8606TEST_F(FormatTest, ConfigurableIndentWidth) {
8607 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8608 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008609 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008610 verifyFormat("void f() {\n"
8611 " someFunction();\n"
8612 " if (true) {\n"
8613 " f();\n"
8614 " }\n"
8615 "}",
8616 EightIndent);
8617 verifyFormat("class X {\n"
8618 " void f() {\n"
8619 " }\n"
8620 "};",
8621 EightIndent);
8622 verifyFormat("int x[] = {\n"
8623 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008624 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008625 EightIndent);
8626}
8627
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008628TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008629 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008630 "f();",
8631 getLLVMStyleWithColumns(8));
8632}
8633
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008634TEST_F(FormatTest, ConfigurableUseOfTab) {
8635 FormatStyle Tab = getLLVMStyleWithColumns(42);
8636 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008637 Tab.UseTab = FormatStyle::UT_Always;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00008638 Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008639
8640 EXPECT_EQ("if (aaaaaaaa && // q\n"
8641 " bb)\t\t// w\n"
8642 "\t;",
8643 format("if (aaaaaaaa &&// q\n"
8644 "bb)// w\n"
8645 ";",
8646 Tab));
8647 EXPECT_EQ("if (aaa && bbb) // w\n"
8648 "\t;",
8649 format("if(aaa&&bbb)// w\n"
8650 ";",
8651 Tab));
8652
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008653 verifyFormat("class X {\n"
8654 "\tvoid f() {\n"
8655 "\t\tsomeFunction(parameter1,\n"
8656 "\t\t\t parameter2);\n"
8657 "\t}\n"
8658 "};",
8659 Tab);
8660 verifyFormat("#define A \\\n"
8661 "\tvoid f() { \\\n"
8662 "\t\tsomeFunction( \\\n"
8663 "\t\t parameter1, \\\n"
8664 "\t\t parameter2); \\\n"
8665 "\t}",
8666 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008667
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008668 Tab.TabWidth = 4;
8669 Tab.IndentWidth = 8;
8670 verifyFormat("class TabWidth4Indent8 {\n"
8671 "\t\tvoid f() {\n"
8672 "\t\t\t\tsomeFunction(parameter1,\n"
8673 "\t\t\t\t\t\t\t parameter2);\n"
8674 "\t\t}\n"
8675 "};",
8676 Tab);
8677
8678 Tab.TabWidth = 4;
8679 Tab.IndentWidth = 4;
8680 verifyFormat("class TabWidth4Indent4 {\n"
8681 "\tvoid f() {\n"
8682 "\t\tsomeFunction(parameter1,\n"
8683 "\t\t\t\t\t parameter2);\n"
8684 "\t}\n"
8685 "};",
8686 Tab);
8687
8688 Tab.TabWidth = 8;
8689 Tab.IndentWidth = 4;
8690 verifyFormat("class TabWidth8Indent4 {\n"
8691 " void f() {\n"
8692 "\tsomeFunction(parameter1,\n"
8693 "\t\t parameter2);\n"
8694 " }\n"
8695 "};",
8696 Tab);
8697
Alexander Kornienko39856b72013-09-10 09:38:25 +00008698 Tab.TabWidth = 8;
8699 Tab.IndentWidth = 8;
8700 EXPECT_EQ("/*\n"
8701 "\t a\t\tcomment\n"
8702 "\t in multiple lines\n"
8703 " */",
8704 format(" /*\t \t \n"
8705 " \t \t a\t\tcomment\t \t\n"
8706 " \t \t in multiple lines\t\n"
8707 " \t */",
8708 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008709
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008710 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008711 verifyFormat("{\n"
8712 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8713 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8714 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8715 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8716 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8717 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008718 "};",
8719 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008720 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008721 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008722 "\ta2,\n"
8723 "\ta3\n"
8724 "};",
8725 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008726 EXPECT_EQ("if (aaaaaaaa && // q\n"
8727 " bb) // w\n"
8728 "\t;",
8729 format("if (aaaaaaaa &&// q\n"
8730 "bb)// w\n"
8731 ";",
8732 Tab));
8733 verifyFormat("class X {\n"
8734 "\tvoid f() {\n"
8735 "\t\tsomeFunction(parameter1,\n"
8736 "\t\t parameter2);\n"
8737 "\t}\n"
8738 "};",
8739 Tab);
8740 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008741 "\tQ(\n"
8742 "\t {\n"
8743 "\t\t int a;\n"
8744 "\t\t someFunction(aaaaaaaa,\n"
8745 "\t\t bbbbbbb);\n"
8746 "\t },\n"
8747 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008748 "}",
8749 Tab);
8750 EXPECT_EQ("{\n"
8751 "\t/* aaaa\n"
8752 "\t bbbb */\n"
8753 "}",
8754 format("{\n"
8755 "/* aaaa\n"
8756 " bbbb */\n"
8757 "}",
8758 Tab));
8759 EXPECT_EQ("{\n"
8760 "\t/*\n"
8761 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8762 "\t bbbbbbbbbbbbb\n"
8763 "\t*/\n"
8764 "}",
8765 format("{\n"
8766 "/*\n"
8767 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8768 "*/\n"
8769 "}",
8770 Tab));
8771 EXPECT_EQ("{\n"
8772 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8773 "\t// bbbbbbbbbbbbb\n"
8774 "}",
8775 format("{\n"
8776 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8777 "}",
8778 Tab));
8779 EXPECT_EQ("{\n"
8780 "\t/*\n"
8781 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8782 "\t bbbbbbbbbbbbb\n"
8783 "\t*/\n"
8784 "}",
8785 format("{\n"
8786 "\t/*\n"
8787 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8788 "\t*/\n"
8789 "}",
8790 Tab));
8791 EXPECT_EQ("{\n"
8792 "\t/*\n"
8793 "\n"
8794 "\t*/\n"
8795 "}",
8796 format("{\n"
8797 "\t/*\n"
8798 "\n"
8799 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008800 "}",
8801 Tab));
8802 EXPECT_EQ("{\n"
8803 "\t/*\n"
8804 " asdf\n"
8805 "\t*/\n"
8806 "}",
8807 format("{\n"
8808 "\t/*\n"
8809 " asdf\n"
8810 "\t*/\n"
8811 "}",
8812 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008813
8814 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008815 EXPECT_EQ("/*\n"
8816 " a\t\tcomment\n"
8817 " in multiple lines\n"
8818 " */",
8819 format(" /*\t \t \n"
8820 " \t \t a\t\tcomment\t \t\n"
8821 " \t \t in multiple lines\t\n"
8822 " \t */",
8823 Tab));
8824 EXPECT_EQ("/* some\n"
8825 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008826 format(" \t \t /* some\n"
8827 " \t \t comment */",
8828 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008829 EXPECT_EQ("int a; /* some\n"
8830 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008831 format(" \t \t int a; /* some\n"
8832 " \t \t comment */",
8833 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008834
Alexander Kornienko39856b72013-09-10 09:38:25 +00008835 EXPECT_EQ("int a; /* some\n"
8836 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008837 format(" \t \t int\ta; /* some\n"
8838 " \t \t comment */",
8839 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008840 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8841 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008842 format(" \t \t f(\"\t\t\"); /* some\n"
8843 " \t \t comment */",
8844 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008845 EXPECT_EQ("{\n"
8846 " /*\n"
8847 " * Comment\n"
8848 " */\n"
8849 " int i;\n"
8850 "}",
8851 format("{\n"
8852 "\t/*\n"
8853 "\t * Comment\n"
8854 "\t */\n"
8855 "\t int i;\n"
8856 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008857
8858 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8859 Tab.TabWidth = 8;
8860 Tab.IndentWidth = 8;
8861 EXPECT_EQ("if (aaaaaaaa && // q\n"
8862 " bb) // w\n"
8863 "\t;",
8864 format("if (aaaaaaaa &&// q\n"
8865 "bb)// w\n"
8866 ";",
8867 Tab));
8868 EXPECT_EQ("if (aaa && bbb) // w\n"
8869 "\t;",
8870 format("if(aaa&&bbb)// w\n"
8871 ";",
8872 Tab));
8873 verifyFormat("class X {\n"
8874 "\tvoid f() {\n"
8875 "\t\tsomeFunction(parameter1,\n"
8876 "\t\t\t parameter2);\n"
8877 "\t}\n"
8878 "};",
8879 Tab);
8880 verifyFormat("#define A \\\n"
8881 "\tvoid f() { \\\n"
8882 "\t\tsomeFunction( \\\n"
8883 "\t\t parameter1, \\\n"
8884 "\t\t parameter2); \\\n"
8885 "\t}",
8886 Tab);
8887 Tab.TabWidth = 4;
8888 Tab.IndentWidth = 8;
8889 verifyFormat("class TabWidth4Indent8 {\n"
8890 "\t\tvoid f() {\n"
8891 "\t\t\t\tsomeFunction(parameter1,\n"
8892 "\t\t\t\t\t\t\t parameter2);\n"
8893 "\t\t}\n"
8894 "};",
8895 Tab);
8896 Tab.TabWidth = 4;
8897 Tab.IndentWidth = 4;
8898 verifyFormat("class TabWidth4Indent4 {\n"
8899 "\tvoid f() {\n"
8900 "\t\tsomeFunction(parameter1,\n"
8901 "\t\t\t\t\t parameter2);\n"
8902 "\t}\n"
8903 "};",
8904 Tab);
8905 Tab.TabWidth = 8;
8906 Tab.IndentWidth = 4;
8907 verifyFormat("class TabWidth8Indent4 {\n"
8908 " void f() {\n"
8909 "\tsomeFunction(parameter1,\n"
8910 "\t\t parameter2);\n"
8911 " }\n"
8912 "};",
8913 Tab);
8914 Tab.TabWidth = 8;
8915 Tab.IndentWidth = 8;
8916 EXPECT_EQ("/*\n"
8917 "\t a\t\tcomment\n"
8918 "\t in multiple lines\n"
8919 " */",
8920 format(" /*\t \t \n"
8921 " \t \t a\t\tcomment\t \t\n"
8922 " \t \t in multiple lines\t\n"
8923 " \t */",
8924 Tab));
8925 verifyFormat("{\n"
8926 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8927 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8928 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8929 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8930 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8931 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8932 "};",
8933 Tab);
8934 verifyFormat("enum AA {\n"
8935 "\ta1, // Force multiple lines\n"
8936 "\ta2,\n"
8937 "\ta3\n"
8938 "};",
8939 Tab);
8940 EXPECT_EQ("if (aaaaaaaa && // q\n"
8941 " bb) // w\n"
8942 "\t;",
8943 format("if (aaaaaaaa &&// q\n"
8944 "bb)// w\n"
8945 ";",
8946 Tab));
8947 verifyFormat("class X {\n"
8948 "\tvoid f() {\n"
8949 "\t\tsomeFunction(parameter1,\n"
8950 "\t\t\t parameter2);\n"
8951 "\t}\n"
8952 "};",
8953 Tab);
8954 verifyFormat("{\n"
8955 "\tQ(\n"
8956 "\t {\n"
8957 "\t\t int a;\n"
8958 "\t\t someFunction(aaaaaaaa,\n"
8959 "\t\t\t\t bbbbbbb);\n"
8960 "\t },\n"
8961 "\t p);\n"
8962 "}",
8963 Tab);
8964 EXPECT_EQ("{\n"
8965 "\t/* aaaa\n"
8966 "\t bbbb */\n"
8967 "}",
8968 format("{\n"
8969 "/* aaaa\n"
8970 " bbbb */\n"
8971 "}",
8972 Tab));
8973 EXPECT_EQ("{\n"
8974 "\t/*\n"
8975 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8976 "\t bbbbbbbbbbbbb\n"
8977 "\t*/\n"
8978 "}",
8979 format("{\n"
8980 "/*\n"
8981 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8982 "*/\n"
8983 "}",
8984 Tab));
8985 EXPECT_EQ("{\n"
8986 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8987 "\t// bbbbbbbbbbbbb\n"
8988 "}",
8989 format("{\n"
8990 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8991 "}",
8992 Tab));
8993 EXPECT_EQ("{\n"
8994 "\t/*\n"
8995 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8996 "\t bbbbbbbbbbbbb\n"
8997 "\t*/\n"
8998 "}",
8999 format("{\n"
9000 "\t/*\n"
9001 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9002 "\t*/\n"
9003 "}",
9004 Tab));
9005 EXPECT_EQ("{\n"
9006 "\t/*\n"
9007 "\n"
9008 "\t*/\n"
9009 "}",
9010 format("{\n"
9011 "\t/*\n"
9012 "\n"
9013 "\t*/\n"
9014 "}",
9015 Tab));
9016 EXPECT_EQ("{\n"
9017 "\t/*\n"
9018 " asdf\n"
9019 "\t*/\n"
9020 "}",
9021 format("{\n"
9022 "\t/*\n"
9023 " asdf\n"
9024 "\t*/\n"
9025 "}",
9026 Tab));
9027 EXPECT_EQ("/*\n"
9028 "\t a\t\tcomment\n"
9029 "\t in multiple lines\n"
9030 " */",
9031 format(" /*\t \t \n"
9032 " \t \t a\t\tcomment\t \t\n"
9033 " \t \t in multiple lines\t\n"
9034 " \t */",
9035 Tab));
9036 EXPECT_EQ("/* some\n"
9037 " comment */",
9038 format(" \t \t /* some\n"
9039 " \t \t comment */",
9040 Tab));
9041 EXPECT_EQ("int a; /* some\n"
9042 " comment */",
9043 format(" \t \t int a; /* some\n"
9044 " \t \t comment */",
9045 Tab));
9046 EXPECT_EQ("int a; /* some\n"
9047 "comment */",
9048 format(" \t \t int\ta; /* some\n"
9049 " \t \t comment */",
9050 Tab));
9051 EXPECT_EQ("f(\"\t\t\"); /* some\n"
9052 " comment */",
9053 format(" \t \t f(\"\t\t\"); /* some\n"
9054 " \t \t comment */",
9055 Tab));
9056 EXPECT_EQ("{\n"
9057 " /*\n"
9058 " * Comment\n"
9059 " */\n"
9060 " int i;\n"
9061 "}",
9062 format("{\n"
9063 "\t/*\n"
9064 "\t * Comment\n"
9065 "\t */\n"
9066 "\t int i;\n"
9067 "}"));
9068 Tab.AlignConsecutiveAssignments = true;
9069 Tab.AlignConsecutiveDeclarations = true;
9070 Tab.TabWidth = 4;
9071 Tab.IndentWidth = 4;
9072 verifyFormat("class Assign {\n"
9073 "\tvoid f() {\n"
9074 "\t\tint x = 123;\n"
9075 "\t\tint random = 4;\n"
9076 "\t\tstd::string alphabet =\n"
9077 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
9078 "\t}\n"
9079 "};",
9080 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00009081}
9082
Alexander Kornienko917f9e02013-09-10 12:29:48 +00009083TEST_F(FormatTest, CalculatesOriginalColumn) {
9084 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9085 "q\"; /* some\n"
9086 " comment */",
9087 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9088 "q\"; /* some\n"
9089 " comment */",
9090 getLLVMStyle()));
9091 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9092 "/* some\n"
9093 " comment */",
9094 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9095 " /* some\n"
9096 " comment */",
9097 getLLVMStyle()));
9098 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9099 "qqq\n"
9100 "/* some\n"
9101 " comment */",
9102 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9103 "qqq\n"
9104 " /* some\n"
9105 " comment */",
9106 getLLVMStyle()));
9107 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9108 "wwww; /* some\n"
9109 " comment */",
9110 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9111 "wwww; /* some\n"
9112 " comment */",
9113 getLLVMStyle()));
9114}
9115
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009116TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00009117 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009118 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009119
9120 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009121 " continue;",
9122 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009123 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009124 " continue;",
9125 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009126 verifyFormat("if(true)\n"
9127 " f();\n"
9128 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009129 " f();",
9130 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009131 verifyFormat("do {\n"
9132 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009133 "} while(something());",
9134 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009135 verifyFormat("switch(x) {\n"
9136 "default:\n"
9137 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009138 "}",
9139 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00009140 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00009141 verifyFormat("size_t x = sizeof(x);", NoSpace);
9142 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
9143 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
9144 verifyFormat("alignas(128) char a[128];", NoSpace);
9145 verifyFormat("size_t x = alignof(MyType);", NoSpace);
9146 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
9147 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009148 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009149 verifyFormat("T A::operator()();", NoSpace);
9150 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009151
9152 FormatStyle Space = getLLVMStyle();
9153 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
9154
9155 verifyFormat("int f ();", Space);
9156 verifyFormat("void f (int a, T b) {\n"
9157 " while (true)\n"
9158 " continue;\n"
9159 "}",
9160 Space);
9161 verifyFormat("if (true)\n"
9162 " f ();\n"
9163 "else if (true)\n"
9164 " f ();",
9165 Space);
9166 verifyFormat("do {\n"
9167 " do_something ();\n"
9168 "} while (something ());",
9169 Space);
9170 verifyFormat("switch (x) {\n"
9171 "default:\n"
9172 " break;\n"
9173 "}",
9174 Space);
9175 verifyFormat("A::A () : a (1) {}", Space);
9176 verifyFormat("void f () __attribute__ ((asdf));", Space);
9177 verifyFormat("*(&a + 1);\n"
9178 "&((&a)[1]);\n"
9179 "a[(b + c) * d];\n"
9180 "(((a + 1) * 2) + 3) * 4;",
9181 Space);
9182 verifyFormat("#define A(x) x", Space);
9183 verifyFormat("#define A (x) x", Space);
9184 verifyFormat("#if defined(x)\n"
9185 "#endif",
9186 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00009187 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00009188 verifyFormat("size_t x = sizeof (x);", Space);
9189 verifyFormat("auto f (int x) -> decltype (x);", Space);
9190 verifyFormat("int f (T x) noexcept (x.create ());", Space);
9191 verifyFormat("alignas (128) char a[128];", Space);
9192 verifyFormat("size_t x = alignof (MyType);", Space);
9193 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
9194 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009195 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009196 verifyFormat("T A::operator() ();", Space);
9197 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009198}
9199
9200TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
9201 FormatStyle Spaces = getLLVMStyle();
9202
9203 Spaces.SpacesInParentheses = true;
Daniel Jasperd5e9ff42018-03-22 14:30:28 +00009204 verifyFormat("do_something( ::globalVar );", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009205 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009206 verifyFormat("call();", Spaces);
9207 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009208 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
9209 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009210 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009211 " continue;",
9212 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009213 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009214 " continue;",
9215 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009216 verifyFormat("if ( true )\n"
9217 " f();\n"
9218 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009219 " f();",
9220 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009221 verifyFormat("do {\n"
9222 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009223 "} while ( something() );",
9224 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009225 verifyFormat("switch ( x ) {\n"
9226 "default:\n"
9227 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009228 "}",
9229 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009230
9231 Spaces.SpacesInParentheses = false;
9232 Spaces.SpacesInCStyleCastParentheses = true;
9233 verifyFormat("Type *A = ( Type * )P;", Spaces);
9234 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9235 verifyFormat("x = ( int32 )y;", Spaces);
9236 verifyFormat("int a = ( int )(2.0f);", Spaces);
9237 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9238 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9239 verifyFormat("#define x (( int )-1)", Spaces);
9240
Daniel Jasper92e09822015-03-18 12:59:19 +00009241 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00009242 Spaces.SpacesInParentheses = false;
9243 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009244 Spaces.SpacesInCStyleCastParentheses = true;
9245 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009246 verifyFormat("call( );", Spaces);
9247 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009248 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009249 " continue;",
9250 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009251 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009252 " continue;",
9253 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009254 verifyFormat("if (true)\n"
9255 " f( );\n"
9256 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009257 " f( );",
9258 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009259 verifyFormat("do {\n"
9260 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009261 "} while (something( ));",
9262 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009263 verifyFormat("switch (x) {\n"
9264 "default:\n"
9265 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009266 "}",
9267 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009268
Daniel Jasper92e09822015-03-18 12:59:19 +00009269 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009270 Spaces.SpaceAfterCStyleCast = true;
9271 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009272 verifyFormat("call( );", Spaces);
9273 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009274 verifyFormat("while (( bool ) 1)\n"
9275 " continue;",
9276 Spaces);
9277 verifyFormat("for (;;)\n"
9278 " continue;",
9279 Spaces);
9280 verifyFormat("if (true)\n"
9281 " f( );\n"
9282 "else if (true)\n"
9283 " f( );",
9284 Spaces);
9285 verifyFormat("do {\n"
9286 " do_something(( int ) i);\n"
9287 "} while (something( ));",
9288 Spaces);
9289 verifyFormat("switch (x) {\n"
9290 "default:\n"
9291 " break;\n"
9292 "}",
9293 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009294
9295 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009296 Spaces.SpacesInCStyleCastParentheses = false;
9297 Spaces.SpaceAfterCStyleCast = true;
9298 verifyFormat("while ((bool) 1)\n"
9299 " continue;",
9300 Spaces);
9301 verifyFormat("do {\n"
9302 " do_something((int) i);\n"
9303 "} while (something( ));",
9304 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009305}
9306
Daniel Jasperad981f82014-08-26 11:41:14 +00009307TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9308 verifyFormat("int a[5];");
9309 verifyFormat("a[3] += 42;");
9310
9311 FormatStyle Spaces = getLLVMStyle();
9312 Spaces.SpacesInSquareBrackets = true;
9313 // Lambdas unchanged.
9314 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9315 verifyFormat("return [i, args...] {};", Spaces);
9316
9317 // Not lambdas.
9318 verifyFormat("int a[ 5 ];", Spaces);
9319 verifyFormat("a[ 3 ] += 42;", Spaces);
9320 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9321 verifyFormat("double &operator[](int i) { return 0; }\n"
9322 "int i;",
9323 Spaces);
9324 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9325 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9326 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9327}
9328
Daniel Jasperd94bff32013-09-25 15:15:02 +00009329TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9330 verifyFormat("int a = 5;");
9331 verifyFormat("a += 42;");
9332 verifyFormat("a or_eq 8;");
9333
9334 FormatStyle Spaces = getLLVMStyle();
9335 Spaces.SpaceBeforeAssignmentOperators = false;
9336 verifyFormat("int a= 5;", Spaces);
9337 verifyFormat("a+= 42;", Spaces);
9338 verifyFormat("a or_eq 8;", Spaces);
9339}
9340
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009341TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
9342 verifyFormat("class Foo : public Bar {};");
9343 verifyFormat("Foo::Foo() : foo(1) {}");
9344 verifyFormat("for (auto a : b) {\n}");
9345 verifyFormat("int x = a ? b : c;");
9346 verifyFormat("{\n"
9347 "label0:\n"
9348 " int x = 0;\n"
9349 "}");
9350 verifyFormat("switch (x) {\n"
9351 "case 1:\n"
9352 "default:\n"
9353 "}");
9354
9355 FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
9356 CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
9357 verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
9358 verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
9359 verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
9360 verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
9361 verifyFormat("{\n"
9362 "label1:\n"
9363 " int x = 0;\n"
9364 "}",
9365 CtorInitializerStyle);
9366 verifyFormat("switch (x) {\n"
9367 "case 1:\n"
9368 "default:\n"
9369 "}",
9370 CtorInitializerStyle);
9371 CtorInitializerStyle.BreakConstructorInitializers =
9372 FormatStyle::BCIS_AfterColon;
9373 verifyFormat("Fooooooooooo::Fooooooooooo():\n"
9374 " aaaaaaaaaaaaaaaa(1),\n"
9375 " bbbbbbbbbbbbbbbb(2) {}",
9376 CtorInitializerStyle);
9377 CtorInitializerStyle.BreakConstructorInitializers =
9378 FormatStyle::BCIS_BeforeComma;
9379 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9380 " : aaaaaaaaaaaaaaaa(1)\n"
9381 " , bbbbbbbbbbbbbbbb(2) {}",
9382 CtorInitializerStyle);
9383 CtorInitializerStyle.BreakConstructorInitializers =
9384 FormatStyle::BCIS_BeforeColon;
9385 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9386 " : aaaaaaaaaaaaaaaa(1),\n"
9387 " bbbbbbbbbbbbbbbb(2) {}",
9388 CtorInitializerStyle);
9389 CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
9390 verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9391 ": aaaaaaaaaaaaaaaa(1),\n"
9392 " bbbbbbbbbbbbbbbb(2) {}",
9393 CtorInitializerStyle);
9394
Francois Ferrand6bb103f2018-06-11 14:41:26 +00009395 FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009396 InheritanceStyle.SpaceBeforeInheritanceColon = false;
9397 verifyFormat("class Foo: public Bar {};", InheritanceStyle);
9398 verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
9399 verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
9400 verifyFormat("int x = a ? b : c;", InheritanceStyle);
9401 verifyFormat("{\n"
9402 "label2:\n"
9403 " int x = 0;\n"
9404 "}",
9405 InheritanceStyle);
9406 verifyFormat("switch (x) {\n"
9407 "case 1:\n"
9408 "default:\n"
9409 "}",
9410 InheritanceStyle);
Francois Ferrand6bb103f2018-06-11 14:41:26 +00009411 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
9412 verifyFormat("class Foooooooooooooooooooooo:\n"
9413 " public aaaaaaaaaaaaaaaaaa,\n"
9414 " public bbbbbbbbbbbbbbbbbb {\n"
9415 "}",
9416 InheritanceStyle);
9417 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
9418 verifyFormat("class Foooooooooooooooooooooo\n"
9419 " : public aaaaaaaaaaaaaaaaaa\n"
9420 " , public bbbbbbbbbbbbbbbbbb {\n"
9421 "}",
9422 InheritanceStyle);
9423 InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
9424 verifyFormat("class Foooooooooooooooooooooo\n"
9425 " : public aaaaaaaaaaaaaaaaaa,\n"
9426 " public bbbbbbbbbbbbbbbbbb {\n"
9427 "}",
9428 InheritanceStyle);
9429 InheritanceStyle.ConstructorInitializerIndentWidth = 0;
9430 verifyFormat("class Foooooooooooooooooooooo\n"
9431 ": public aaaaaaaaaaaaaaaaaa,\n"
9432 " public bbbbbbbbbbbbbbbbbb {}",
9433 InheritanceStyle);
Francois Ferrand2a9ea782018-03-01 10:09:13 +00009434
9435 FormatStyle ForLoopStyle = getLLVMStyle();
9436 ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
9437 verifyFormat("class Foo : public Bar {};", ForLoopStyle);
9438 verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
9439 verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
9440 verifyFormat("int x = a ? b : c;", ForLoopStyle);
9441 verifyFormat("{\n"
9442 "label2:\n"
9443 " int x = 0;\n"
9444 "}",
9445 ForLoopStyle);
9446 verifyFormat("switch (x) {\n"
9447 "case 1:\n"
9448 "default:\n"
9449 "}",
9450 ForLoopStyle);
9451
9452 FormatStyle NoSpaceStyle = getLLVMStyle();
9453 NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
9454 NoSpaceStyle.SpaceBeforeInheritanceColon = false;
9455 NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
9456 verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
9457 verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
9458 verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
9459 verifyFormat("int x = a ? b : c;", NoSpaceStyle);
9460 verifyFormat("{\n"
9461 "label3:\n"
9462 " int x = 0;\n"
9463 "}",
9464 NoSpaceStyle);
9465 verifyFormat("switch (x) {\n"
9466 "case 1:\n"
9467 "default:\n"
9468 "}",
9469 NoSpaceStyle);
9470}
9471
Daniel Jaspera44991332015-04-29 13:06:49 +00009472TEST_F(FormatTest, AlignConsecutiveAssignments) {
9473 FormatStyle Alignment = getLLVMStyle();
9474 Alignment.AlignConsecutiveAssignments = false;
9475 verifyFormat("int a = 5;\n"
9476 "int oneTwoThree = 123;",
9477 Alignment);
9478 verifyFormat("int a = 5;\n"
9479 "int oneTwoThree = 123;",
9480 Alignment);
9481
9482 Alignment.AlignConsecutiveAssignments = true;
9483 verifyFormat("int a = 5;\n"
9484 "int oneTwoThree = 123;",
9485 Alignment);
9486 verifyFormat("int a = method();\n"
9487 "int oneTwoThree = 133;",
9488 Alignment);
9489 verifyFormat("a &= 5;\n"
9490 "bcd *= 5;\n"
9491 "ghtyf += 5;\n"
9492 "dvfvdb -= 5;\n"
9493 "a /= 5;\n"
9494 "vdsvsv %= 5;\n"
9495 "sfdbddfbdfbb ^= 5;\n"
9496 "dvsdsv |= 5;\n"
9497 "int dsvvdvsdvvv = 123;",
9498 Alignment);
9499 verifyFormat("int i = 1, j = 10;\n"
9500 "something = 2000;",
9501 Alignment);
9502 verifyFormat("something = 2000;\n"
9503 "int i = 1, j = 10;\n",
9504 Alignment);
9505 verifyFormat("something = 2000;\n"
9506 "another = 911;\n"
9507 "int i = 1, j = 10;\n"
9508 "oneMore = 1;\n"
9509 "i = 2;",
9510 Alignment);
9511 verifyFormat("int a = 5;\n"
9512 "int one = 1;\n"
9513 "method();\n"
9514 "int oneTwoThree = 123;\n"
9515 "int oneTwo = 12;",
9516 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009517 verifyFormat("int oneTwoThree = 123;\n"
9518 "int oneTwo = 12;\n"
9519 "method();\n",
9520 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009521 verifyFormat("int oneTwoThree = 123; // comment\n"
9522 "int oneTwo = 12; // comment",
9523 Alignment);
9524 EXPECT_EQ("int a = 5;\n"
9525 "\n"
9526 "int oneTwoThree = 123;",
9527 format("int a = 5;\n"
9528 "\n"
9529 "int oneTwoThree= 123;",
9530 Alignment));
9531 EXPECT_EQ("int a = 5;\n"
9532 "int one = 1;\n"
9533 "\n"
9534 "int oneTwoThree = 123;",
9535 format("int a = 5;\n"
9536 "int one = 1;\n"
9537 "\n"
9538 "int oneTwoThree = 123;",
9539 Alignment));
9540 EXPECT_EQ("int a = 5;\n"
9541 "int one = 1;\n"
9542 "\n"
9543 "int oneTwoThree = 123;\n"
9544 "int oneTwo = 12;",
9545 format("int a = 5;\n"
9546 "int one = 1;\n"
9547 "\n"
9548 "int oneTwoThree = 123;\n"
9549 "int oneTwo = 12;",
9550 Alignment));
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009551 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9552 verifyFormat("#define A \\\n"
9553 " int aaaa = 12; \\\n"
9554 " int b = 23; \\\n"
9555 " int ccc = 234; \\\n"
9556 " int dddddddddd = 2345;",
9557 Alignment);
9558 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspera44991332015-04-29 13:06:49 +00009559 verifyFormat("#define A \\\n"
9560 " int aaaa = 12; \\\n"
9561 " int b = 23; \\\n"
9562 " int ccc = 234; \\\n"
9563 " int dddddddddd = 2345;",
9564 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009565 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspera44991332015-04-29 13:06:49 +00009566 verifyFormat("#define A "
9567 " \\\n"
9568 " int aaaa = 12; "
9569 " \\\n"
9570 " int b = 23; "
9571 " \\\n"
9572 " int ccc = 234; "
9573 " \\\n"
9574 " int dddddddddd = 2345;",
9575 Alignment);
9576 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9577 "k = 4, int l = 5,\n"
9578 " int m = 6) {\n"
9579 " int j = 10;\n"
9580 " otherThing = 1;\n"
9581 "}",
9582 Alignment);
9583 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9584 " int i = 1;\n"
9585 " int j = 2;\n"
9586 " int big = 10000;\n"
9587 "}",
9588 Alignment);
9589 verifyFormat("class C {\n"
9590 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009591 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009592 " virtual void f() = 0;\n"
9593 "};",
9594 Alignment);
9595 verifyFormat("int i = 1;\n"
9596 "if (SomeType t = getSomething()) {\n"
9597 "}\n"
9598 "int j = 2;\n"
9599 "int big = 10000;",
9600 Alignment);
9601 verifyFormat("int j = 7;\n"
9602 "for (int k = 0; k < N; ++k) {\n"
9603 "}\n"
9604 "int j = 2;\n"
9605 "int big = 10000;\n"
9606 "}",
9607 Alignment);
9608 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9609 verifyFormat("int i = 1;\n"
9610 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9611 " = someLooooooooooooooooongFunction();\n"
9612 "int j = 2;",
9613 Alignment);
9614 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9615 verifyFormat("int i = 1;\n"
9616 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9617 " someLooooooooooooooooongFunction();\n"
9618 "int j = 2;",
9619 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009620
9621 verifyFormat("auto lambda = []() {\n"
9622 " auto i = 0;\n"
9623 " return 0;\n"
9624 "};\n"
9625 "int i = 0;\n"
9626 "auto v = type{\n"
9627 " i = 1, //\n"
9628 " (i = 2), //\n"
9629 " i = 3 //\n"
9630 "};",
9631 Alignment);
9632
Daniel Jaspera44991332015-04-29 13:06:49 +00009633 verifyFormat(
9634 "int i = 1;\n"
9635 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9636 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009637 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00009638 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009639
9640 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9641 " typename B = very_long_type_name_1,\n"
9642 " typename T_2 = very_long_type_name_2>\n"
9643 "auto foo() {}\n",
9644 Alignment);
9645 verifyFormat("int a, b = 1;\n"
9646 "int c = 2;\n"
9647 "int dd = 3;\n",
9648 Alignment);
9649 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9650 "float b[1][] = {{3.f}};\n",
9651 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009652 verifyFormat("for (int i = 0; i < 1; i++)\n"
9653 " int x = 1;\n",
9654 Alignment);
9655 verifyFormat("for (i = 0; i < 1; i++)\n"
9656 " x = 1;\n"
9657 "y = 1;\n",
9658 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009659}
9660
Daniel Jaspere12597c2015-10-01 10:06:54 +00009661TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9662 FormatStyle Alignment = getLLVMStyle();
9663 Alignment.AlignConsecutiveDeclarations = false;
9664 verifyFormat("float const a = 5;\n"
9665 "int oneTwoThree = 123;",
9666 Alignment);
9667 verifyFormat("int a = 5;\n"
9668 "float const oneTwoThree = 123;",
9669 Alignment);
9670
9671 Alignment.AlignConsecutiveDeclarations = true;
9672 verifyFormat("float const a = 5;\n"
9673 "int oneTwoThree = 123;",
9674 Alignment);
9675 verifyFormat("int a = method();\n"
9676 "float const oneTwoThree = 133;",
9677 Alignment);
9678 verifyFormat("int i = 1, j = 10;\n"
9679 "something = 2000;",
9680 Alignment);
9681 verifyFormat("something = 2000;\n"
9682 "int i = 1, j = 10;\n",
9683 Alignment);
9684 verifyFormat("float something = 2000;\n"
9685 "double another = 911;\n"
9686 "int i = 1, j = 10;\n"
9687 "const int *oneMore = 1;\n"
9688 "unsigned i = 2;",
9689 Alignment);
9690 verifyFormat("float a = 5;\n"
9691 "int one = 1;\n"
9692 "method();\n"
9693 "const double oneTwoThree = 123;\n"
9694 "const unsigned int oneTwo = 12;",
9695 Alignment);
9696 verifyFormat("int oneTwoThree{0}; // comment\n"
9697 "unsigned oneTwo; // comment",
9698 Alignment);
9699 EXPECT_EQ("float const a = 5;\n"
9700 "\n"
9701 "int oneTwoThree = 123;",
9702 format("float const a = 5;\n"
9703 "\n"
9704 "int oneTwoThree= 123;",
9705 Alignment));
9706 EXPECT_EQ("float a = 5;\n"
9707 "int one = 1;\n"
9708 "\n"
9709 "unsigned oneTwoThree = 123;",
9710 format("float a = 5;\n"
9711 "int one = 1;\n"
9712 "\n"
9713 "unsigned oneTwoThree = 123;",
9714 Alignment));
9715 EXPECT_EQ("float a = 5;\n"
9716 "int one = 1;\n"
9717 "\n"
9718 "unsigned oneTwoThree = 123;\n"
9719 "int oneTwo = 12;",
9720 format("float a = 5;\n"
9721 "int one = 1;\n"
9722 "\n"
9723 "unsigned oneTwoThree = 123;\n"
9724 "int oneTwo = 12;",
9725 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009726 // Function prototype alignment
9727 verifyFormat("int a();\n"
9728 "double b();",
9729 Alignment);
9730 verifyFormat("int a(int x);\n"
9731 "double b();",
9732 Alignment);
9733 unsigned OldColumnLimit = Alignment.ColumnLimit;
9734 // We need to set ColumnLimit to zero, in order to stress nested alignments,
9735 // otherwise the function parameters will be re-flowed onto a single line.
9736 Alignment.ColumnLimit = 0;
9737 EXPECT_EQ("int a(int x,\n"
9738 " float y);\n"
9739 "double b(int x,\n"
9740 " double y);",
9741 format("int a(int x,\n"
9742 " float y);\n"
9743 "double b(int x,\n"
9744 " double y);",
9745 Alignment));
9746 // This ensures that function parameters of function declarations are
9747 // correctly indented when their owning functions are indented.
9748 // The failure case here is for 'double y' to not be indented enough.
9749 EXPECT_EQ("double a(int x);\n"
9750 "int b(int y,\n"
9751 " double z);",
9752 format("double a(int x);\n"
9753 "int b(int y,\n"
9754 " double z);",
9755 Alignment));
9756 // Set ColumnLimit low so that we induce wrapping immediately after
9757 // the function name and opening paren.
9758 Alignment.ColumnLimit = 13;
9759 verifyFormat("int function(\n"
9760 " int x,\n"
9761 " bool y);",
9762 Alignment);
9763 Alignment.ColumnLimit = OldColumnLimit;
9764 // Ensure function pointers don't screw up recursive alignment
9765 verifyFormat("int a(int x, void (*fp)(int y));\n"
9766 "double b();",
9767 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009768 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009769 // Ensure recursive alignment is broken by function braces, so that the
9770 // "a = 1" does not align with subsequent assignments inside the function
9771 // body.
9772 verifyFormat("int func(int a = 1) {\n"
9773 " int b = 2;\n"
9774 " int cc = 3;\n"
9775 "}",
9776 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009777 verifyFormat("float something = 2000;\n"
9778 "double another = 911;\n"
9779 "int i = 1, j = 10;\n"
9780 "const int *oneMore = 1;\n"
9781 "unsigned i = 2;",
9782 Alignment);
9783 verifyFormat("int oneTwoThree = {0}; // comment\n"
9784 "unsigned oneTwo = 0; // comment",
9785 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009786 // Make sure that scope is correctly tracked, in the absence of braces
9787 verifyFormat("for (int i = 0; i < n; i++)\n"
9788 " j = i;\n"
9789 "double x = 1;\n",
9790 Alignment);
9791 verifyFormat("if (int i = 0)\n"
9792 " j = i;\n"
9793 "double x = 1;\n",
9794 Alignment);
9795 // Ensure operator[] and operator() are comprehended
9796 verifyFormat("struct test {\n"
9797 " long long int foo();\n"
9798 " int operator[](int a);\n"
9799 " double bar();\n"
9800 "};\n",
9801 Alignment);
9802 verifyFormat("struct test {\n"
9803 " long long int foo();\n"
9804 " int operator()(int a);\n"
9805 " double bar();\n"
9806 "};\n",
9807 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009808 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9809 " int const i = 1;\n"
9810 " int * j = 2;\n"
9811 " int big = 10000;\n"
9812 "\n"
9813 " unsigned oneTwoThree = 123;\n"
9814 " int oneTwo = 12;\n"
9815 " method();\n"
9816 " float k = 2;\n"
9817 " int ll = 10000;\n"
9818 "}",
9819 format("void SomeFunction(int parameter= 0) {\n"
9820 " int const i= 1;\n"
9821 " int *j=2;\n"
9822 " int big = 10000;\n"
9823 "\n"
9824 "unsigned oneTwoThree =123;\n"
9825 "int oneTwo = 12;\n"
9826 " method();\n"
9827 "float k= 2;\n"
9828 "int ll=10000;\n"
9829 "}",
9830 Alignment));
9831 Alignment.AlignConsecutiveAssignments = false;
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009832 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9833 verifyFormat("#define A \\\n"
9834 " int aaaa = 12; \\\n"
9835 " float b = 23; \\\n"
9836 " const int ccc = 234; \\\n"
9837 " unsigned dddddddddd = 2345;",
9838 Alignment);
9839 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009840 verifyFormat("#define A \\\n"
9841 " int aaaa = 12; \\\n"
9842 " float b = 23; \\\n"
9843 " const int ccc = 234; \\\n"
9844 " unsigned dddddddddd = 2345;",
9845 Alignment);
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +00009846 Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009847 Alignment.ColumnLimit = 30;
9848 verifyFormat("#define A \\\n"
9849 " int aaaa = 12; \\\n"
9850 " float b = 23; \\\n"
9851 " const int ccc = 234; \\\n"
9852 " int dddddddddd = 2345;",
9853 Alignment);
9854 Alignment.ColumnLimit = 80;
9855 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9856 "k = 4, int l = 5,\n"
9857 " int m = 6) {\n"
9858 " const int j = 10;\n"
9859 " otherThing = 1;\n"
9860 "}",
9861 Alignment);
9862 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9863 " int const i = 1;\n"
9864 " int * j = 2;\n"
9865 " int big = 10000;\n"
9866 "}",
9867 Alignment);
9868 verifyFormat("class C {\n"
9869 "public:\n"
9870 " int i = 1;\n"
9871 " virtual void f() = 0;\n"
9872 "};",
9873 Alignment);
9874 verifyFormat("float i = 1;\n"
9875 "if (SomeType t = getSomething()) {\n"
9876 "}\n"
9877 "const unsigned j = 2;\n"
9878 "int big = 10000;",
9879 Alignment);
9880 verifyFormat("float j = 7;\n"
9881 "for (int k = 0; k < N; ++k) {\n"
9882 "}\n"
9883 "unsigned j = 2;\n"
9884 "int big = 10000;\n"
9885 "}",
9886 Alignment);
9887 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9888 verifyFormat("float i = 1;\n"
9889 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9890 " = someLooooooooooooooooongFunction();\n"
9891 "int j = 2;",
9892 Alignment);
9893 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9894 verifyFormat("int i = 1;\n"
9895 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9896 " someLooooooooooooooooongFunction();\n"
9897 "int j = 2;",
9898 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009899
9900 Alignment.AlignConsecutiveAssignments = true;
9901 verifyFormat("auto lambda = []() {\n"
9902 " auto ii = 0;\n"
9903 " float j = 0;\n"
9904 " return 0;\n"
9905 "};\n"
9906 "int i = 0;\n"
9907 "float i2 = 0;\n"
9908 "auto v = type{\n"
9909 " i = 1, //\n"
9910 " (i = 2), //\n"
9911 " i = 3 //\n"
9912 "};",
9913 Alignment);
9914 Alignment.AlignConsecutiveAssignments = false;
9915
Daniel Jaspere12597c2015-10-01 10:06:54 +00009916 verifyFormat(
9917 "int i = 1;\n"
9918 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9919 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009920 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00009921 Alignment);
9922
9923 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9924 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00009925 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00009926 // happens.
9927 Alignment.AlignConsecutiveAssignments = true;
9928 Alignment.ColumnLimit = 30;
9929 verifyFormat("float ii = 1;\n"
9930 "unsigned j = 2;\n"
9931 "int someVerylongVariable = 1;\n"
9932 "AnotherLongType ll = 123456;\n"
9933 "VeryVeryLongType k = 2;\n"
9934 "int myvar = 1;",
9935 Alignment);
9936 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009937 Alignment.AlignConsecutiveAssignments = false;
9938
9939 verifyFormat(
9940 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9941 " typename LongType, typename B>\n"
9942 "auto foo() {}\n",
9943 Alignment);
9944 verifyFormat("float a, b = 1;\n"
9945 "int c = 2;\n"
9946 "int dd = 3;\n",
9947 Alignment);
9948 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9949 "float b[1][] = {{3.f}};\n",
9950 Alignment);
9951 Alignment.AlignConsecutiveAssignments = true;
9952 verifyFormat("float a, b = 1;\n"
9953 "int c = 2;\n"
9954 "int dd = 3;\n",
9955 Alignment);
9956 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9957 "float b[1][] = {{3.f}};\n",
9958 Alignment);
9959 Alignment.AlignConsecutiveAssignments = false;
9960
9961 Alignment.ColumnLimit = 30;
9962 Alignment.BinPackParameters = false;
9963 verifyFormat("void foo(float a,\n"
9964 " float b,\n"
9965 " int c,\n"
9966 " uint32_t *d) {\n"
9967 " int * e = 0;\n"
9968 " float f = 0;\n"
9969 " double g = 0;\n"
9970 "}\n"
9971 "void bar(ino_t a,\n"
9972 " int b,\n"
9973 " uint32_t *c,\n"
9974 " bool d) {}\n",
9975 Alignment);
9976 Alignment.BinPackParameters = true;
9977 Alignment.ColumnLimit = 80;
Daniel Jasper4917af62017-08-25 19:14:53 +00009978
9979 // Bug 33507
9980 Alignment.PointerAlignment = FormatStyle::PAS_Middle;
9981 verifyFormat(
9982 "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
9983 " static const Version verVs2017;\n"
9984 " return true;\n"
9985 "});\n",
9986 Alignment);
9987 Alignment.PointerAlignment = FormatStyle::PAS_Right;
Ilya Biryukovf16a6fa2018-08-01 15:32:56 +00009988
9989 // See llvm.org/PR35641
9990 Alignment.AlignConsecutiveDeclarations = true;
9991 verifyFormat("int func() { //\n"
9992 " int b;\n"
9993 " unsigned c;\n"
9994 "}",
9995 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009996}
9997
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009998TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009999 FormatStyle LinuxBraceStyle = getLLVMStyle();
10000 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010001 verifyFormat("namespace a\n"
10002 "{\n"
10003 "class A\n"
10004 "{\n"
10005 " void f()\n"
10006 " {\n"
10007 " if (true) {\n"
10008 " a();\n"
10009 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +000010010 " } else {\n"
10011 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010012 " }\n"
10013 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +000010014 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010015 "};\n"
10016 "struct B {\n"
10017 " int x;\n"
10018 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010019 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010020 LinuxBraceStyle);
10021 verifyFormat("enum X {\n"
10022 " Y = 0,\n"
10023 "}\n",
10024 LinuxBraceStyle);
10025 verifyFormat("struct S {\n"
10026 " int Type;\n"
10027 " union {\n"
10028 " int x;\n"
10029 " double y;\n"
10030 " } Value;\n"
10031 " class C\n"
10032 " {\n"
10033 " MyFavoriteType Value;\n"
10034 " } Class;\n"
10035 "}\n",
10036 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010037}
10038
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010039TEST_F(FormatTest, MozillaBraceBreaking) {
10040 FormatStyle MozillaBraceStyle = getLLVMStyle();
10041 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010042 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010043 verifyFormat("namespace a {\n"
10044 "class A\n"
10045 "{\n"
10046 " void f()\n"
10047 " {\n"
10048 " if (true) {\n"
10049 " a();\n"
10050 " b();\n"
10051 " }\n"
10052 " }\n"
10053 " void g() { return; }\n"
10054 "};\n"
10055 "enum E\n"
10056 "{\n"
10057 " A,\n"
10058 " // foo\n"
10059 " B,\n"
10060 " C\n"
10061 "};\n"
10062 "struct B\n"
10063 "{\n"
10064 " int x;\n"
10065 "};\n"
10066 "}\n",
10067 MozillaBraceStyle);
10068 verifyFormat("struct S\n"
10069 "{\n"
10070 " int Type;\n"
10071 " union\n"
10072 " {\n"
10073 " int x;\n"
10074 " double y;\n"
10075 " } Value;\n"
10076 " class C\n"
10077 " {\n"
10078 " MyFavoriteType Value;\n"
10079 " } Class;\n"
10080 "}\n",
10081 MozillaBraceStyle);
10082}
10083
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010084TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010085 FormatStyle StroustrupBraceStyle = getLLVMStyle();
10086 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010087 verifyFormat("namespace a {\n"
10088 "class A {\n"
10089 " void f()\n"
10090 " {\n"
10091 " if (true) {\n"
10092 " a();\n"
10093 " b();\n"
10094 " }\n"
10095 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +000010096 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010097 "};\n"
10098 "struct B {\n"
10099 " int x;\n"
10100 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +000010101 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010102 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010103
Daniel Jasperd9670872014-08-05 12:06:20 +000010104 verifyFormat("void foo()\n"
10105 "{\n"
10106 " if (a) {\n"
10107 " a();\n"
10108 " }\n"
10109 " else {\n"
10110 " b();\n"
10111 " }\n"
10112 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010113 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +000010114
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010115 verifyFormat("#ifdef _DEBUG\n"
10116 "int foo(int i = 0)\n"
10117 "#else\n"
10118 "int foo(int i = 5)\n"
10119 "#endif\n"
10120 "{\n"
10121 " return i;\n"
10122 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010123 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010124
10125 verifyFormat("void foo() {}\n"
10126 "void bar()\n"
10127 "#ifdef _DEBUG\n"
10128 "{\n"
10129 " foo();\n"
10130 "}\n"
10131 "#else\n"
10132 "{\n"
10133 "}\n"
10134 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010135 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010136
10137 verifyFormat("void foobar() { int i = 5; }\n"
10138 "#ifdef _DEBUG\n"
10139 "void bar() {}\n"
10140 "#else\n"
10141 "void bar() { foobar(); }\n"
10142 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010143 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010144}
10145
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010146TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010147 FormatStyle AllmanBraceStyle = getLLVMStyle();
10148 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010149
10150 EXPECT_EQ("namespace a\n"
10151 "{\n"
10152 "void f();\n"
10153 "void g();\n"
10154 "} // namespace a\n",
10155 format("namespace a\n"
10156 "{\n"
10157 "void f();\n"
10158 "void g();\n"
10159 "}\n",
10160 AllmanBraceStyle));
10161
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010162 verifyFormat("namespace a\n"
10163 "{\n"
10164 "class A\n"
10165 "{\n"
10166 " void f()\n"
10167 " {\n"
10168 " if (true)\n"
10169 " {\n"
10170 " a();\n"
10171 " b();\n"
10172 " }\n"
10173 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +000010174 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010175 "};\n"
10176 "struct B\n"
10177 "{\n"
10178 " int x;\n"
10179 "};\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010180 "} // namespace a",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010181 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010182
10183 verifyFormat("void f()\n"
10184 "{\n"
10185 " if (true)\n"
10186 " {\n"
10187 " a();\n"
10188 " }\n"
10189 " else if (false)\n"
10190 " {\n"
10191 " b();\n"
10192 " }\n"
10193 " else\n"
10194 " {\n"
10195 " c();\n"
10196 " }\n"
10197 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010198 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010199
10200 verifyFormat("void f()\n"
10201 "{\n"
10202 " for (int i = 0; i < 10; ++i)\n"
10203 " {\n"
10204 " a();\n"
10205 " }\n"
10206 " while (false)\n"
10207 " {\n"
10208 " b();\n"
10209 " }\n"
10210 " do\n"
10211 " {\n"
10212 " c();\n"
10213 " } while (false)\n"
10214 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010215 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010216
10217 verifyFormat("void f(int a)\n"
10218 "{\n"
10219 " switch (a)\n"
10220 " {\n"
10221 " case 0:\n"
10222 " break;\n"
10223 " case 1:\n"
10224 " {\n"
10225 " break;\n"
10226 " }\n"
10227 " case 2:\n"
10228 " {\n"
10229 " }\n"
10230 " break;\n"
10231 " default:\n"
10232 " break;\n"
10233 " }\n"
10234 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010235 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +000010236
10237 verifyFormat("enum X\n"
10238 "{\n"
10239 " Y = 0,\n"
10240 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010241 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +000010242 verifyFormat("enum X\n"
10243 "{\n"
10244 " Y = 0\n"
10245 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010246 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +000010247
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010248 verifyFormat("@interface BSApplicationController ()\n"
10249 "{\n"
10250 "@private\n"
10251 " id _extraIvar;\n"
10252 "}\n"
10253 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010254 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010255
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010256 verifyFormat("#ifdef _DEBUG\n"
10257 "int foo(int i = 0)\n"
10258 "#else\n"
10259 "int foo(int i = 5)\n"
10260 "#endif\n"
10261 "{\n"
10262 " return i;\n"
10263 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010264 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010265
10266 verifyFormat("void foo() {}\n"
10267 "void bar()\n"
10268 "#ifdef _DEBUG\n"
10269 "{\n"
10270 " foo();\n"
10271 "}\n"
10272 "#else\n"
10273 "{\n"
10274 "}\n"
10275 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010276 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010277
10278 verifyFormat("void foobar() { int i = 5; }\n"
10279 "#ifdef _DEBUG\n"
10280 "void bar() {}\n"
10281 "#else\n"
10282 "void bar() { foobar(); }\n"
10283 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010284 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010285
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010286 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010287 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010288 " // ...\n"
10289 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010290 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010291 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010292 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010293 " // ...\n"
10294 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010295 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010296 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010297 // .. or dict literals.
10298 verifyFormat("void f()\n"
10299 "{\n"
Alexander Kornienkod4fa2e62017-04-11 09:55:00 +000010300 " // ...\n"
10301 " [object someMethod:@{@\"a\" : @\"b\"}];\n"
10302 "}",
10303 AllmanBraceStyle);
10304 verifyFormat("void f()\n"
10305 "{\n"
10306 " // ...\n"
10307 " [object someMethod:@{a : @\"b\"}];\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +000010308 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010309 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +000010310 verifyFormat("int f()\n"
10311 "{ // comment\n"
10312 " return 42;\n"
10313 "}",
10314 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +000010315
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010316 AllmanBraceStyle.ColumnLimit = 19;
10317 verifyFormat("void f() { int i; }", AllmanBraceStyle);
10318 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +000010319 verifyFormat("void f()\n"
10320 "{\n"
10321 " int i;\n"
10322 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010323 AllmanBraceStyle);
10324 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +000010325
Roman Kashitsyna043ced2014-08-11 12:18:01 +000010326 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +000010327 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
10328 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
10329 verifyFormat("void f(bool b)\n"
10330 "{\n"
10331 " if (b)\n"
10332 " {\n"
10333 " return;\n"
10334 " }\n"
10335 "}\n",
10336 BreakBeforeBraceShortIfs);
10337 verifyFormat("void f(bool b)\n"
10338 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010339 " if constexpr (b)\n"
10340 " {\n"
10341 " return;\n"
10342 " }\n"
10343 "}\n",
10344 BreakBeforeBraceShortIfs);
10345 verifyFormat("void f(bool b)\n"
10346 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +000010347 " if (b) return;\n"
10348 "}\n",
10349 BreakBeforeBraceShortIfs);
10350 verifyFormat("void f(bool b)\n"
10351 "{\n"
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000010352 " if constexpr (b) return;\n"
10353 "}\n",
10354 BreakBeforeBraceShortIfs);
10355 verifyFormat("void f(bool b)\n"
10356 "{\n"
Manuel Klimeka027f302013-08-07 19:20:45 +000010357 " while (b)\n"
10358 " {\n"
10359 " return;\n"
10360 " }\n"
10361 "}\n",
10362 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010363}
10364
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010365TEST_F(FormatTest, GNUBraceBreaking) {
10366 FormatStyle GNUBraceStyle = getLLVMStyle();
10367 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
10368 verifyFormat("namespace a\n"
10369 "{\n"
10370 "class A\n"
10371 "{\n"
10372 " void f()\n"
10373 " {\n"
10374 " int a;\n"
10375 " {\n"
10376 " int b;\n"
10377 " }\n"
10378 " if (true)\n"
10379 " {\n"
10380 " a();\n"
10381 " b();\n"
10382 " }\n"
10383 " }\n"
10384 " void g() { return; }\n"
10385 "}\n"
Marek Kurdejcaf6fd52017-09-27 07:51:51 +000010386 "} // namespace a",
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010387 GNUBraceStyle);
10388
10389 verifyFormat("void f()\n"
10390 "{\n"
10391 " if (true)\n"
10392 " {\n"
10393 " a();\n"
10394 " }\n"
10395 " else if (false)\n"
10396 " {\n"
10397 " b();\n"
10398 " }\n"
10399 " else\n"
10400 " {\n"
10401 " c();\n"
10402 " }\n"
10403 "}\n",
10404 GNUBraceStyle);
10405
10406 verifyFormat("void f()\n"
10407 "{\n"
10408 " for (int i = 0; i < 10; ++i)\n"
10409 " {\n"
10410 " a();\n"
10411 " }\n"
10412 " while (false)\n"
10413 " {\n"
10414 " b();\n"
10415 " }\n"
10416 " do\n"
10417 " {\n"
10418 " c();\n"
10419 " }\n"
10420 " while (false);\n"
10421 "}\n",
10422 GNUBraceStyle);
10423
10424 verifyFormat("void f(int a)\n"
10425 "{\n"
10426 " switch (a)\n"
10427 " {\n"
10428 " case 0:\n"
10429 " break;\n"
10430 " case 1:\n"
10431 " {\n"
10432 " break;\n"
10433 " }\n"
10434 " case 2:\n"
10435 " {\n"
10436 " }\n"
10437 " break;\n"
10438 " default:\n"
10439 " break;\n"
10440 " }\n"
10441 "}\n",
10442 GNUBraceStyle);
10443
10444 verifyFormat("enum X\n"
10445 "{\n"
10446 " Y = 0,\n"
10447 "}\n",
10448 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010449
10450 verifyFormat("@interface BSApplicationController ()\n"
10451 "{\n"
10452 "@private\n"
10453 " id _extraIvar;\n"
10454 "}\n"
10455 "@end\n",
10456 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010457
10458 verifyFormat("#ifdef _DEBUG\n"
10459 "int foo(int i = 0)\n"
10460 "#else\n"
10461 "int foo(int i = 5)\n"
10462 "#endif\n"
10463 "{\n"
10464 " return i;\n"
10465 "}",
10466 GNUBraceStyle);
10467
10468 verifyFormat("void foo() {}\n"
10469 "void bar()\n"
10470 "#ifdef _DEBUG\n"
10471 "{\n"
10472 " foo();\n"
10473 "}\n"
10474 "#else\n"
10475 "{\n"
10476 "}\n"
10477 "#endif",
10478 GNUBraceStyle);
10479
10480 verifyFormat("void foobar() { int i = 5; }\n"
10481 "#ifdef _DEBUG\n"
10482 "void bar() {}\n"
10483 "#else\n"
10484 "void bar() { foobar(); }\n"
10485 "#endif",
10486 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010487}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010488
10489TEST_F(FormatTest, WebKitBraceBreaking) {
10490 FormatStyle WebKitBraceStyle = getLLVMStyle();
10491 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +000010492 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010493 verifyFormat("namespace a {\n"
10494 "class A {\n"
10495 " void f()\n"
10496 " {\n"
10497 " if (true) {\n"
10498 " a();\n"
10499 " b();\n"
10500 " }\n"
10501 " }\n"
10502 " void g() { return; }\n"
10503 "};\n"
10504 "enum E {\n"
10505 " A,\n"
10506 " // foo\n"
10507 " B,\n"
10508 " C\n"
10509 "};\n"
10510 "struct B {\n"
10511 " int x;\n"
10512 "};\n"
10513 "}\n",
10514 WebKitBraceStyle);
10515 verifyFormat("struct S {\n"
10516 " int Type;\n"
10517 " union {\n"
10518 " int x;\n"
10519 " double y;\n"
10520 " } Value;\n"
10521 " class C {\n"
10522 " MyFavoriteType Value;\n"
10523 " } Class;\n"
10524 "};\n",
10525 WebKitBraceStyle);
10526}
10527
Manuel Klimekd5735502013-08-12 03:51:17 +000010528TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10529 verifyFormat("void f() {\n"
10530 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010531 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010532 " }\n"
10533 "}\n",
10534 getLLVMStyle());
10535}
10536
Daniel Jasper9613c812013-08-07 16:29:23 +000010537TEST_F(FormatTest, UnderstandsPragmas) {
10538 verifyFormat("#pragma omp reduction(| : var)");
10539 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010540
10541 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10542 "(including parentheses).",
10543 format("#pragma mark Any non-hyphenated or hyphenated string "
10544 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010545}
10546
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010547TEST_F(FormatTest, UnderstandPragmaOption) {
10548 verifyFormat("#pragma option -C -A");
10549
10550 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10551}
10552
Manuel Klimek77866142017-11-17 11:17:15 +000010553TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
10554 FormatStyle Style = getLLVMStyle();
10555 Style.ColumnLimit = 20;
10556
10557 verifyFormat("int a; // the\n"
10558 " // comment", Style);
10559 EXPECT_EQ("int a; /* first line\n"
10560 " * second\n"
10561 " * line third\n"
10562 " * line\n"
10563 " */",
10564 format("int a; /* first line\n"
10565 " * second\n"
10566 " * line third\n"
10567 " * line\n"
10568 " */",
10569 Style));
10570 EXPECT_EQ("int a; // first line\n"
10571 " // second\n"
10572 " // line third\n"
10573 " // line",
10574 format("int a; // first line\n"
10575 " // second line\n"
10576 " // third line",
10577 Style));
10578
10579 Style.PenaltyExcessCharacter = 90;
10580 verifyFormat("int a; // the comment", Style);
Manuel Klimek93699f42017-11-29 14:29:43 +000010581 EXPECT_EQ("int a; // the comment\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010582 " // aaa",
10583 format("int a; // the comment aaa", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010584 EXPECT_EQ("int a; /* first line\n"
10585 " * second line\n"
10586 " * third line\n"
10587 " */",
10588 format("int a; /* first line\n"
10589 " * second line\n"
10590 " * third line\n"
10591 " */",
10592 Style));
Manuel Klimek93699f42017-11-29 14:29:43 +000010593 EXPECT_EQ("int a; // first line\n"
10594 " // second line\n"
10595 " // third line",
10596 format("int a; // first line\n"
10597 " // second line\n"
10598 " // third line",
10599 Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010600 // FIXME: Investigate why this is not getting the same layout as the test
10601 // above.
10602 EXPECT_EQ("int a; /* first line\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010603 " * second line\n"
10604 " * third line\n"
Manuel Klimek77866142017-11-17 11:17:15 +000010605 " */",
10606 format("int a; /* first line second line third line"
10607 "\n*/",
10608 Style));
10609
10610 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010611 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010612 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010613 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010614 Style));
10615 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010616 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010617 format("// foo bar baz bazfoo\n"
Manuel Klimek0b58c322017-12-01 13:28:08 +000010618 "// foo bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010619 Style));
10620
10621 // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
10622 // next one.
Manuel Klimek93699f42017-11-29 14:29:43 +000010623 EXPECT_EQ("// foo bar baz bazfoo\n"
10624 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010625 format("// foo bar baz bazfoo bar\n"
10626 "// foo bar\n",
10627 Style));
10628
10629 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010630 "// foo bar baz bazfoo\n"
10631 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010632 format("// foo bar baz bazfoo\n"
10633 "// foo bar baz bazfoo bar\n"
10634 "// foo bar\n",
10635 Style));
10636
Manuel Klimek77866142017-11-17 11:17:15 +000010637 EXPECT_EQ("// foo bar baz bazfoo\n"
Manuel Klimek93699f42017-11-29 14:29:43 +000010638 "// foo bar baz bazfoo\n"
10639 "// bar foo bar\n",
Manuel Klimek77866142017-11-17 11:17:15 +000010640 format("// foo bar baz bazfoo\n"
10641 "// foo bar baz bazfoo bar\n"
10642 "// foo bar\n",
10643 Style));
Manuel Klimek0b58c322017-12-01 13:28:08 +000010644
10645 // Make sure we do not keep protruding characters if strict mode reflow is
10646 // cheaper than keeping protruding characters.
10647 Style.ColumnLimit = 21;
10648 EXPECT_EQ("// foo foo foo foo\n"
10649 "// foo foo foo foo\n"
10650 "// foo foo foo foo\n",
10651 format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
10652 Style));
10653
10654 EXPECT_EQ("int a = /* long block\n"
10655 " comment */\n"
10656 " 42;",
10657 format("int a = /* long block comment */ 42;", Style));
Manuel Klimek77866142017-11-17 11:17:15 +000010658}
10659
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010660#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10661 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010662 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10663 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010664
10665TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010666 SmallVector<FormatStyle, 3> Styles;
10667 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010668
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010669 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010670 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10671 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10672 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010673
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010674 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010675 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10676 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10677 EXPECT_ALL_STYLES_EQUAL(Styles);
10678
Nico Weber514ecc82014-02-02 20:50:45 +000010679 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010680 EXPECT_TRUE(
10681 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10682 EXPECT_TRUE(
10683 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10684 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010685
Nico Weber514ecc82014-02-02 20:50:45 +000010686 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010687 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10688 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10689 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010690
10691 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010692 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10693 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10694 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010695
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010696 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010697 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10698 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10699 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010700
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010701 Styles[0] = getGNUStyle();
10702 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10703 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10704 EXPECT_ALL_STYLES_EQUAL(Styles);
10705
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010706 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10707}
10708
10709TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10710 SmallVector<FormatStyle, 8> Styles;
10711 Styles.resize(2);
10712
10713 Styles[0] = getGoogleStyle();
10714 Styles[1] = getLLVMStyle();
10715 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10716 EXPECT_ALL_STYLES_EQUAL(Styles);
10717
10718 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010719 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010720 Styles[1] = getLLVMStyle();
10721 Styles[1].Language = FormatStyle::LK_JavaScript;
10722 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10723
10724 Styles[2] = getLLVMStyle();
10725 Styles[2].Language = FormatStyle::LK_JavaScript;
10726 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10727 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010728 &Styles[2])
10729 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010730
10731 Styles[3] = getLLVMStyle();
10732 Styles[3].Language = FormatStyle::LK_JavaScript;
10733 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10734 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010735 &Styles[3])
10736 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010737
10738 Styles[4] = getLLVMStyle();
10739 Styles[4].Language = FormatStyle::LK_JavaScript;
10740 EXPECT_EQ(0, parseConfiguration("---\n"
10741 "BasedOnStyle: LLVM\n"
10742 "IndentWidth: 123\n"
10743 "---\n"
10744 "BasedOnStyle: Google\n"
10745 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010746 &Styles[4])
10747 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010748 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010749}
10750
Daniel Jasper91881d92014-09-29 08:07:46 +000010751#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010752 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010753 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010754 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010755 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010756 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010757
Daniel Jasper91881d92014-09-29 08:07:46 +000010758#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10759
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010760#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10761 Style.STRUCT.FIELD = false; \
10762 EXPECT_EQ(0, \
10763 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10764 .value()); \
10765 EXPECT_TRUE(Style.STRUCT.FIELD); \
10766 EXPECT_EQ(0, \
10767 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10768 .value()); \
10769 EXPECT_FALSE(Style.STRUCT.FIELD);
10770
10771#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10772 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10773
Daniel Jasper00853002014-09-16 16:22:30 +000010774#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10775 EXPECT_NE(VALUE, Style.FIELD); \
10776 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10777 EXPECT_EQ(VALUE, Style.FIELD)
10778
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010779TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010780 FormatStyle Style = {};
10781 Style.Language = FormatStyle::LK_Cpp;
Daniel Jasper3219e432014-12-02 13:24:51 +000010782 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010783 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010784 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010785 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010786 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010787 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010788 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010789 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010790 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper18210d72014-10-09 09:52:05 +000010791 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010792 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010793 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010794 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010795 CHECK_PARSE_BOOL(BreakStringLiterals);
Francois Ferrande56a8292017-06-14 12:29:47 +000010796 CHECK_PARSE_BOOL(CompactNamespaces);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010797 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010798 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010799 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010800 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010801 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010802 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010803 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010804 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010805 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010806 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010807 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010808 CHECK_PARSE_BOOL(SortIncludes);
Krasimir Georgievac16a202017-06-23 11:46:03 +000010809 CHECK_PARSE_BOOL(SortUsingDeclarations);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010810 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010811 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010812 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010813 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010814 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010815 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010816 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010817 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010818 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Hans Wennborgbfc34062018-06-14 08:01:09 +000010819 CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
Francois Ferrand2a9ea782018-03-01 10:09:13 +000010820 CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
10821 CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
10822 CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010823
10824 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10825 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10826 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10827 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10828 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10829 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10830 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10831 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
Krasimir Georgievd6ce9372017-09-15 11:23:50 +000010832 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010833 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10834 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10835 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Francois Ferrandad722562017-06-30 20:25:55 +000010836 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10837 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10838 CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010839}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010840
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010841#undef CHECK_PARSE_BOOL
10842
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010843TEST_F(FormatTest, ParsesConfiguration) {
10844 FormatStyle Style = {};
10845 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010846 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010847 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10848 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010849 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010850 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10851 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Francois Ferrand9976efa2017-05-22 08:28:17 +000010852 CHECK_PARSE("PenaltyBreakAssignment: 1234",
10853 PenaltyBreakAssignment, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010854 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10855 PenaltyBreakBeforeFirstCallParameter, 1234u);
Francois Ferrand58e6fe52018-05-16 08:25:03 +000010856 CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
10857 PenaltyBreakTemplateDeclaration, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010858 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10859 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10860 PenaltyReturnTypeOnItsOwnLine, 1234u);
10861 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10862 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010863 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010864 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010865 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010866
Daniel Jasper553d4872014-06-17 12:40:34 +000010867 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010868 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10869 FormatStyle::PAS_Left);
10870 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10871 FormatStyle::PAS_Right);
10872 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10873 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010874 // For backward compatibility:
10875 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10876 FormatStyle::PAS_Left);
10877 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10878 FormatStyle::PAS_Right);
10879 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10880 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010881
Alexander Kornienkod6538332013-05-07 15:32:14 +000010882 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010883 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10884 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010885 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10886 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10887 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10888
Daniel Jasperac043c92014-09-15 11:11:00 +000010889 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010890 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10891 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010892 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10893 FormatStyle::BOS_None);
10894 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10895 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010896 // For backward compatibility:
10897 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10898 FormatStyle::BOS_None);
10899 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10900 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010901
Francois Ferranda6b6d512017-05-24 11:36:58 +000010902 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10903 CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10904 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10905 CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10906 BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10907 CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10908 BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10909 // For backward compatibility:
10910 CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10911 BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10912
Francois Ferrand6bb103f2018-06-11 14:41:26 +000010913 Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
10914 CHECK_PARSE("BreakInheritanceList: BeforeComma",
10915 BreakInheritanceList, FormatStyle::BILS_BeforeComma);
10916 CHECK_PARSE("BreakInheritanceList: AfterColon",
10917 BreakInheritanceList, FormatStyle::BILS_AfterColon);
10918 CHECK_PARSE("BreakInheritanceList: BeforeColon",
10919 BreakInheritanceList, FormatStyle::BILS_BeforeColon);
10920 // For backward compatibility:
10921 CHECK_PARSE("BreakBeforeInheritanceComma: true",
10922 BreakInheritanceList, FormatStyle::BILS_BeforeComma);
10923
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010924 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10925 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10926 FormatStyle::BAS_Align);
10927 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10928 FormatStyle::BAS_DontAlign);
10929 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10930 FormatStyle::BAS_AlwaysBreak);
10931 // For backward compatibility:
10932 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10933 FormatStyle::BAS_DontAlign);
10934 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10935 FormatStyle::BAS_Align);
10936
Daniel Jasper7fdbb3f2017-05-08 15:08:00 +000010937 Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10938 CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
10939 FormatStyle::ENAS_DontAlign);
10940 CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
10941 FormatStyle::ENAS_Left);
10942 CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
10943 FormatStyle::ENAS_Right);
10944 // For backward compatibility:
10945 CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
10946 FormatStyle::ENAS_Left);
10947 CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
10948 FormatStyle::ENAS_Right);
10949
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010950 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010951 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10952 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10953 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010954 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10955 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010956 // For backward compatibility:
10957 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10958 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010959
Daniel Jasperd74cf402014-04-08 12:46:38 +000010960 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010961 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10962 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10963 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10964 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010965 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10966 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010967 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10968 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010969 // For backward compatibility:
10970 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10971 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10972 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10973 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010974
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010975 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10976 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10977 FormatStyle::SBPO_Never);
10978 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10979 FormatStyle::SBPO_Always);
10980 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10981 FormatStyle::SBPO_ControlStatements);
10982 // For backward compatibility:
10983 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10984 FormatStyle::SBPO_Never);
10985 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10986 FormatStyle::SBPO_ControlStatements);
10987
Alexander Kornienkod6538332013-05-07 15:32:14 +000010988 Style.ColumnLimit = 123;
10989 FormatStyle BaseStyle = getLLVMStyle();
10990 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10991 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10992
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010993 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10994 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10995 FormatStyle::BS_Attach);
10996 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10997 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010998 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10999 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000011000 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
11001 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000011002 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
11003 FormatStyle::BS_Allman);
11004 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000011005 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
11006 FormatStyle::BS_WebKit);
11007 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
11008 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000011009
Zachary Turner448592e2015-12-18 22:20:15 +000011010 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
11011 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
11012 FormatStyle::RTBS_None);
11013 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
11014 FormatStyle::RTBS_All);
11015 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000011016 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000011017 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
11018 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
11019 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
11020 AlwaysBreakAfterReturnType,
11021 FormatStyle::RTBS_TopLevelDefinitions);
11022
Francois Ferrand58e6fe52018-05-16 08:25:03 +000011023 Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
11024 CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", AlwaysBreakTemplateDeclarations,
11025 FormatStyle::BTDS_No);
11026 CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", AlwaysBreakTemplateDeclarations,
11027 FormatStyle::BTDS_MultiLine);
11028 CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", AlwaysBreakTemplateDeclarations,
11029 FormatStyle::BTDS_Yes);
11030 CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", AlwaysBreakTemplateDeclarations,
11031 FormatStyle::BTDS_MultiLine);
11032 CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", AlwaysBreakTemplateDeclarations,
11033 FormatStyle::BTDS_Yes);
11034
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000011035 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
11036 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
11037 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
11038 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
11039 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
11040 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
11041 AlwaysBreakAfterDefinitionReturnType,
11042 FormatStyle::DRTBS_TopLevel);
11043
Daniel Jasper65ee3472013-07-31 23:16:02 +000011044 Style.NamespaceIndentation = FormatStyle::NI_All;
11045 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
11046 FormatStyle::NI_None);
11047 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
11048 FormatStyle::NI_Inner);
11049 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
11050 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000011051
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000011052 // FIXME: This is required because parsing a configuration simply overwrites
11053 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000011054 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000011055 std::vector<std::string> BoostForeach;
11056 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000011057 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000011058 std::vector<std::string> BoostAndQForeach;
11059 BoostAndQForeach.push_back("BOOST_FOREACH");
11060 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000011061 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
11062 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000011063
Eric Liu9d92c022018-05-14 19:51:33 +000011064 Style.IncludeStyle.IncludeCategories.clear();
11065 std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
11066 {"abc/.*", 2}, {".*", 1}};
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000011067 CHECK_PARSE("IncludeCategories:\n"
11068 " - Regex: abc/.*\n"
11069 " Priority: 2\n"
11070 " - Regex: .*\n"
11071 " Priority: 1",
Eric Liu9d92c022018-05-14 19:51:33 +000011072 IncludeStyle.IncludeCategories, ExpectedCategories);
11073 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
11074 "abc$");
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011075
11076 Style.RawStringFormats.clear();
11077 std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011078 {
11079 FormatStyle::LK_TextProto,
11080 {"pb", "proto"},
11081 {"PARSE_TEXT_PROTO"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000011082 /*CanonicalDelimiter=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011083 "llvm",
11084 },
11085 {
11086 FormatStyle::LK_Cpp,
11087 {"cc", "cpp"},
11088 {"C_CODEBLOCK", "CPPEVAL"},
Krasimir Georgiev412ed092018-01-19 16:18:47 +000011089 /*CanonicalDelimiter=*/"cc",
11090 /*BasedOnStyle=*/"",
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011091 },
Krasimir Georgiev4527f132018-01-17 12:24:59 +000011092 };
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011093
11094 CHECK_PARSE("RawStringFormats:\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000011095 " - Language: TextProto\n"
11096 " Delimiters:\n"
11097 " - 'pb'\n"
11098 " - 'proto'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011099 " EnclosingFunctions:\n"
11100 " - 'PARSE_TEXT_PROTO'\n"
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011101 " BasedOnStyle: llvm\n"
Krasimir Georgiev4527f132018-01-17 12:24:59 +000011102 " - Language: Cpp\n"
11103 " Delimiters:\n"
11104 " - 'cc'\n"
11105 " - 'cpp'\n"
Krasimir Georgiev2537e222018-01-17 16:17:26 +000011106 " EnclosingFunctions:\n"
11107 " - 'C_CODEBLOCK'\n"
Krasimir Georgiev412ed092018-01-19 16:18:47 +000011108 " - 'CPPEVAL'\n"
11109 " CanonicalDelimiter: 'cc'",
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +000011110 RawStringFormats, ExpectedRawStringFormats);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011111}
11112
11113TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
11114 FormatStyle Style = {};
11115 Style.Language = FormatStyle::LK_Cpp;
11116 CHECK_PARSE("Language: Cpp\n"
11117 "IndentWidth: 12",
11118 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000011119 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
11120 "IndentWidth: 34",
11121 &Style),
11122 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011123 EXPECT_EQ(12u, Style.IndentWidth);
11124 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
11125 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
11126
11127 Style.Language = FormatStyle::LK_JavaScript;
11128 CHECK_PARSE("Language: JavaScript\n"
11129 "IndentWidth: 12",
11130 IndentWidth, 12u);
11131 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000011132 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
11133 "IndentWidth: 34",
11134 &Style),
11135 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011136 EXPECT_EQ(23u, Style.IndentWidth);
11137 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
11138 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
11139
11140 CHECK_PARSE("BasedOnStyle: LLVM\n"
11141 "IndentWidth: 67",
11142 IndentWidth, 67u);
11143
11144 CHECK_PARSE("---\n"
11145 "Language: JavaScript\n"
11146 "IndentWidth: 12\n"
11147 "---\n"
11148 "Language: Cpp\n"
11149 "IndentWidth: 34\n"
11150 "...\n",
11151 IndentWidth, 12u);
11152
11153 Style.Language = FormatStyle::LK_Cpp;
11154 CHECK_PARSE("---\n"
11155 "Language: JavaScript\n"
11156 "IndentWidth: 12\n"
11157 "---\n"
11158 "Language: Cpp\n"
11159 "IndentWidth: 34\n"
11160 "...\n",
11161 IndentWidth, 34u);
11162 CHECK_PARSE("---\n"
11163 "IndentWidth: 78\n"
11164 "---\n"
11165 "Language: JavaScript\n"
11166 "IndentWidth: 56\n"
11167 "...\n",
11168 IndentWidth, 78u);
11169
11170 Style.ColumnLimit = 123;
11171 Style.IndentWidth = 234;
11172 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
11173 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000011174 EXPECT_FALSE(parseConfiguration("---\n"
11175 "IndentWidth: 456\n"
11176 "BreakBeforeBraces: Allman\n"
11177 "---\n"
11178 "Language: JavaScript\n"
11179 "IndentWidth: 111\n"
11180 "TabWidth: 111\n"
11181 "---\n"
11182 "Language: Cpp\n"
11183 "BreakBeforeBraces: Stroustrup\n"
11184 "TabWidth: 789\n"
11185 "...\n",
11186 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011187 EXPECT_EQ(123u, Style.ColumnLimit);
11188 EXPECT_EQ(456u, Style.IndentWidth);
11189 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
11190 EXPECT_EQ(789u, Style.TabWidth);
11191
Rafael Espindola1f243172014-06-12 11:35:17 +000011192 EXPECT_EQ(parseConfiguration("---\n"
11193 "Language: JavaScript\n"
11194 "IndentWidth: 56\n"
11195 "---\n"
11196 "IndentWidth: 78\n"
11197 "...\n",
11198 &Style),
11199 ParseError::Error);
11200 EXPECT_EQ(parseConfiguration("---\n"
11201 "Language: JavaScript\n"
11202 "IndentWidth: 56\n"
11203 "---\n"
11204 "Language: JavaScript\n"
11205 "IndentWidth: 78\n"
11206 "...\n",
11207 &Style),
11208 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011209
11210 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
11211}
Daniel Jasper65ee3472013-07-31 23:16:02 +000011212
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011213#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011214
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011215TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
11216 FormatStyle Style = {};
11217 Style.Language = FormatStyle::LK_JavaScript;
11218 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011219 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000011220 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011221
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011222 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000011223 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011224 "BasedOnStyle: Google\n"
11225 "---\n"
11226 "Language: JavaScript\n"
11227 "IndentWidth: 76\n"
11228 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011229 &Style)
11230 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000011231 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000011232 EXPECT_EQ(76u, Style.IndentWidth);
11233 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
11234}
11235
Alexander Kornienkod6538332013-05-07 15:32:14 +000011236TEST_F(FormatTest, ConfigurationRoundTripTest) {
11237 FormatStyle Style = getLLVMStyle();
11238 std::string YAML = configurationAsText(Style);
11239 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000011240 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000011241 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
11242 EXPECT_EQ(Style, ParsedStyle);
11243}
11244
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011245TEST_F(FormatTest, WorksFor8bitEncodings) {
11246 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
11247 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
11248 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
11249 "\"\xef\xee\xf0\xf3...\"",
11250 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
11251 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
11252 "\xef\xee\xf0\xf3...\"",
11253 getLLVMStyleWithColumns(12)));
11254}
11255
Alexander Kornienko393e3082013-11-13 14:04:17 +000011256TEST_F(FormatTest, HandlesUTF8BOM) {
11257 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
11258 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
11259 format("\xef\xbb\xbf#include <iostream>"));
11260 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
11261 format("\xef\xbb\xbf\n#include <iostream>"));
11262}
11263
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000011264// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
11265#if !defined(_MSC_VER)
11266
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011267TEST_F(FormatTest, CountsUTF8CharactersProperly) {
11268 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
11269 getLLVMStyleWithColumns(35));
11270 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011271 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011272 verifyFormat("// Однажды в студёную зимнюю пору...",
11273 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000011274 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011275 verifyFormat("/* Однажды в студёную зимнюю пору... */",
11276 getLLVMStyleWithColumns(39));
11277 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011278 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011279}
11280
11281TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000011282 // Non-printable characters' width is currently considered to be the length in
11283 // bytes in UTF8. The characters can be displayed in very different manner
11284 // (zero-width, single width with a substitution glyph, expanded to their code
11285 // (e.g. "<8d>"), so there's no single correct way to handle them.
11286 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011287 "\"\xc2\x8d\";",
11288 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000011289 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011290 "\"\xc2\x8d\";",
11291 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000011292 EXPECT_EQ("\"Однажды, в \"\n"
11293 "\"студёную \"\n"
11294 "\"зимнюю \"\n"
11295 "\"пору,\"",
11296 format("\"Однажды, в студёную зимнюю пору,\"",
11297 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011298 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000011299 "\"一 二 三 \"\n"
11300 "\"四 五六 \"\n"
11301 "\"七 八 九 \"\n"
11302 "\"十\"",
11303 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Manuel Klimek93699f42017-11-29 14:29:43 +000011304 EXPECT_EQ("\"一\t\"\n"
11305 "\"二 \t\"\n"
11306 "\"三 四 \"\n"
11307 "\"五\t\"\n"
11308 "\"六 \t\"\n"
11309 "\"七 \"\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011310 "\"八九十\tqq\"",
11311 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
11312 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000011313
11314 // UTF8 character in an escape sequence.
11315 EXPECT_EQ("\"aaaaaa\"\n"
11316 "\"\\\xC2\x8D\"",
11317 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011318}
11319
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011320TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
11321 EXPECT_EQ("const char *sssss =\n"
11322 " \"一二三四五六七八\\\n"
11323 " 九 十\";",
11324 format("const char *sssss = \"一二三四五六七八\\\n"
11325 " 九 十\";",
11326 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011327}
11328
11329TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000011330 EXPECT_EQ("// aaaaÄ\xc2\x8d",
11331 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011332 EXPECT_EQ("// Я из лесу\n"
11333 "// вышел; был\n"
11334 "// сильный\n"
11335 "// мороз.",
11336 format("// Я из лесу вышел; был сильный мороз.",
11337 getLLVMStyleWithColumns(13)));
11338 EXPECT_EQ("// 一二三\n"
11339 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011340 "// 八 九\n"
11341 "// 十",
11342 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011343}
11344
11345TEST_F(FormatTest, SplitsUTF8BlockComments) {
11346 EXPECT_EQ("/* Гляжу,\n"
11347 " * поднимается\n"
11348 " * медленно в\n"
11349 " * гору\n"
11350 " * Лошадка,\n"
11351 " * везущая\n"
11352 " * хворосту\n"
11353 " * воз. */",
11354 format("/* Гляжу, поднимается медленно в гору\n"
11355 " * Лошадка, везущая хворосту воз. */",
11356 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011357 EXPECT_EQ(
11358 "/* 一二三\n"
11359 " * 四五六七\n"
11360 " * 八 九\n"
11361 " * 十 */",
11362 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000011363 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
11364 " * 𝕓𝕪𝕥𝕖\n"
11365 " * 𝖀𝕿𝕱-𝟠 */",
11366 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000011367}
11368
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000011369#endif // _MSC_VER
11370
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011371TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
11372 FormatStyle Style = getLLVMStyle();
11373
11374 Style.ConstructorInitializerIndentWidth = 4;
11375 verifyFormat(
11376 "SomeClass::Constructor()\n"
11377 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11378 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11379 Style);
11380
11381 Style.ConstructorInitializerIndentWidth = 2;
11382 verifyFormat(
11383 "SomeClass::Constructor()\n"
11384 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11385 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11386 Style);
11387
11388 Style.ConstructorInitializerIndentWidth = 0;
11389 verifyFormat(
11390 "SomeClass::Constructor()\n"
11391 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11392 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11393 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000011394 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
11395 verifyFormat(
11396 "SomeLongTemplateVariableName<\n"
11397 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
11398 Style);
11399 verifyFormat(
11400 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
11401 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
11402 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000011403}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011404
Daniel Jasper00853002014-09-16 16:22:30 +000011405TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
11406 FormatStyle Style = getLLVMStyle();
Francois Ferranda6b6d512017-05-24 11:36:58 +000011407 Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011408 Style.ConstructorInitializerIndentWidth = 4;
11409 verifyFormat("SomeClass::Constructor()\n"
11410 " : a(a)\n"
11411 " , b(b)\n"
11412 " , c(c) {}",
11413 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011414 verifyFormat("SomeClass::Constructor()\n"
11415 " : a(a) {}",
11416 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011417
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011418 Style.ColumnLimit = 0;
11419 verifyFormat("SomeClass::Constructor()\n"
11420 " : a(a) {}",
11421 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000011422 verifyFormat("SomeClass::Constructor() noexcept\n"
11423 " : a(a) {}",
11424 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011425 verifyFormat("SomeClass::Constructor()\n"
11426 " : a(a)\n"
11427 " , b(b)\n"
11428 " , c(c) {}",
11429 Style);
11430 verifyFormat("SomeClass::Constructor()\n"
11431 " : a(a) {\n"
11432 " foo();\n"
11433 " bar();\n"
11434 "}",
11435 Style);
11436
Daniel Jasperd74cf402014-04-08 12:46:38 +000011437 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011438 verifyFormat("SomeClass::Constructor()\n"
11439 " : a(a)\n"
11440 " , b(b)\n"
11441 " , c(c) {\n}",
11442 Style);
11443 verifyFormat("SomeClass::Constructor()\n"
11444 " : a(a) {\n}",
11445 Style);
11446
11447 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000011448 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011449 Style.ConstructorInitializerIndentWidth = 2;
11450 verifyFormat("SomeClass::Constructor()\n"
11451 " : a(a)\n"
11452 " , b(b)\n"
11453 " , c(c) {}",
11454 Style);
11455
11456 Style.ConstructorInitializerIndentWidth = 0;
11457 verifyFormat("SomeClass::Constructor()\n"
11458 ": a(a)\n"
11459 ", b(b)\n"
11460 ", c(c) {}",
11461 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011462
11463 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
11464 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011465 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
11466 verifyFormat(
11467 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
11468 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000011469 verifyFormat(
11470 "SomeClass::Constructor()\n"
11471 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
11472 Style);
11473 Style.ConstructorInitializerIndentWidth = 4;
11474 Style.ColumnLimit = 60;
11475 verifyFormat("SomeClass::Constructor()\n"
11476 " : aaaaaaaa(aaaaaaaa)\n"
11477 " , aaaaaaaa(aaaaaaaa)\n"
11478 " , aaaaaaaa(aaaaaaaa) {}",
11479 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000011480}
11481
Daniel Jasper38efc132014-10-21 07:51:54 +000011482TEST_F(FormatTest, Destructors) {
11483 verifyFormat("void F(int &i) { i.~int(); }");
11484 verifyFormat("void F(int &i) { i->~int(); }");
11485}
11486
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011487TEST_F(FormatTest, FormatsWithWebKitStyle) {
11488 FormatStyle Style = getWebKitStyle();
11489
11490 // Don't indent in outer namespaces.
11491 verifyFormat("namespace outer {\n"
11492 "int i;\n"
11493 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000011494 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011495 "} // namespace inner\n"
11496 "} // namespace outer\n"
11497 "namespace other_outer {\n"
11498 "int i;\n"
11499 "}",
11500 Style);
11501
11502 // Don't indent case labels.
11503 verifyFormat("switch (variable) {\n"
11504 "case 1:\n"
11505 "case 2:\n"
11506 " doSomething();\n"
11507 " break;\n"
11508 "default:\n"
11509 " ++variable;\n"
11510 "}",
11511 Style);
11512
11513 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000011514 EXPECT_EQ("void f()\n"
11515 "{\n"
11516 " if (aaaaaaaaaaaaaaaa\n"
11517 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
11518 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11519 " return;\n"
11520 "}",
11521 format("void f() {\n"
11522 "if (aaaaaaaaaaaaaaaa\n"
11523 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
11524 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
11525 "return;\n"
11526 "}",
11527 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011528
Daniel Jasper35995672014-04-29 14:05:20 +000011529 // Allow functions on a single line.
11530 verifyFormat("void f() { return; }", Style);
11531
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011532 // Constructor initializers are formatted one per line with the "," on the
11533 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011534 verifyFormat("Constructor()\n"
11535 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
11536 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000011537 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011538 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
11539 "{\n"
11540 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011541 Style);
11542 verifyFormat("SomeClass::Constructor()\n"
11543 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000011544 "{\n"
11545 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011546 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000011547 EXPECT_EQ("SomeClass::Constructor()\n"
11548 " : a(a)\n"
11549 "{\n"
11550 "}",
11551 format("SomeClass::Constructor():a(a){}", Style));
11552 verifyFormat("SomeClass::Constructor()\n"
11553 " : a(a)\n"
11554 " , b(b)\n"
11555 " , c(c)\n"
11556 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000011557 "}",
11558 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000011559 verifyFormat("SomeClass::Constructor()\n"
11560 " : a(a)\n"
11561 "{\n"
11562 " foo();\n"
11563 " bar();\n"
11564 "}",
11565 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011566
Daniel Jasper65ee3472013-07-31 23:16:02 +000011567 // Access specifiers should be aligned left.
11568 verifyFormat("class C {\n"
11569 "public:\n"
11570 " int i;\n"
11571 "};",
11572 Style);
11573
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011574 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000011575 verifyFormat("int a; // Do not\n"
11576 "double b; // align comments.",
11577 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011578
Daniel Jasper3219e432014-12-02 13:24:51 +000011579 // Do not align operands.
11580 EXPECT_EQ("ASSERT(aaaa\n"
11581 " || bbbb);",
11582 format("ASSERT ( aaaa\n||bbbb);", Style));
11583
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011584 // Accept input's line breaks.
11585 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
11586 " || bbbbbbbbbbbbbbb) {\n"
11587 " i++;\n"
11588 "}",
11589 format("if (aaaaaaaaaaaaaaa\n"
11590 "|| bbbbbbbbbbbbbbb) { i++; }",
11591 Style));
11592 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
11593 " i++;\n"
11594 "}",
11595 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000011596
11597 // Don't automatically break all macro definitions (llvm.org/PR17842).
11598 verifyFormat("#define aNumber 10", Style);
11599 // However, generally keep the line breaks that the user authored.
11600 EXPECT_EQ("#define aNumber \\\n"
11601 " 10",
11602 format("#define aNumber \\\n"
11603 " 10",
11604 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000011605
11606 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011607 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
11608 " copyItems:YES];",
11609 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
11610 "copyItems:YES];",
11611 Style));
11612 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
11613 " copyItems:YES];",
11614 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
11615 " copyItems:YES];",
11616 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000011617 // FIXME: This does not seem right, there should be more indentation before
11618 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011619 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000011620 " @\"a\",\n"
11621 " @\"a\"\n"
11622 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011623 " copyItems:YES];",
11624 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11625 " @\"a\",\n"
11626 " @\"a\"\n"
11627 " ]\n"
11628 " copyItems:YES];",
11629 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011630 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011631 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11632 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011633 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11634 " copyItems:YES];",
11635 Style));
11636
11637 verifyFormat("[self.a b:c c:d];", Style);
11638 EXPECT_EQ("[self.a b:c\n"
11639 " c:d];",
11640 format("[self.a b:c\n"
11641 "c:d];",
11642 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011643}
11644
Manuel Klimekffdeb592013-09-03 15:10:01 +000011645TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011646 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11647 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11648 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11649 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11650 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011651 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Manuel Klimek9f0a4e52017-09-19 09:59:30 +000011652 verifyFormat("auto c = [a = [b = 42] {}] {};\n");
11653 verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011654 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011655 verifyFormat("void f() {\n"
11656 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11657 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011658 verifyFormat("void f() {\n"
11659 " other(x.begin(), //\n"
11660 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011661 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011662 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011663 verifyFormat("SomeFunction([]() { // A cool function...\n"
11664 " return 43;\n"
11665 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011666 EXPECT_EQ("SomeFunction([]() {\n"
11667 "#define A a\n"
11668 " return 43;\n"
11669 "});",
11670 format("SomeFunction([](){\n"
11671 "#define A a\n"
11672 "return 43;\n"
11673 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011674 verifyFormat("void f() {\n"
11675 " SomeFunction([](decltype(x), A *a) {});\n"
11676 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011677 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11678 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011679 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11680 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11681 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011682 verifyFormat("Constructor()\n"
11683 " : Field([] { // comment\n"
11684 " int i;\n"
11685 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011686 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11687 " return some_parameter.size();\n"
11688 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011689 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11690 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011691 verifyFormat("int i = aaaaaa ? 1 //\n"
11692 " : [] {\n"
11693 " return 2; //\n"
11694 " }();");
11695 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11696 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11697 " return x == 2; // force break\n"
11698 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011699 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11700 " [=](int iiiiiiiiiiii) {\n"
11701 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
11702 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
11703 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011704 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011705 verifyFormat("SomeFunction({[&] {\n"
11706 " // comment\n"
11707 " },\n"
11708 " [&] {\n"
11709 " // comment\n"
11710 " }});");
11711 verifyFormat("SomeFunction({[&] {\n"
11712 " // comment\n"
11713 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011714 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11715 " [&]() { return true; },\n"
11716 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011717
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011718 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011719 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011720 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011721 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11722 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011723 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011724 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011725 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11726 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011727 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011728 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11729 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011730 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011731 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011732 verifyFormat(
11733 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11734 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11735 " return aaaaaaaaaaaaaaaaa;\n"
11736 " });",
11737 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011738 verifyFormat("[]() //\n"
11739 " -> int {\n"
11740 " return 1; //\n"
11741 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011742
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011743 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011744 verifyFormat("SomeFunction(\n"
11745 " []() {\n"
11746 " int i = 42;\n"
11747 " return i;\n"
11748 " },\n"
11749 " []() {\n"
11750 " int j = 43;\n"
11751 " return j;\n"
11752 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011753
Daniel Jasperda18fd82014-06-10 06:39:03 +000011754 // More complex introducers.
11755 verifyFormat("return [i, args...] {};");
11756
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011757 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011758 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011759 verifyFormat("double &operator[](int i) { return 0; }\n"
11760 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011761 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011762 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011763 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011764
11765 // Other corner cases.
11766 verifyFormat("void f() {\n"
11767 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
Martin Probst2c1cdae2017-05-15 11:15:29 +000011768 " );\n"
Daniel Jasper84a12e12014-03-10 15:06:25 +000011769 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011770
11771 // Lambdas created through weird macros.
11772 verifyFormat("void f() {\n"
11773 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011774 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011775 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011776
11777 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11778 " doo_dah();\n"
11779 " doo_dah();\n"
11780 " })) {\n"
11781 "}");
Daniel Jasper6a7d5a72017-06-19 07:40:49 +000011782 verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
11783 " doo_dah();\n"
11784 " doo_dah();\n"
11785 " })) {\n"
11786 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011787 verifyFormat("auto lambda = []() {\n"
11788 " int a = 2\n"
11789 "#if A\n"
11790 " + 2\n"
11791 "#endif\n"
11792 " ;\n"
11793 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +000011794
11795 // Lambdas with complex multiline introducers.
11796 verifyFormat(
11797 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11798 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
11799 " -> ::std::unordered_set<\n"
11800 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
11801 " //\n"
11802 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011803}
11804
Martin Probsta004b3f2017-11-17 18:06:33 +000011805TEST_F(FormatTest, EmptyLinesInLambdas) {
11806 verifyFormat("auto lambda = []() {\n"
11807 " x(); //\n"
11808 "};",
11809 "auto lambda = []() {\n"
11810 "\n"
11811 " x(); //\n"
11812 "\n"
11813 "};");
11814}
11815
Manuel Klimek516e0542013-09-04 13:25:30 +000011816TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011817 FormatStyle ShortBlocks = getLLVMStyle();
11818 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11819 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11820 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11821 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11822 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11823 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11824 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011825
Daniel Jasper76284682014-10-22 09:12:44 +000011826 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11827 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11828 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011829
Daniel Jasper76284682014-10-22 09:12:44 +000011830 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011831 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011832 "}];");
11833 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011834 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011835 "}]};");
11836 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011837 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011838 "}];");
11839 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011840 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011841 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011842 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011843 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011844 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011845 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011846 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011847
11848 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011849 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011850 "}];",
11851 getLLVMStyleWithColumns(60));
11852 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011853 " NSString *path = [self sessionFilePath];\n"
11854 " if (path) {\n"
11855 " // ...\n"
11856 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011857 "});");
11858 verifyFormat("[[SessionService sharedService]\n"
11859 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011860 " if (window) {\n"
11861 " [self windowDidLoad:window];\n"
11862 " } else {\n"
11863 " [self errorLoadingWindow];\n"
11864 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011865 " }];");
11866 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011867 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011868 "};\n",
11869 getLLVMStyleWithColumns(40));
11870 verifyFormat("[[SessionService sharedService]\n"
11871 " loadWindowWithCompletionBlock: //\n"
11872 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011873 " if (window) {\n"
11874 " [self windowDidLoad:window];\n"
11875 " } else {\n"
11876 " [self errorLoadingWindow];\n"
11877 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011878 " }];",
11879 getLLVMStyleWithColumns(60));
11880 verifyFormat("[myObject doSomethingWith:arg1\n"
11881 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011882 " // ...\n"
11883 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011884 " }\n"
11885 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011886 " // ...\n"
11887 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011888 " }\n"
11889 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011890 " // ...\n"
11891 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011892 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011893 verifyFormat("[myObject doSomethingWith:arg1\n"
11894 " firstBlock:-1\n"
11895 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011896 " // ...\n"
11897 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011898 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011899
11900 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011901 " @autoreleasepool {\n"
11902 " if (a) {\n"
11903 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011904 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011905 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011906 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011907 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011908 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11909 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011910
11911 FormatStyle FourIndent = getLLVMStyle();
11912 FourIndent.ObjCBlockIndentWidth = 4;
11913 verifyFormat("[operation setCompletionBlock:^{\n"
11914 " [self onOperationDone];\n"
11915 "}];",
11916 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011917}
11918
Daniel Jasper289afc02015-04-23 09:23:17 +000011919TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11920 FormatStyle ZeroColumn = getLLVMStyle();
11921 ZeroColumn.ColumnLimit = 0;
11922
11923 verifyFormat("[[SessionService sharedService] "
11924 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11925 " if (window) {\n"
11926 " [self windowDidLoad:window];\n"
11927 " } else {\n"
11928 " [self errorLoadingWindow];\n"
11929 " }\n"
11930 "}];",
11931 ZeroColumn);
11932 EXPECT_EQ("[[SessionService sharedService]\n"
11933 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11934 " if (window) {\n"
11935 " [self windowDidLoad:window];\n"
11936 " } else {\n"
11937 " [self errorLoadingWindow];\n"
11938 " }\n"
11939 " }];",
11940 format("[[SessionService sharedService]\n"
11941 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11942 " if (window) {\n"
11943 " [self windowDidLoad:window];\n"
11944 " } else {\n"
11945 " [self errorLoadingWindow];\n"
11946 " }\n"
11947 "}];",
11948 ZeroColumn));
11949 verifyFormat("[myObject doSomethingWith:arg1\n"
11950 " firstBlock:^(Foo *a) {\n"
11951 " // ...\n"
11952 " int i;\n"
11953 " }\n"
11954 " secondBlock:^(Bar *b) {\n"
11955 " // ...\n"
11956 " int i;\n"
11957 " }\n"
11958 " thirdBlock:^Foo(Bar *b) {\n"
11959 " // ...\n"
11960 " int i;\n"
11961 " }];",
11962 ZeroColumn);
11963 verifyFormat("f(^{\n"
11964 " @autoreleasepool {\n"
11965 " if (a) {\n"
11966 " g();\n"
11967 " }\n"
11968 " }\n"
11969 "});",
11970 ZeroColumn);
11971 verifyFormat("void (^largeBlock)(void) = ^{\n"
11972 " // ...\n"
11973 "};",
11974 ZeroColumn);
11975
11976 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11977 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011978 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011979 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11980 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11981 " int i;\n"
11982 "};",
11983 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11984}
11985
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011986TEST_F(FormatTest, SupportsCRLF) {
11987 EXPECT_EQ("int a;\r\n"
11988 "int b;\r\n"
11989 "int c;\r\n",
11990 format("int a;\r\n"
11991 " int b;\r\n"
11992 " int c;\r\n",
11993 getLLVMStyle()));
11994 EXPECT_EQ("int a;\r\n"
11995 "int b;\r\n"
11996 "int c;\r\n",
11997 format("int a;\r\n"
11998 " int b;\n"
11999 " int c;\r\n",
12000 getLLVMStyle()));
12001 EXPECT_EQ("int a;\n"
12002 "int b;\n"
12003 "int c;\n",
12004 format("int a;\r\n"
12005 " int b;\n"
12006 " int c;\n",
12007 getLLVMStyle()));
12008 EXPECT_EQ("\"aaaaaaa \"\r\n"
12009 "\"bbbbbbb\";\r\n",
12010 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
12011 EXPECT_EQ("#define A \\\r\n"
12012 " b; \\\r\n"
12013 " c; \\\r\n"
12014 " d;\r\n",
12015 format("#define A \\\r\n"
12016 " b; \\\r\n"
12017 " c; d; \r\n",
12018 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000012019
12020 EXPECT_EQ("/*\r\n"
12021 "multi line block comments\r\n"
12022 "should not introduce\r\n"
12023 "an extra carriage return\r\n"
12024 "*/\r\n",
12025 format("/*\r\n"
12026 "multi line block comments\r\n"
12027 "should not introduce\r\n"
12028 "an extra carriage return\r\n"
12029 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000012030}
12031
Manuel Klimekb212f3b2013-10-12 22:46:56 +000012032TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
12033 verifyFormat("MY_CLASS(C) {\n"
12034 " int i;\n"
12035 " int j;\n"
12036 "};");
12037}
12038
Daniel Jasper6633ab82013-10-18 10:38:14 +000012039TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
12040 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
12041 TwoIndent.ContinuationIndentWidth = 2;
12042
12043 EXPECT_EQ("int i =\n"
12044 " longFunction(\n"
12045 " arg);",
12046 format("int i = longFunction(arg);", TwoIndent));
12047
12048 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
12049 SixIndent.ContinuationIndentWidth = 6;
12050
12051 EXPECT_EQ("int i =\n"
12052 " longFunction(\n"
12053 " arg);",
12054 format("int i = longFunction(arg);", SixIndent));
12055}
12056
Daniel Jasperdd978ae2013-10-29 14:52:02 +000012057TEST_F(FormatTest, SpacesInAngles) {
12058 FormatStyle Spaces = getLLVMStyle();
12059 Spaces.SpacesInAngles = true;
12060
12061 verifyFormat("static_cast< int >(arg);", Spaces);
12062 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
12063 verifyFormat("f< int, float >();", Spaces);
12064 verifyFormat("template <> g() {}", Spaces);
12065 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000012066 verifyFormat("std::function< void(int, int) > fct;", Spaces);
12067 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
12068 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000012069
12070 Spaces.Standard = FormatStyle::LS_Cpp03;
12071 Spaces.SpacesInAngles = true;
12072 verifyFormat("A< A< int > >();", Spaces);
12073
12074 Spaces.SpacesInAngles = false;
12075 verifyFormat("A<A<int> >();", Spaces);
12076
12077 Spaces.Standard = FormatStyle::LS_Cpp11;
12078 Spaces.SpacesInAngles = true;
12079 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000012080
Daniel Jasperdd978ae2013-10-29 14:52:02 +000012081 Spaces.SpacesInAngles = false;
12082 verifyFormat("A<A<int>>();", Spaces);
12083}
12084
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000012085TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
12086 FormatStyle Style = getLLVMStyle();
12087 Style.SpaceAfterTemplateKeyword = false;
12088 verifyFormat("template<int> void foo();", Style);
12089}
12090
Jacques Pienaarfc275112015-02-18 23:48:37 +000012091TEST_F(FormatTest, TripleAngleBrackets) {
12092 verifyFormat("f<<<1, 1>>>();");
12093 verifyFormat("f<<<1, 1, 1, s>>>();");
12094 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000012095 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000012096 verifyFormat("f<param><<<1, 1>>>();");
12097 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000012098 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000012099 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12100 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000012101 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
12102 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000012103}
12104
12105TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000012106 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000012107 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000012108 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12109 "aaallvm::outs() <<");
12110 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12111 "aaaallvm::outs()\n <<");
12112}
12113
Manuel Klimek819788d2014-03-18 11:22:45 +000012114TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
12115 std::string code = "#if A\n"
12116 "#if B\n"
12117 "a.\n"
12118 "#endif\n"
12119 " a = 1;\n"
12120 "#else\n"
12121 "#endif\n"
12122 "#if C\n"
12123 "#else\n"
12124 "#endif\n";
12125 EXPECT_EQ(code, format(code));
12126}
12127
Manuel Klimek68b03042014-04-14 09:14:11 +000012128TEST_F(FormatTest, HandleConflictMarkers) {
12129 // Git/SVN conflict markers.
12130 EXPECT_EQ("int a;\n"
12131 "void f() {\n"
12132 " callme(some(parameter1,\n"
12133 "<<<<<<< text by the vcs\n"
12134 " parameter2),\n"
12135 "||||||| text by the vcs\n"
12136 " parameter2),\n"
12137 " parameter3,\n"
12138 "======= text by the vcs\n"
12139 " parameter2, parameter3),\n"
12140 ">>>>>>> text by the vcs\n"
12141 " otherparameter);\n",
12142 format("int a;\n"
12143 "void f() {\n"
12144 " callme(some(parameter1,\n"
12145 "<<<<<<< text by the vcs\n"
12146 " parameter2),\n"
12147 "||||||| text by the vcs\n"
12148 " parameter2),\n"
12149 " parameter3,\n"
12150 "======= text by the vcs\n"
12151 " parameter2,\n"
12152 " parameter3),\n"
12153 ">>>>>>> text by the vcs\n"
12154 " otherparameter);\n"));
12155
12156 // Perforce markers.
12157 EXPECT_EQ("void f() {\n"
12158 " function(\n"
12159 ">>>> text by the vcs\n"
12160 " parameter,\n"
12161 "==== text by the vcs\n"
12162 " parameter,\n"
12163 "==== text by the vcs\n"
12164 " parameter,\n"
12165 "<<<< text by the vcs\n"
12166 " parameter);\n",
12167 format("void f() {\n"
12168 " function(\n"
12169 ">>>> text by the vcs\n"
12170 " parameter,\n"
12171 "==== text by the vcs\n"
12172 " parameter,\n"
12173 "==== text by the vcs\n"
12174 " parameter,\n"
12175 "<<<< text by the vcs\n"
12176 " parameter);\n"));
12177
12178 EXPECT_EQ("<<<<<<<\n"
12179 "|||||||\n"
12180 "=======\n"
12181 ">>>>>>>",
12182 format("<<<<<<<\n"
12183 "|||||||\n"
12184 "=======\n"
12185 ">>>>>>>"));
12186
12187 EXPECT_EQ("<<<<<<<\n"
12188 "|||||||\n"
12189 "int i;\n"
12190 "=======\n"
12191 ">>>>>>>",
12192 format("<<<<<<<\n"
12193 "|||||||\n"
12194 "int i;\n"
12195 "=======\n"
12196 ">>>>>>>"));
12197
12198 // FIXME: Handle parsing of macros around conflict markers correctly:
12199 EXPECT_EQ("#define Macro \\\n"
12200 "<<<<<<<\n"
12201 "Something \\\n"
12202 "|||||||\n"
12203 "Else \\\n"
12204 "=======\n"
12205 "Other \\\n"
12206 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000012207 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000012208 format("#define Macro \\\n"
12209 "<<<<<<<\n"
12210 " Something \\\n"
12211 "|||||||\n"
12212 " Else \\\n"
12213 "=======\n"
12214 " Other \\\n"
12215 ">>>>>>>\n"
12216 " End\n"
12217 "int i;\n"));
12218}
12219
Daniel Jasper471894432014-08-06 13:40:26 +000012220TEST_F(FormatTest, DisableRegions) {
12221 EXPECT_EQ("int i;\n"
12222 "// clang-format off\n"
12223 " int j;\n"
12224 "// clang-format on\n"
12225 "int k;",
12226 format(" int i;\n"
12227 " // clang-format off\n"
12228 " int j;\n"
12229 " // clang-format on\n"
12230 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000012231 EXPECT_EQ("int i;\n"
12232 "/* clang-format off */\n"
12233 " int j;\n"
12234 "/* clang-format on */\n"
12235 "int k;",
12236 format(" int i;\n"
12237 " /* clang-format off */\n"
12238 " int j;\n"
12239 " /* clang-format on */\n"
12240 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000012241
12242 // Don't reflow comments within disabled regions.
12243 EXPECT_EQ(
12244 "// clang-format off\n"
12245 "// long long long long long long line\n"
12246 "/* clang-format on */\n"
12247 "/* long long long\n"
12248 " * long long long\n"
12249 " * line */\n"
12250 "int i;\n"
12251 "/* clang-format off */\n"
12252 "/* long long long long long long line */\n",
12253 format("// clang-format off\n"
12254 "// long long long long long long line\n"
12255 "/* clang-format on */\n"
12256 "/* long long long long long long line */\n"
12257 "int i;\n"
12258 "/* clang-format off */\n"
12259 "/* long long long long long long line */\n",
12260 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000012261}
12262
Manuel Klimekf0c95b32015-06-11 10:14:13 +000012263TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
12264 format("? ) =");
12265 verifyNoCrash("#define a\\\n /**/}");
12266}
Manuel Klimek5f594f82014-08-13 14:00:41 +000012267
Daniel Jasper498f5582015-12-25 08:53:31 +000012268TEST_F(FormatTest, FormatsTableGenCode) {
12269 FormatStyle Style = getLLVMStyle();
12270 Style.Language = FormatStyle::LK_TableGen;
12271 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
12272}
12273
Nico Weberb2673a12016-11-10 21:49:25 +000012274TEST_F(FormatTest, ArrayOfTemplates) {
12275 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
12276 format("auto a = new unique_ptr<int > [ 10];"));
12277
12278 FormatStyle Spaces = getLLVMStyle();
12279 Spaces.SpacesInSquareBrackets = true;
12280 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
12281 format("auto a = new unique_ptr<int > [10];", Spaces));
12282}
12283
12284TEST_F(FormatTest, ArrayAsTemplateType) {
12285 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
12286 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
12287
12288 FormatStyle Spaces = getLLVMStyle();
12289 Spaces.SpacesInSquareBrackets = true;
12290 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
12291 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
12292}
12293
Martin Probstc9c51c42017-03-16 10:21:35 +000012294TEST_F(FormatTest, NoSpaceAfterSuper) {
12295 verifyFormat("__super::FooBar();");
12296}
12297
Ben Hamilton07e58362018-02-21 21:27:27 +000012298TEST(FormatStyle, GetStyleWithEmptyFileName) {
Bjorn Pettersson0b2f7742018-02-26 14:14:11 +000012299 vfs::InMemoryFileSystem FS;
12300 auto Style1 = getStyle("file", "", "Google", "", &FS);
Ben Hamilton07e58362018-02-21 21:27:27 +000012301 ASSERT_TRUE((bool)Style1);
12302 ASSERT_EQ(*Style1, getGoogleStyle());
12303}
12304
Eric Liu547d8792016-03-24 13:22:42 +000012305TEST(FormatStyle, GetStyleOfFile) {
12306 vfs::InMemoryFileSystem FS;
12307 // Test 1: format file in the same directory.
12308 ASSERT_TRUE(
12309 FS.addFile("/a/.clang-format", 0,
12310 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
12311 ASSERT_TRUE(
12312 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012313 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012314 ASSERT_TRUE((bool)Style1);
12315 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000012316
Antonio Maiorano7eb75072017-01-20 01:22:42 +000012317 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000012318 ASSERT_TRUE(
12319 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012320 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012321 ASSERT_TRUE((bool)Style2);
12322 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000012323
Antonio Maiorano7eb75072017-01-20 01:22:42 +000012324 // Test 2.2: no format on 'none' fallback style.
12325 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
12326 ASSERT_TRUE((bool)Style2);
12327 ASSERT_EQ(*Style2, getNoStyle());
12328
12329 // Test 2.3: format if config is found with no based style while fallback is
12330 // 'none'.
12331 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
12332 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
12333 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
12334 ASSERT_TRUE((bool)Style2);
12335 ASSERT_EQ(*Style2, getLLVMStyle());
12336
12337 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
12338 Style2 = getStyle("{}", "a.h", "none", "", &FS);
12339 ASSERT_TRUE((bool)Style2);
12340 ASSERT_EQ(*Style2, getLLVMStyle());
12341
Eric Liu547d8792016-03-24 13:22:42 +000012342 // Test 3: format file in parent directory.
12343 ASSERT_TRUE(
12344 FS.addFile("/c/.clang-format", 0,
12345 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
12346 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
12347 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000012348 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000012349 ASSERT_TRUE((bool)Style3);
12350 ASSERT_EQ(*Style3, getGoogleStyle());
12351
12352 // Test 4: error on invalid fallback style
12353 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
12354 ASSERT_FALSE((bool)Style4);
12355 llvm::consumeError(Style4.takeError());
12356
12357 // Test 5: error on invalid yaml on command line
12358 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
12359 ASSERT_FALSE((bool)Style5);
12360 llvm::consumeError(Style5.takeError());
12361
12362 // Test 6: error on invalid style
12363 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
12364 ASSERT_FALSE((bool)Style6);
12365 llvm::consumeError(Style6.takeError());
12366
12367 // Test 7: found config file, error on parsing it
12368 ASSERT_TRUE(
12369 FS.addFile("/d/.clang-format", 0,
12370 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
12371 "InvalidKey: InvalidValue")));
12372 ASSERT_TRUE(
12373 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
12374 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
12375 ASSERT_FALSE((bool)Style7);
12376 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000012377}
12378
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012379TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
12380 // Column limit is 20.
12381 std::string Code = "Type *a =\n"
12382 " new Type();\n"
12383 "g(iiiii, 0, jjjjj,\n"
12384 " 0, kkkkk, 0, mm);\n"
12385 "int bad = format ;";
12386 std::string Expected = "auto a = new Type();\n"
12387 "g(iiiii, nullptr,\n"
12388 " jjjjj, nullptr,\n"
12389 " kkkkk, nullptr,\n"
12390 " mm);\n"
12391 "int bad = format ;";
12392 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000012393 tooling::Replacements Replaces = toReplacements(
12394 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
12395 "auto "),
12396 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
12397 "nullptr"),
12398 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
12399 "nullptr"),
12400 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
12401 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012402
12403 format::FormatStyle Style = format::getLLVMStyle();
12404 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000012405 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
12406 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
12407 << llvm::toString(FormattedReplaces.takeError()) << "\n";
12408 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12409 EXPECT_TRUE(static_cast<bool>(Result));
12410 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000012411}
12412
Eric Liubaf58c22016-05-18 13:43:48 +000012413TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
12414 std::string Code = "#include \"a.h\"\n"
12415 "#include \"c.h\"\n"
12416 "\n"
12417 "int main() {\n"
12418 " return 0;\n"
12419 "}";
12420 std::string Expected = "#include \"a.h\"\n"
12421 "#include \"b.h\"\n"
12422 "#include \"c.h\"\n"
12423 "\n"
12424 "int main() {\n"
12425 " return 0;\n"
12426 "}";
12427 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000012428 tooling::Replacements Replaces = toReplacements(
12429 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
12430 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000012431
12432 format::FormatStyle Style = format::getLLVMStyle();
12433 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000012434 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
12435 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
12436 << llvm::toString(FormattedReplaces.takeError()) << "\n";
12437 auto Result = applyAllReplacements(Code, *FormattedReplaces);
12438 EXPECT_TRUE(static_cast<bool>(Result));
12439 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000012440}
12441
Krasimir Georgievac16a202017-06-23 11:46:03 +000012442TEST_F(FormatTest, FormatSortsUsingDeclarations) {
12443 EXPECT_EQ("using std::cin;\n"
12444 "using std::cout;",
12445 format("using std::cout;\n"
12446 "using std::cin;", getGoogleStyle()));
12447}
12448
Nico Weberdc065182017-04-05 18:10:42 +000012449TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
12450 format::FormatStyle Style = format::getLLVMStyle();
12451 Style.Standard = FormatStyle::LS_Cpp03;
12452 // cpp03 recognize this string as identifier u8 and literal character 'a'
12453 EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
12454}
12455
12456TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
12457 // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
12458 // all modes, including C++11, C++14 and C++17
12459 EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
12460}
12461
Krasimir Georgieva2e7d0d2017-08-29 13:51:38 +000012462TEST_F(FormatTest, DoNotFormatLikelyXml) {
12463 EXPECT_EQ("<!-- ;> -->",
12464 format("<!-- ;> -->", getGoogleStyle()));
12465 EXPECT_EQ(" <!-- >; -->",
12466 format(" <!-- >; -->", getGoogleStyle()));
12467}
12468
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012469TEST_F(FormatTest, StructuredBindings) {
12470 // Structured bindings is a C++17 feature.
12471 // all modes, including C++11, C++14 and C++17
12472 verifyFormat("auto [a, b] = f();");
12473 EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
12474 EXPECT_EQ("const auto [a, b] = f();", format("const auto[a, b] = f();"));
12475 EXPECT_EQ("auto const [a, b] = f();", format("auto const[a, b] = f();"));
12476 EXPECT_EQ("auto const volatile [a, b] = f();",
12477 format("auto const volatile[a, b] = f();"));
12478 EXPECT_EQ("auto [a, b, c] = f();", format("auto [ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012479 EXPECT_EQ("auto &[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012480 format("auto &[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012481 EXPECT_EQ("auto &&[a, b, c] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012482 format("auto &&[ a , b,c ] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012483 EXPECT_EQ("auto const &[a, b] = f();", format("auto const&[a, b] = f();"));
12484 EXPECT_EQ("auto const volatile &&[a, b] = f();",
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012485 format("auto const volatile &&[a, b] = f();"));
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012486 EXPECT_EQ("auto const &&[a, b] = f();", format("auto const && [a, b] = f();"));
12487 EXPECT_EQ("const auto &[a, b] = f();", format("const auto & [a, b] = f();"));
12488 EXPECT_EQ("const auto volatile &&[a, b] = f();",
12489 format("const auto volatile &&[a, b] = f();"));
12490 EXPECT_EQ("volatile const auto &&[a, b] = f();",
12491 format("volatile const auto &&[a, b] = f();"));
12492 EXPECT_EQ("const auto &&[a, b] = f();", format("const auto && [a, b] = f();"));
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012493
Manuel Klimeke411aa82017-09-20 09:29:37 +000012494 // Make sure we don't mistake structured bindings for lambdas.
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012495 FormatStyle PointerMiddle = getLLVMStyle();
12496 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
12497 verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
12498 verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
12499 verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
12500 verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
12501 verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
12502 verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
12503 verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
12504 verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
12505 verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
12506 verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
12507 verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
12508 verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
12509
12510 EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
12511 format("for (const auto && [a, b] : some_range) {\n}"));
12512 EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
12513 format("for (const auto & [a, b] : some_range) {\n}"));
12514 EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
12515 format("for (const auto[a, b] : some_range) {\n}"));
12516 EXPECT_EQ("auto [x, y](expr);", format("auto[x,y] (expr);"));
12517 EXPECT_EQ("auto &[x, y](expr);", format("auto & [x,y] (expr);"));
12518 EXPECT_EQ("auto &&[x, y](expr);", format("auto && [x,y] (expr);"));
12519 EXPECT_EQ("auto const &[x, y](expr);", format("auto const & [x,y] (expr);"));
12520 EXPECT_EQ("auto const &&[x, y](expr);", format("auto const && [x,y] (expr);"));
12521 EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y] {expr};"));
12522 EXPECT_EQ("auto const &[x, y]{expr};", format("auto const & [x,y] {expr};"));
12523 EXPECT_EQ("auto const &&[x, y]{expr};", format("auto const && [x,y] {expr};"));
Manuel Klimeke411aa82017-09-20 09:29:37 +000012524
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012525 format::FormatStyle Spaces = format::getLLVMStyle();
12526 Spaces.SpacesInSquareBrackets = true;
12527 verifyFormat("auto [ a, b ] = f();", Spaces);
Chih-Hung Hsieh30cd3012017-09-27 00:58:45 +000012528 verifyFormat("auto &&[ a, b ] = f();", Spaces);
12529 verifyFormat("auto &[ a, b ] = f();", Spaces);
12530 verifyFormat("auto const &&[ a, b ] = f();", Spaces);
12531 verifyFormat("auto const &[ a, b ] = f();", Spaces);
Marek Kurdejceeb8b92017-09-07 14:28:32 +000012532}
12533
Ben Hamilton6e066352018-02-27 15:56:40 +000012534TEST_F(FormatTest, FileAndCode) {
12535 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
12536 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
12537 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
12538 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
12539 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
Ben Hamiltonb1a79192018-04-12 15:11:53 +000012540 EXPECT_EQ(
12541 FormatStyle::LK_ObjC,
12542 guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
12543 EXPECT_EQ(FormatStyle::LK_ObjC,
12544 guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
12545 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
Ben Hamilton6e066352018-02-27 15:56:40 +000012546 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
12547 EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
Ben Hamilton19c782d2018-03-22 03:25:22 +000012548 EXPECT_EQ(FormatStyle::LK_ObjC,
12549 guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
12550 EXPECT_EQ(
12551 FormatStyle::LK_ObjC,
12552 guessLanguage("foo.h",
12553 "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
Ben Hamilton9dc78162018-04-03 14:07:11 +000012554 EXPECT_EQ(
12555 FormatStyle::LK_Cpp,
12556 guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
Ben Hamilton3b345c32018-02-21 15:54:31 +000012557}
12558
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012559TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
12560 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
12561 EXPECT_EQ(FormatStyle::LK_ObjC,
12562 guessLanguage("foo.h", "array[[calculator getIndex]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012563 EXPECT_EQ(FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012564 guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012565 EXPECT_EQ(
12566 FormatStyle::LK_Cpp,
Ben Hamiltonb060ad82018-03-12 15:42:38 +000012567 guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
12568 EXPECT_EQ(FormatStyle::LK_ObjC,
12569 guessLanguage("foo.h", "[[noreturn foo] bar];"));
12570 EXPECT_EQ(FormatStyle::LK_Cpp,
12571 guessLanguage("foo.h", "[[clang::fallthrough]];"));
12572 EXPECT_EQ(FormatStyle::LK_ObjC,
12573 guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
12574 EXPECT_EQ(FormatStyle::LK_Cpp,
12575 guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
12576 EXPECT_EQ(FormatStyle::LK_Cpp,
12577 guessLanguage("foo.h", "[[using clang: fallthrough]];"));
12578 EXPECT_EQ(FormatStyle::LK_ObjC,
12579 guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
12580 EXPECT_EQ(FormatStyle::LK_Cpp,
12581 guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
12582 EXPECT_EQ(
12583 FormatStyle::LK_Cpp,
12584 guessLanguage("foo.h",
12585 "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
12586 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
Ben Hamilton1d6c6ee2018-03-06 17:21:42 +000012587}
12588
Ben Hamilton788a2222018-03-12 15:42:40 +000012589TEST_F(FormatTest, GuessLanguageWithCaret) {
12590 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
12591 EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
12592 EXPECT_EQ(FormatStyle::LK_ObjC,
12593 guessLanguage("foo.h", "int(^)(char, float);"));
12594 EXPECT_EQ(FormatStyle::LK_ObjC,
12595 guessLanguage("foo.h", "int(^foo)(char, float);"));
12596 EXPECT_EQ(FormatStyle::LK_ObjC,
12597 guessLanguage("foo.h", "int(^foo[10])(char, float);"));
12598 EXPECT_EQ(FormatStyle::LK_ObjC,
12599 guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
12600 EXPECT_EQ(
12601 FormatStyle::LK_ObjC,
12602 guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
12603}
12604
Ben Hamilton6432afe2018-03-22 17:37:19 +000012605TEST_F(FormatTest, GuessLanguageWithChildLines) {
12606 EXPECT_EQ(FormatStyle::LK_Cpp,
12607 guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
12608 EXPECT_EQ(FormatStyle::LK_ObjC,
12609 guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
Ben Hamiltonea7a27b2018-03-27 15:01:21 +000012610 EXPECT_EQ(
12611 FormatStyle::LK_Cpp,
12612 guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
12613 EXPECT_EQ(
12614 FormatStyle::LK_ObjC,
12615 guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
Ben Hamilton6432afe2018-03-22 17:37:19 +000012616}
12617
Daniel Jasperd246a5a2015-06-15 15:25:11 +000012618} // end namespace
12619} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000012620} // end namespace clang